我们上周已将应用程序升级到 Laravel 9,并注意到在生产中部署构建后立即出现了大量失败的作业。
这些错误都是与以下错误消息相关的电子邮件:
Expected response code "250" but got code "451", with message "451 4.4.2 Timeout waiting for data from client.".
我们已经恢复到之前的版本(使用 SwiftMailer)并且错误停止了。澄清一下,我们已经运行该应用程序几周了,之前从未出现过该错误。
在“Staging”中我们没有这个问题。唯一的区别是我们在 live 和 set 中使用 SQS 进行队列:
APP_ENV=production
APP_DEBUG=false
这是唯一的区别。
您可以尝试将
'ping_threshold' => 10,
添加到 smtp
中的
ses
或
config/mail.php
配置吗
如果您使用队列工作器/管理器,请记住重新启动进程以使新配置生效。
这似乎已经解决了我的问题。 可能是巧合,但如果问题再次出现,我们会报告。
按照上述答案https://stackoverflow.com/a/71530024/16046216中的建议,在
'ping_threshold' => 10
中设置config/mail.php
对我有用。
但是,请勿将其添加到
mailers
或 smtp
的 ses
配置中。将其添加到配置文件中的根级别(与添加 mailers
或 log_channel
的级别相同)。请参阅以下 Laravel 项目中 config/mail.php
配置的快照:
<?php
return [
...
/*
|--------------------------------------------------------------------------
| Mailer Configurations
|--------------------------------------------------------------------------
|
*/
'mailers' => [
'smtp' = [
...
],
...
],
...
/*
|--------------------------------------------------------------------------
| Transport Settings
|--------------------------------------------------------------------------
|
*/
'ping_threshold' => 10,
];
调试后我发现了如何在
\Symfony\Component\Mailer\Transport\Smtp\EsmtpTransportFactory
和\Illuminate\Mail\MailManager::createSmtpTransport()
中读取和设置配置选项。
从 8.x 升级到 Laravel 9.x 后,我们在生产服务器上经常遇到此错误。在服务器上,电子邮件使用后台队列 (SQS) 服务通过 SES 发送。
niranjan 的方法在 Laravel 9 上不起作用,如果你转储 $dsn->getOption('ping_threshold') (EsmtpTransportFactory 第 63 行),它会得到 null,而 ping_threshold 位于 'smtp' 内,它会正确得到 10。