はじめに
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から外部の宛先にメール送信するまで ②