LaravelからGoogleWorkspace(旧GSuite)の機能であるGoogleのSMTPリレーサーバを利用してメールを送信しようとした際にこんなエラーに遭遇した。
GoogleのSMTPサーバは送信するメールのSpam/Virusチェックも行ってくれる優れもの。
Expected response code 250 but got an empty response
# php artisan tinker
Psy Shell v0.10.8 (PHP 7.4.15 ― cli) by Justin Hileman
>>> Mail::raw('Test Mail', function($message) { $message->to('宛先ユーザ@宛先ドメイン')->subject('test'); });
Swift_TransportException with message 'Expected response code 250 but got an empty response'
>>>
421 4.7.0 Try again later, closing connection.
上記Mail::rawを用いたメール送信検証を行う裏でパケットキャプチャして解析してみたところ、接続先のGoogle側からは以下の応答が帰ってきていた
421 4.7.0 Try again later, closing connection.
ググってみると、こちらのページにたどり着き以下の内容が確認できた。
421, “4.7.0”, Try again later, closing connection.(421, “4.7.0”, しばらくしてからもう一度お試しください。接続を閉じます。)通常は HELO のステージで SMTP リレーへのサービス拒否(DoS)攻撃を受けていることを意味します。
つまりは、メール通信の中で送信サーバに接続した際に挨拶として送っている”EHLO”の動作が問題になっている可能性がある。
原因は EHLO [127.0.0.1]
上記を参考に、キャプチャした内容をさらに確認してみると以下の文字列を確認できた。
EHLO [127.0.0.1]
試しにopensslコマンドを用いて上記文字列でのあいさつを検証をしてみた。
やはりこの挨拶が原因で切断されていることが確認できた。
# openssl s_client -quiet -connect smtp-relay.gmail.com:587 -starttls smtp -crlf depth=2 OU = GlobalSign Root CA - R2, O = GlobalSign, CN = GlobalSign verify return:1 depth=1 C = US, O = Google Trust Services, CN = GTS CA 1O1 verify return:1 depth=0 C = US, ST = California, L = Mountain View, O = Google LLC, CN = smtp-relay.gmail.com verify return:1 250 SMTPUTF8 EHLO [127.0.0.1] 421 4.7.0 Try again later, closing connection. (EHLO) t202sm989881oot.4 - gsmtp read:errno=0 #
この挨拶に利用される文字列を変更すれば解決することは、opensslコマンドを使った検証で裏が取れた。
# openssl s_client -quiet -connect smtp-relay.gmail.com:587 -starttls smtp -crlf
depth=2 OU = GlobalSign Root CA - R2, O = GlobalSign, CN = GlobalSign
verify return:1
depth=1 C = US, O = Google Trust Services, CN = GTS CA 1O1
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google LLC, CN = smtp-relay.gmail.com
verify return:1
250 SMTPUTF8
EHLO smtp-relay.gmail.com
250-smtp-relay.gmail.com at your service, [126.77.119.42]
250-SIZE 157286400
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
quit
221 2.0.0 closing connection u4sm1010932oot.0 - gsmtp
read:errno=0
解決方法
ぶっちゃけLaravelは詳しくないが、参考サイトに従い下記設定を行ったところ「EHLO」で宣言するホスト名を定義することができた。
設定ファイル:./config/mail.php
'default' => env('MAIL_MAILER', 'smtp'),
'mailers' => [
'smtp' => [
'transport' => 'smtp',
'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
'port' => env('MAIL_PORT', 587),
'encryption' => env('MAIL_ENCRYPTION', 'tls'),
'username' => env('MAIL_USERNAME'),
'password' => env('MAIL_PASSWORD'),
'timeout' => null,
'auth_mode' => null,
'local_domain' => env('MAIL_HOST'),
],
コメント