5
4

More than 1 year has passed since last update.

LaravelでのAmazonSES/SMTP設定

Posted at

経緯

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」の中段に、エンドポイントやポートが表示されている模様です。
ses.png
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

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4