EC2にPostfixをインストールしてメールを送りたいのだけど、実はEC2からのメール送信(正確にはポート25のトラフィック)は制限されている。
よくある質問 – Amazon EC2 | AWS
https://aws.amazon.com/jp/ec2/faqs/#Are_there_any_limitations_in_sending_email_from_EC2_instances
Amazon Elastic Compute Cloud (EC2) では 2020年1月27日より、お客様やほかの受信者の皆さまをスパムやEメールの不正使用から守るために、デフォルトでポート25のEメールトラフィックを制限することになりました。ポート25は、Eメール送信用のデフォルトのSMTPポートとして広く使われています。過去にポート25スロットルをリクエストして、削除したことのあるAWSアカウントには、今回の変更による影響はありません。
では、EC2からメールを送信したければどうするか?
- AWSにポート25の制限解除を申請する、あるいは
- Amazon SES (Simple Email Service) を利用する
Amazon SESとは?
Amazon SES(高可用性で低価格なEメール送信サービス)| AWS
https://aws.amazon.com/jp/ses/
Amazon SES 料金:
Amazon Simple Email Service (SES) は、送受信される E メールの量に基づく従量制料金のサービスです。サブスクリプションや契約交渉、最低料金はありません。AWS 無料利用枠:
Amazon EC2 または AWS Lambda 経由でホストされているアプリケーションから Amazon SES を呼び出した場合、月に 62,000 通のメッセージまでは無料で送信できます。この無料利用枠の有効期限はありません。
自分がメールを必要とするのは
- ウェブアプリからの通知を受け取りたい (自分宛)
- バッチプログラムの結果を受け取りたい (自分宛)
というわけで、1日にせいぜい10通程度のメールを自分が受け取るだけ。
Amazon SESの無料枠で充分そうなので、以下セットアップする。
- Amazon SESをセットアップする
- EC2のPostfixからAmazon SES経由でメール送信できるようにする
Amazon SESをセットアップする
(1) メアドのベリファイ
- AWSコンソールのAmazon Simple Email Serviceにアクセス
- Identity Management>Email Addresses
- [Verify a New Email Address]をクリック
- Email Address:にメアドを入力して[Verify This Email Address]をクリック
- 入力したメアド宛てに確認メールが届くので、本文中のリンクをクリック
- Verification Statusがpending verificationからverifiedに変わる
(2) サンドボックスについて
Email Sending>Sending Statistics をクリックすると以下の説明がある。
Your account details
Your Amazon SES account has “sandbox” access in region US West (N. California). When in the sandbox, you can only send email to the Amazon SES mailbox simulator and verified email addresses or domains. Request to be moved out of the sandbox by updating your account details. Learn more.
Can’t find your existing account settings? Your account may be set up in a different AWS region. Try switching regions in the top navigation bar.
「初期状態ではSESアカウントはサンドボックスアクセスになっていて、SESメールボックスシミュレータとベリファイ済みメアドにしかメール送信できない。サンドボックスを解除するには申請が必要」と言っているが、自分の場合は自分宛て(ベリファイ済みメアド)しかメールしないので、サンドボックスのままにしておく。
(3) SMTP設定
- Email Sending>SMTP Settings
- SMTP経由でメールを送るのに必要な情報が表示されるのでメモする
Server Name: email-smtp.us-west-1.amazonaws.com
Port: 25, 465 or 587
Use Transport Layer Security (TLS): Yes - [Create My SMTP Credentials]をクリック
- IAM User Nameを入力 (デフォルトのままでも可)
- [Create]をクリック
- SMTP UsernameとSMTP Passwordが作成されるのでメモする
EC2のPostfixからAmazon SES経由でメール送信できるようにする
公式サイトの手順をなぞる。
Amazon SES とPostfixの統合 – Amazon Simple Email Service Classic
https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/postfix.html
sendmailをアンインストール (もしインストールされていたら)。
1 |
# yum remove sendmail |
Postfixをインストール。
1 |
# yum install postfix |
SASL認証パッケージをインストール。
1 |
# yum install cyrus-sasl-plain |
後でテストとかバッチ処理で使うのでmailコマンドをインストール。
1 |
# yum install mailx |
Postfixの設定 (メールサーバー: email-smtp.xxxxx は適宜変更)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# postconf -e "relayhost = [email-smtp.us-west-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" # vi /etc/postfix/master.cf 以下のエントリが存在したらコメントアウトする -o smtp_fallback_relay= # vi /etc/postfix/sasl_passwd [email-smtp.us-west-1.amazonaws.com]:587 SMTPUSERNAME:SMTPPASSWORD # postmap hash:/etc/postfix/sasl_passwd # chown root:root /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db # chmod 0600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db # postconf -e 'smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt' # postfix start; sudo postfix reload |
テスト送信 (自分から自分宛に送る)。
1 2 |
$ echo "This message was sent using Amazon SES." | \ mail -s 'Amazon SES Test' -r user@mydomain.com user@mydomain.com |
メール届いた (Gmailで受信)。ヘッダは以下の感じで、SPFもDKIMも設定されている。
1 2 3 4 5 6 7 |
Message ID: <xxxxxxxxxx@us-west-1.amazonses.com> Created at: Sat, Sep 4, 2021 at 6:39 PM (Delivered after 1 second) From: <user@mydomain.com> To: Subject: Amazon SES Test SPF: PASS with IP xxx.xxx.xxx.xxx DKIM: 'PASS' with domain amazonses.com |
参考サイト
Amazon SES とPostfixの統合 – Amazon Simple Email Service Classic
https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/postfix.html
Postfixからの送信を全てSES経由に変更する – Qiita
https://qiita.com/fantasista_21jp/items/e227f802095a0049a8d0
【AWS】EC2インスタンスからPostfix + SESで外部へシステムメールを送信 | 電算星組
https://densan-hoshigumi.com/aws/aws-postfix-ses-send-email
[AWS] Amazon SES と Postfix を連携しメールを送付する
https://mseeeen.msen.jp/send-emails-by-linking-amazon-ses-and-postfix/
Amazon SESのSMTPエンドポイントを試してみた | DevelopersIO
https://dev.classmethod.jp/articles/sendmail-from-ses-smtpendpoint/
Amazon SESによるメール送信環境の構築と実践 | DevelopersIO
https://dev.classmethod.jp/articles/amazon-ses-build-and-practice/