経緯
LaravelからAmazon SESへの接続がタイムアウトしたりエラーになって試行錯誤したときのメモです。
環境は下記の通り。SESはAPI経由でもよいですが、ひとまずSMTPで設定してみることにしました。
- 基盤構成: EC2 → Amazon SES
- PHPフレームワーク: Laravel 8.x
試行錯誤してるときに出たエラーたち
いずれもポートの設定などを誤っているために出力されていたものです。
(Swift_IoException(code: 0): Connection to tcp://email-smtp.ap-northeast-1.amazonaws.com:465 Timed Out at /***********************/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/StreamBuffer.php:166
ERROR: Expected response code 220 but got code "", with message
ERROR: Failed to authenticate on SMTP server with username "***********" using 2 possible authenticators. Authenticator LOGIN returned Expected response code 334 but got code "530", with message "530 Must issue a STARTTLS command first.
Amazon SESの画面
先達の知恵を借りつつもAWSドキュメントなどにあたって調べてみたものの何が問題かがぱっとわからず。
AWSコンソールのデザイン変更で、参考例のキャプチャの項目が見当たらず困るのは日常茶飯事ですが、
今回もSMTPの設定項目がどこにあるかがわからず時間を取られました。
2022/01現在のコンソール設定では「Account dashboard」の中段に、エンドポイントやポートが表示されている模様です。
EC2では25番ポートはデフォルトで使用できず、申請が必要になるので、他のポートを使用することにしました。
SMTPで接続したいIAMユーザ設定がまだない場合は「Create SMTP credentials」から、ユーザ名を指定するだけで簡単にID/PWの接続情報を作成できます。
PORTとENCRYPTIONの関係性
試行錯誤したのは結局ここでした。
STARTTLSのポートでは tls
、TLSのポートでは ssl
で指定するとうまくいきそうでした。
MAIL_PORT | MAIL_ENCRYPTION |
---|---|
465 | ssl |
2465 | ssl |
587 | tls |
2587 | tls |
Laravelの.env設定例
EC2からセキュリティグループのアウトバンドで対象ポートを絞っていなければ、下記の設定で疎通できました。
MAIL_DRIVER=smtp
MAIL_HOST=email-smtp.ap-northeast-1.amazonaws.com
MAIL_PORT=465
MAIL_ENCRYPTION=ssl
または
MAIL_DRIVER=smtp
MAIL_HOST=email-smtp.ap-northeast-1.amazonaws.com
MAIL_PORT=587
MAIL_ENCRYPTION=tls
書き換えたあとは設定キャッシュをリフレッシュして反映し、疎通成功です。
php artisan config:cache