Swift_TransportException: ожидался код ответа 250, но время от времени получал пустой ответ в обработчике очереди с использованием Amazon SES.

Мы часто сталкиваемся с Swift_TransportException: Expected response code 250 but got an empty response из заданий в очереди при отправке почты с помощью Amazon SES и просто с помощью драйвера SMTP. Это происходит время от времени, но, по-видимому, все наши письма перестают отправляться после возникновения первоначальной ошибки — перезапуск обработчика очереди исправляет это, но неизбежно проблема периодически повторяется.

Некоторые вещи, которые мы рассмотрели:

  • Возможно, Amazon дросселирует? Мы, кажется, не дросселируемы, хотя в зависимости от нашего использования.
  • Разрыв соединения и неправильное повторное подключение Laravel/SwiftMail?
  • Переключение с SMTP-драйвера на SES-драйвер — хотя мы не хотим полностью фиксировать это, пока не поймем, почему мы получаем эту ошибку в первую очередь.

Примечание: искал другие проблемы здесь, в Stackoverflow, но они были больше связаны с ошибками конфигурации - эта проблема не в том, что почта не работает, а в прерывистом сбое.


person Gary Green    schedule 02.03.2020    source источник


Ответы (1)


Таким образом, похоже, что мы, возможно, слишком быстро отправляем почту на Amazon SES, что вызывает какую-то прерывистую проблему с подключением — мы исправили это, добавив delay к нашим заданиям в очереди:

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

Задержка используется всякий раз, когда задание терпит неудачу, оно будет пытаться повторить попытку снова после задержки, поэтому в приведенной выше команде при сбое задания оно будет повторяться через 30 секунд. В то же время другие задания все еще могут обрабатываться из очереди, и по истечении 30 секунд это задание будет снова извлечено и повторено.

По умолчанию Laravel имеет задержку из 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');
        }
    });
}
person Gary Green    schedule 05.03.2020
comment
Привет, Гэри, спасибо, что опубликовал это. У меня такая же проблема с Mailgun. Кажется, это происходит примерно раз в 500 писем или около того. Я реализовал ваше решение задержки 30 с. Нет успеха. Хотите знать, если вы все еще испытываете это, или это решено для вас? Мы будем очень признательны за любое дальнейшее понимание. Спасибо! - person Two Piers; 10.04.2020