Наши электронные письма не удается отправить с помощью Laravel с очередью Redis.
Код, который вызывает ошибку: ->onQueue('emails')
$job = (new SendNewEmail($sender, $recipients))->onQueue('emails');
$job_result = $this->dispatch($job);
В сочетании с этим в работе:
use InteractsWithQueue;
Наше сообщение об ошибке:
Feb 09 17:15:57 laravel: message repeated 7947 times: [ production.ERROR: exception 'Swift_TransportException' with message 'Expected response code 354 but got code "550", with message "550 5.7.0 Requested action not taken: too many emails per second "' in /home/laravel/app/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/AbstractSmtpTransport.php:383 Stack trace: #0 /home/laravel/app/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/AbstractSmtpTransport.php(281):
Наша ошибка происходит только с использованием Sendgrid, а не Mailtrap, который подделывает отправку по электронной почте. Я говорил с Sendgrid, и электронные письма никогда не касались их серверов, и их служба была полностью активна, когда произошла моя ошибка. Итак, ошибка, кажется, на моем конце.
Какие-нибудь мысли?
Похоже только Mailtrap отправляет эту ошибку, поэтому либо откройте другую учетную запись, либо перейдите на платный тариф.
Может быть, вы должны убедиться, что это действительно было отправлено через Sendgrid, а не mailtrap. Их жесткое ограничение скорости в настоящее время составляет 3 000 запросов в секунду против 3 запросов в секунду для mailtrap в бесплатном плане 🙂
Только для отладки!
Если вы не ожидаете более 5 писем и не можете изменить mailtrap, пытаться:
foreach ($emails as $email) {
...
Mail::send(... $email);
if(env('MAIL_HOST', false) == 'smtp.mailtrap.io'){
sleep(1); //use usleep(500000) for half a second or less
}
}
С помощью спать() это действительно плохая практика. Теоретически этот код должен выполняться только в тестовой среде или в режиме отладки.
Я наконец-то понял, как настроить приложение Laravel для регулирования почты на основе конфигурации.
в boot()
функция AppServiceProvider
,
$throttleRate = config('mail.throttleToMessagesPerMin');
if ($throttleRate) {
$throttlerPlugin = new \Swift_Plugins_ThrottlerPlugin($throttleRate, \Swift_Plugins_ThrottlerPlugin::MESSAGES_PER_MINUTE);
Mail::getSwiftMailer()->registerPlugin($throttlerPlugin);
}
В config/mail.php
, добавьте эту строку:
'throttleToMessagesPerMin' => env('MAIL_THROTTLE_TO_MESSAGES_PER_MIN', null), //https://mailtrap.io has a rate limit of 2 emails/sec per inbox, but consider being even more conservative.
В вашем .env
файлы, добавьте строку как:
MAIL_THROTTLE_TO_MESSAGES_PER_MIN=50
Единственная проблема заключается в том, что это не влияет на почту, отправленную через later()
функционировать, если QUEUE_DRIVER=sync
,