Amazon SESのSMTPエンドポイントを試してみた

Amazon SESのSMTPエンドポイントを使ってメール送信してみました

はじめに

こんにちは、AWS事業本部のニシヤマです。はいマスキュラー。

Amazon SESのSMTPエンドポイントを試してみたのでご紹介します。

AWS SESのSMTPエンドポイントって?

みなさまAWSでメールを送信する際にAmazon SESを利用することが多いのではないかと思いますが、SESをSMTPエンドポイントとして利用して送信することでできるのはご存知でしょうか。SESはAPIを利用して送信だけではなく、EC2などにインストールされたSMTP対応のソフトウェア(Sendmail、Postfixなど)からSESをリレーしてメール送信することが可能です。

前提

  • 利用するリージョンのAmazon SESのサンドボックス解除していること
  • 送信に利用するドメイン・メールアドレスの検証が済んでいること
  • Amazon Linux 2でEC2が起動済みであること

やってみる

今回は以下を参考にしてAmazon Linux 2にデフォルトでインストールされてるPostfixで試してみました。 Amazon SES と Postfix の連携

SMTP認証情報の取得

SESの画面の左メニューからSMTP Settingsをクリックします

この画面でもSMTPエンドポイントへの接続情報が確認可能ですが、以下のURLで全リージョンのSMTPエンドポイントが確認可能です。

Amazon SES SMTP エンドポイントに接続する

下にあるCreate My SMTP Credentialsをクリックします

次の画面で自動でIAM User Nameが入力されているので、右下の作成をクリックしてメール送信用IAMユーザを作成します。

作成が完了したメッセージが表示されます。画面上でSMTPユーザー名(アクセスキー)、SMTPパスワード(シークレットアクセスキー)の確認も可能ですが、認証情報のダウンロードをお勧めします。

Postfixの設定

次にEC2上のPostfixの設定を行っていきます。

Amazon Linux 2の場合、Postfixがインストールされ自動起動するよう設定されています。

$ rpm -q postfix
postfix-2.10.1-6.amzn2.0.3.x86_64

$ systemctl status postfix
● postfix.service - Postfix Mail Transport Agent
Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled)
Active: active (running) since 日 2020-01-19 07:52:15 UTC; 31min ago
Process: 3102 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCESS)
Process: 3099 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS)
Process: 3095 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS)
Main PID: 3187 (master)
CGroup: /system.slice/postfix.service
├─3187 /usr/libexec/postfix/master -w
├─3188 pickup -l -t unix -u
└─3189 qmgr -l -t unix -u

1月 19 07:52:14 ip-10-0-1-188 systemd[1]: Starting Postfix Mail Transport Agent...
1月 19 07:52:15 ip-10-0-1-188 postfix/postfix-script[3185]: starting the Postfix mail system
1月 19 07:52:15 ip-10-0-1-188 postfix/master[3187]: daemon started -- version 2.10.1, configuration /etc/postfix
1月 19 07:52:15 ip-10-0-1-188 systemd[1]: Started Postfix Mail Transport Agent.

$ systemctl list-unit-files -t service | grep postfix
postfix.service enabled

main.cfの設定

次にPostfixの全体設定を管理するmain.cfを設定していきます。

main.cfの設定にはPostfixのパラメーター設定するためのユーティリティpostconfコマンドを利用します。

$ sudo postconf -e "relayhost = [email-smtp.us-east-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"

master.cfの設定

Postfixのデーモン毎の設定を管理するmaster.cfに-o smtp_fallback_relay=のエントリがないか確認します。エントリがあればコメントアウトしてファイルを保存します。

sasl_passwdの設定

次にSMTP認証情報の検索テーブルファイルsasl_passwdを設定します。

パスはmain.cfのsmtp_sasl_password_mapsで指定した、/etc/postfix/sasl_passwdになりますが無かったので作成します。

$ sudo vi /etc/postfix/sasl_passwd
$ sudo cat /etc/postfix/sasl_passwd
[email-smtp.us-east-1.amazonaws.com]:587 AKIXXXXXXXXXXXXXXXXX:BNPXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

左から、SMTPエンドポイントとポート番号(587番)、SMTPユーザー名(アクセスキー)、SMTPパスワード(シークレットアクセスキー)の順に記載し、ファイルを保存します。

AWSではデフォルトで25番ポートが制限されているため、上記の587番ポート(サブミッションポート)を利用するか、25番ポートの解除申請を提出が必要です。(465番ポートでSMTPSを利用することも可能)

参考:EC2 インスタンスのポート 25 の抑制を解除する方法を教えてください。

sasl_passwdが設定できたらpostmapコマンドを利用し、sasl_passwdをhash化します。

$ sudo postmap hash:/etc/postfix/sasl_passwd

実行後、sasl_passwd.dbファイルが作成されたことを確認します。

$ ls -1 /etc/postfix/sasl_passwd*
/etc/postfix/sasl_passwd
/etc/postfix/sasl_passwd.db

sasl_passwd、sasl_passwd.dbには認証情報が含まれているため、安全のために権限・所有者を変更します。

$ sudo chown root:root /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
$ sudo chmod 0600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
$ ls -l /etc/postfix/sasl_passwd*
-rw------- 1 root root 107 1月 19 09:01 /etc/postfix/sasl_passwd
-rw------- 1 root root 12288 1月 19 09:08 /etc/postfix/sasl_passwd.db

CA証明書の設定

次にAmazon SESのサーバー証明書を検証するためのCA証明書の場所を設定します。

まずは/etc/ssl/certs/ca-bundle.crtがあるか確認します。

$ ls /etc/ssl/certs/ca-bundle.crt
/etc/ssl/certs/ca-bundle.crt

次にmain.cfに設定を追記して再度設定ファイルを読み込みます。Postfixが起動していない場合は起動してください。

$ sudo postconf -e 'smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt'
$ sudo postfix reload

以上でPostfixの設定が完了です。

メール送信

それではメールを送信してみましょう。 今回、SESで検証したのはドメインではなくメールアドレスになるので送信者アドレスには、SESに登録したメールアドレスを利用します。 以下のコマンドを1行づつコマンドラインで実行します。

$ sendmail -f <SESに登録した送信メールアドレス> <宛先メールアドレス>
From: Sender Name <SESに登録した送信メールアドレス> #←指定しない場合、Sendmailの実行ユーザー情報が表示されます
Subject: Amazon SES Test
This message was sent using Amazon SES.
.                                             #←メールメッセージの最後にはピリオド (.) が必要

宛先メールアドレスで確認した所、ちゃんとメールが届いていました!

おわりに

今回はSESのSMTPエンドポイントを試してみました。既存のシステムをAWSに移行した時などSES APIに切り替えることなくメールシステムが利用できそうですね。この記事がどなたかのお役に立てば幸いです。

参考

http://www.postfix-jp.info/trans-2.3/jhtml/postconf.5.html