Swift_TransportException:预期响应代码 250,但在使用 Amazon SES 的队列工作程序中间歇性地得到空响应

Swift_TransportException: Expected response code 250 but got an empty response intermittently in queue worker using Amazon SES

我们在使用 Amazon SES 和仅使用 SMTP 驱动程序发送邮件时经常遇到来自排队作业的 Swift_TransportException: Expected response code 250 but got an empty response。这种情况会间歇性发生,但似乎会导致我们所有的邮件在初始错误发生后停止发送 - 重新启动队列工作程序可以修复它,但不可避免地会间歇性地再次发生该问题。

我们考虑过的一些事情:

注意:在 Whosebug 上搜索了其他问题,但它们更多地与配置错误有关 - 这个问题不是关于邮件直接无法正常工作,而是关于间歇性故障。

看来我们在 Amazon SES 上发送邮件的速度可能太快,导致了某种间歇性连接问题 - 我们已通过向排队的作业添加 delay 来解决此问题:

php artisan queue:work --sleep=3 --tries=3 --delay=30

每当作业失败时都会使用延迟,它会在延迟后尝试重试 - 所以在上面的命令中,当作业失败时它会在 30 秒后重试。与此同时,其他作业仍然可以从队列中处理,一旦 30 秒结束,它将再次拉出该作业并重试。

默认情况下 Laravel has a delay of 0 这意味着一旦作业失败,它会立即尝试重试,这很可能是导致问题的原因,因为在大多数情况下,理想情况下您希望有一段宽限期重试失败的作业。

除此之外,我们还设置了一个小事件,用于监听有关此 SwiftMailer 异常的异常抛出,它将报告异常,稍等片刻,然后重新启动队列工作程序(优雅地)这意味着下一次尝试从队列中取出作业时,它将重新启动整个过程 - 虽然这对我们来说还没有触发,但如果您遇到长 运行 的间歇性连接问题,它可能会很有用进程。

// Added in `AppServiceProvider` under `boot` function
if ($this->app->runningInConsole()) {
    $this->app['queue']->failing(function (\Illuminate\Queue\Events\JobFailed $event) {
        if (strpos($event->exception, 'response code 250')) {
            report(new \Exception('Got swift 250 error, restarting queue.'));

            sleep(5);
            \Artisan::call('queue:restart');
        }
    });
}