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

时间:2020-03-02 13:37:01

标签: laravel swiftmailer amazon-ses laravel-queue

使用Amazon SES和仅使用SMTP驱动程序发送邮件时,队列作业频繁出现Swift_TransportException: Expected response code 250 but got an empty response。这种情况是间歇性发生的,但是一旦出现初始错误,似乎会导致我们所有的邮件停止发送-重新启动队列工作器可以解决该问题,但不可避免地会间歇性地再次出现该问题。

我们考虑过的一些事情:

  • 可能是亚马逊节流吗?根据使用情况,我们似乎并没有受到限制。
  • 连接断开并且Laravel / SwiftMail无法正确重新连接?
  • 从SMTP驱动程序切换到SES驱动程序-尽管在我们理解为什么首先要得到此错误之前,我们并不完全愿意这样做。

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

1 个答案:

答案 0 :(得分:0)

因此,似乎我们在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');
        }
    });
}