私たちのメールは、RedisキューでLaravelを使用して送信できません。
エラーをトリガーするコードは次のとおりです:->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を使用した場合にのみ発生し、メールトラップを使用してメール送信を偽装しています。私はSendgridと話しましたが、メールがサーバーに届かず、エラーが発生したときにサービスが完全にアクティブでした。したがって、エラーは私の側にあるようです。
何かご意見は?
Mailtrap だけがこのエラーを送信するようですので、別のアカウントを開くか、有料プランにアップグレードしてください。
最終的に、Laravelアプリを設定に基づいてメールをスロットルするように設定する方法を見つけました。
AppServiceProvider
のboot()
関数では、
_$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
_
唯一の問題は、_QUEUE_DRIVER=sync
_の場合、later()
関数を介して送信されるメールには影響しないようです。
メールトラップではなく、Sendgridを介して送信されたことを確認する必要があります。現在、ハードレート制限は、無料プランでのメールトラップの1秒あたり3リクエストに対して、1秒あたり3kリクエストのようです。
emails
キューをレート制限する必要があります。
「公式」の方法は、セットアップ Redisキュードライバー です。しかし、それは困難で時間がかかります。
したがって、カスタムキューワーカー mxl/laravel-queue-rate-limit を使用して、Illuminate\Cache\RateLimiter
を使用してジョブの実行をレート制限します(Laravelが内部で使用するものと同じもの) HTTPリクエストのレート制限 )。
config/queue.php
で、emails
キューのレート制限を指定します(たとえば、1秒あたり2通のメール):
'rateLimit' => [
'emails' => [
'allows' => 2,
'every' => 1
]
]
そして、このキューのワーカーを実行します:
$ php artisan queue:work --queue emails
sleep(5)
を使用して5秒間待機してから、メールトラップを再度使用しました。