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エンドポイントが確認可能です。
下にある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に切り替えることなくメールシステムが利用できそうですね。この記事がどなたかのお役に立てば幸いです。