はじめに
EC2からのメール送信をSESで簡単に実装する方法について記載してみます。
想定するのは、下図のようにEC2上のソフトウェア(たとえば監視とか)やスクリプト等がメールの送信元で、Postfixを経由してSESへメールリレーする構成になります。
前提
- メール送信を対象に記載しています(受信は対象外)
- ドメインは取得済み(今回はRoute53で取得済み)
- EC2(OS含む)やPostfixはインストール・設定済み
手順
SES IDの作成
Amazon SES の ID の作成と検証を参考にIDの作成を行っていきます。
AWSマネジメントコンソール上でSESに遷移して画面左の設定
からID
を選択します。
IDの作成
ボタンが表示されるので、クリックします。
ドメイン
箇所に検証対象(メール送信元ドメイン)のドメインを入力します。
DNSレコードのRoute53への発行
箇所、今回はあえて手動で実施してみるためチェックしていませんが、Route53であれば次のDNSレコードの登録を自動で行えます。
Route53へ登録するCNAMEレコードは下図の箇所になります。
上記のCNAMEレコードをRoute53に作成します。下図のように3つのレコードをすべて作成します。
しばらく待つとステータスが検証済み
になります。私の場合は15分程で検証済みになりました。
SES SMTP認証情報の作成
AWSマネジメントコンソール上でSESに遷移して画面左のSMTP設定
を選択し、SMTP 認証情報の作成
をクリックします。
アクセス許可ポリシーは変更せず、ユーザー名のみ指定(今回はdev-ses-smtp-user)します。
後ほどPostfixで指定するため、認証情報を保存しておきます。
VPC ネットワーク設定の変更
EC2からSESへの疎通ができるよう、ネットワーク設定を変更しておきます。
環境によって必要な設定箇所が異なってくるのでここでは例のみとしますが、セキュリティグループのアウトバウンドルールを追加したり、要件によってはVPCエンドポイントを作成して、ルートテーブルを更新したり等になります。
EC2 Postfix設定
Postfix設定ファイル(/etc/postfix/main.cf)に以下、必要設定を追加します。
relayhost = [email-smtp.ap-northeast-1.amazonaws.com]:587 smtp_sasl_auth_enable = yes smtp_sasl_security_options = noanonymous smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_use_tls = yes smtp_tls_security_level = encrypt smtp_tls_note_starttls_offer = yes smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
以下、参考例になりますが、必要に応じてmyhostname
やmydomain
等も修正してください。
myhostname = <EC2のホスト名>.<IDの作成で登録した検証済みドメイン> mydomain = <IDの作成で登録した検証済みドメイン>
次に、SESへの認証情報を保存するファイルを作成します。
# vi /etc/postfix/sasl_passwd
前述の「SMTP認証情報の作成」で取得した、SMTPユーザー名とSMTPパスワードを記載します。
[email-smtp.ap-northeast-1.amazonaws.com]:587 SMTPユーザー名:SMTPパスワード
パスワードファイルの権限変更、パスワードのハッシュ化、プロセスの再起動を行います。
# chmod 600 /etc/postfix/sasl_passwd # postmap hash:/etc/postfix/sasl_passwd # systemctl restart postfix
SES サンドボックス外への移動
SESの初期状態はサンドボックス内にあり、一定の制限が適用されています。そのため外部メールアドレス宛へのメール送信も制限がされているため、サンドボックス外への移動を行っていきます。
本番稼働用アクセスをリクエストする (Amazon SES サンドボックス外への移動)
AWSマネジメントコンソール上でSESに遷移して画面左の設定を始める
を選択して、右側の本稼働アクセスのリクエスト
をクリックします。
リクエストの申請画面に遷移するため必要事項を記入して、リクエストの送信
をクリックします。
承認されると以下のような、メールが届きます。申請から1分と立たず承認されました。
メール送信確認
最後にEC2からメール送信を確認します。-rオプションでFromをIDの作成
で登録した検証済みドメインを指定します。
# echo "mail body" | mail -r test@<IDの作成で登録した検証済みドメイン> -s "mail subject" <宛先メールアドレス>
メールログを確認して送信できたか確認します。
- リレー先がSES(relay=email-smtp.ap-northeast-1.amazonaws.comの部分)
- 送信ステータスがOKか(status=sent 250 Okの部分)
# tail /var/log/maillog
Apr 25 08:58:56 ホスト名 postfix/smtp[20115]: BC11543E67: to=<宛先メールアドレス>, relay=email-smtp.ap-northeast-1.amazonaws.com[13.114.114.157]:587, delay=0.3, delays=0.02/0.07/0.05/0.16, dsn=2.0.0, status=sent (250 Ok 0106018f128c4da8-da79553b-1a45-4315-9539-694873d1c5ab-000000)
宛先メールアドレス側(今回はGmail)で受信したメールヘッダーを確認します。SPF/DKIMもきちんとPASSになっています。
メールIDにもap-northeast-1.amazonses.com
が含まれていますが、IPを逆引きすると以下のようにSESから送信されていることがわかります。
$ nslookup 23.251.234.8 名前: e234-8.smtp-out.ap-northeast-1.amazonses.com Address: 23.251.234.8
おわりに
今回はSESからメール送信をする方法を記載しましたが、EC2上のPostfixから直接メール送信する方法については、過去記事をご参照ください。
EC2サーバのPostfixから外部の宛先にメール送信するまで ①
EC2サーバのPostfixから外部の宛先にメール送信するまで ②