php - 向用户发送批量电子邮件时出错:此连接中的邮件太多 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"
如何解决上述问题?
向用户发送批量电子邮件的最佳方式是什么?
第二个问题:哪一个是最好的方法。如上所述 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,共享主机
请帮助解决这个问题。让我知道是否需要更多详细信息。
解决方案
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)和数据库队列驱动程序发送批量邮件。工作正常 :)
推荐阅读
- android - 安装时未请求 Android 权限
- css - CSS - 将 div 淡入背景图像
- racket - Racket 中的表单验证
- c++ - 解决模板成员函数重载
- java - 使用数据文件进行 Junit 测试
- android - 如何在 RecyclerView 中使可点击项目的焦点区域为非矩形
- asp.net-mvc - 为什么我在 aspnet core 中的 IIS 上发布时授权失败?
- homebrew - 错误:木桶“java7”不可用:不存在同名木桶
- php - Paypal 使用 PHP cURL 获取订阅详细信息
- python - mosquitto_pub 在 crontab -e 时不发布,但在终端中运行相同的脚本时执行