web-dev-qa-db-ja.com

Laravelキュー550エラーの電子メール(1秒あたりの電子メールが多すぎる)

私たちのメールは、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と話しましたが、メールがサーバーに届かず、エラーが発生したときにサービスが完全にアクティブでした。したがって、エラーは私の側にあるようです。

何かご意見は?

9
tim peterson

Mailtrap だけがこのエラーを送信するようですので、別のアカウントを開くか、有料プランにアップグレードしてください。

19
Dorian

最終的に、Laravelアプリを設定に基づいてメールをスロットルするように設定する方法を見つけました。

AppServiceProviderboot()関数では、

_$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()関数を介して送信されるメールには影響しないようです。

5
Ryan

メールトラップではなく、Sendgridを介して送信されたことを確認する必要があります。現在、ハードレート制限は、無料プランでのメールトラップの1秒あたり3リクエストに対して、1秒あたり3kリクエストのようです。

3
Bachet

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
0
mixel

sleep(5)を使用して5秒間待機してから、メールトラップを再度使用しました。

0
Gjaa