首页 > 解决方案 > 向用户发送批量电子邮件时出错:此连接中的邮件太多 laravel 5.2

问题描述

我正在尝试向订阅者发送大量电子邮件(大约 5000 封)。我正在密件抄送和 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:queue 或 Mail:send 循环如下:

$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,共享主机

请帮助解决这个问题。让我知道是否需要更多详细信息。

标签: phplaravellaravel-5

解决方案


1) a) Exim 有一个设置“smtp_accept_max”,它限制每个连接允许的消息数量。如果您使用 WHM,您可以在 exim 配置管理器 -> 高级编辑器中更改它。我的设置为2000

wm 中的描述:

此选项指定 Exim 将接受的同时传入 SMTP 呼叫的最大数量。它仅适用于监听守护进程;当 inetd 处理传入的 SMTP 时,没有控制(在 Exim 中)。如果该值设置为零,则不应用任何限制。但是,如果设置了 smtp_accept_max_per_host 或 smtp_accept_queue,则它必须非零。另请参见 smtp_accept_reserve 和 smtp_load_reserve。

如果已达到 smtp_accept_max 限制,则会立即拒绝新的 SMTP 连接。如果不是,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 替换为您在 exim 中设置的 smtp_accept_max 值。

2)我使用上述设置(但 Laravel 5.5)和数据库队列驱动程序发送批量邮件。工作正常 :)


推荐阅读