Ошибка при отправке массовых писем пользователям: слишком много сообщений в этой связи laravel 5.2 - PullRequest
0 голосов
/ 11 января 2020

Я пытаюсь отправить массовую электронную почту (около 5000) подписчику. Я отправляю все письма в B CC и Mail :: queue (). Я запускаю команду из консоли для запуска электронной почты.

try {
$bccEmails = ['test@test.com', 'xyz@gmail.com', 'abc@gmail.com', 'anb@hotmail.com', 'xyzz@yahoo.com'];

Mail::queue('Emails.Newsletter', $data, 
    function ($message) use ($bccEmails, $subject) {

      $message->from('no-reply@test.com', 'xyz.com')
              ->bcc($bccEmails)
              ->replyTo($this->adminEmail, $this->adminName)
              ->subject($subject);
});

} catch (Exception $ex) {
   Log::info("Email sending error: ".$ex->getMessage());
}

Но я получаю ошибку, как показано ниже:

"Expected response code 250 but got code "421", with message "421 too many messages in this connection"

  1. Как решить вышеуказанную проблему?

  2. Каков наилучший способ отправки массовых писем пользователям?

Второй вопрос : какой из них лучший подход. Как упоминалось выше, Mail: очередь или Mail: отправьте в l oop, как показано ниже:

$toEmails = ['test@test.com', 'xyz@gmail.com', 'abc@gmail.com', 'anb@hotmail.com', 'xyzz@yahoo.com'];

foreach ($toEmails as $key => $email) {

   try {
    Mail::send('Emails.Newsletter', $data, 
    function ($message) use ($email, $subject) {

      $message->from('no-reply@test.com', 'xyz.com')
              ->to($email)
              ->replyTo($this->adminEmail, $this->adminName)
              ->subject($subject);
    });

  } catch (Exception $ex) {
    Log::info("Email sending error: ".$ex->getMessage());
    // If failed continue sending next email
  }

} 

Использование: Laravel 5.2, Общий хостинг

Пожалуйста, помогите в этом. Дайте мне знать, если потребуется дополнительная информация.

1 Ответ

0 голосов
/ 11 января 2020

1) а) В exim есть настройка smtp_accept_max, которая ограничивает количество сообщений, разрешенных для одного соединения. Если вы используете WHM, вы можете изменить это в менеджере конфигурации exim -> расширенный редактор. У меня установлено значение 2000

Описание в whm:

Эта опция указывает максимальное количество одновременных входящих вызовов SMTP, которые Exim будет принимать. Это относится только к слушающему демону; нет никакого контроля (в exim), когда входящий SMTP обрабатывается inetd. Если значение установлено равным нулю, ограничение не применяется. Тем не менее, он должен быть ненулевым, если установлен smtp_accept_max_per_host или smtp_accept_queue. См. Также smtp_accept_reserve и smtp_load_reserve.

Новое SMTP-соединение немедленно отклоняется, если достигнут предел smtp_accept_max. Если нет, exim сначала проверяет smtp_accept_max_per_host. Если этот предел не был достигнут для клиентского хоста, то smtp_accept_reserve и smtp_load_reserve затем проверяются перед тем, как принимать соединение.

b) В Laravel метод загрузки AppServiceProvider добавьте следующее, чтобы оно выглядело так:

public function boot()
{
    \Mail::getSwiftMailer()->registerPlugin(new \Swift_Plugins_AntiFloodPlugin(2000, 1));
}

это приведет к отключению SwiftMailer, приостановке на 1 секунду и повторному подключению после отправки 2000 сообщений.

По сути, просто замените 2000 на значение smtp_accept_max, установленное вами в exim.

2) Я отправляю массовую почту с вышеописанной настройкой (Но Laravel 5.5) и драйвером очереди базы данных. Работает отлично :)

...