独自ドメインのメールアドレスを開設する際に、メールボックスは既存の自身のGmailに統合したく、EC2公開サーバにPostfixを構築してAmazon SES経由で転送できるようにした。ドメイン認証など、期待する構成とするために各種設定が必要だった。
なお、AWSではオープンリレー対策のOP25B (Outbound Port 25 Blocking) が適用されているが、制限解除を申請すれば外部宛のSMTP(25)通信が可能となる。しかし、Amazon SESを使用することで、バウンスや苦情が多発した際にAWS側でサービス停止してくれたり、加害者になるリスクを軽減できると考えている。
※なりすまし、スパムメール対策等のセキュリティの観点を含むため、導入の際には十分に検証ください。設定誤り、考慮漏れ等がありましたら指摘コメントをお願いします。
環境
基本的な設定はこちら参照 docs.aws.amazon.com
構成概要
構築する構成は以下の通り。設定は後述。
独自ドメイン宛 (受信)
独自ドメイン宛のメールはPostfix on EC2(Elastic IP付き)で受ける。バーチャルドメインとして設定し、SES経由でGmailのアドレスに送信する。
独自ドメイン発 (送信)
Gmailに独自ドメインのメールアドレスを追加し、Gmailから送信する。受信と同様、Postfix→SES経由で外部へメール送信する。
Gmailへのメールアカウントの追加についてはこちら
「デフォルトの返信モードを選択: メールを受信したアドレスから返信する」にしておくと、返信時に自動的にメールアカウントを使い分けられる。(英語設定 When replying to a message: Reply from the same address the message was sent to)
主要設定
上記動作のための主要な設定はこちらの通り。他基本設定・認証・TLS暗号化・レートリミット等は記載を割愛しているため、Postfix・AWSドキュメント等を参照。
# /etc/postfix/main.cf myhostname = mail.daichi703n.com myorigin = $mydomain virtual_alias_domains = daichi703n.com virtual_alias_maps = hash:/etc/postfix/virtual smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination smtpd_sasl_auth_enable = yes header_checks = regexp:/etc/postfix/header_checks sender_canonical_classes = envelope_sender,header_sender sender_canonical_maps = regexp:/etc/postfix/canonical local_header_rewrite_clients = static:all
バーチャルドメイン。必要なメールアドレスをGmailに転送。
# /etc/postfix/virtual daichi703n.com anything mx@daichi703n.com [private]@gmail.com [host]@daichi703n.com [private]@gmail.com
SESではFrom
が認証済み(独自)ドメイン以外のメールは受け付けられない。canonicalでFrom
を自ドメインに書き替えるため、From
をReply-To
にコピーして保持する。元メールにReply-To
がある場合はX-Reply-To
として退避しておく。(※Reply-To
にカンマ区切りで列記すべきなので要追加検討)
# /etc/postfix/header_checks /^Reply-To: (.*)/ REPLACE X-Reply-To: $1 if !/^From: .*@daichi703n\.com$/ /^From: (.*)/ PREPEND Reply-To: $1 endif
外部から独自ドメイン宛メールのFrom・エンベロープFromを自ドメインに書き替える。自ドメイン からの送信は対象外。
# /etc/postfix/canonical !/.*@daichi703n\.com/ mx@daichi703n.com
DNS設定
SPF
, DKIM
, DMARC
認証のために以下のDNSレコードを登録している。パラメータは調整余地あり。
daichi703n.com. 300 IN MX 10 mail.daichi703n.com. daichi703n.com. 60 IN TXT "v=spf1 include:daichi703n.com include:amazonses.com ~all" mail.daichi703n.com. 300 IN A [Elastic IP] mail.daichi703n.com. 300 IN MX 10 feedback-smtp.ap-northeast-1.amazonses.com. mail.daichi703n.com. 60 IN TXT "v=spf1 include:amazonses.com ~all" _dmarc.daichi703n.com. 60 IN TXT "v=DMARC1;p=none;rua=mailto:[dmarc_report]@daichi703n.com;ruf=mailto:[dmarc_report]@daichi703n.com;rf=afrf;pct=100"
動作確認メール
- Yahooメール -> 独自ドメイン
Reply-To: [Name] <[yj-private]@yahoo.co.jp> From: [Name] <mx@daichi703n.com> X-Reply-To: [Name] <[yj-private]@yahoo.co.jp> To: [host]@daichi703n.com
- 独自ドメイン -> Yahooメール
Reply-To: [Name] <[host]@daichi703n.com> From: [Name] <[host]@daichi703n.com> To: [Name] <[yj-private]@yahoo.co.jp>
- キャリアメール -> 独自ドメイン
Reply-To: [carrier-private]@h.vodafone.ne.jp From: mx@daichi703n.com To: [host]@daichi703n.com
- 独自ドメイン -> キャリアメール
ヘッダ参照方法わからず...。動作は期待通り。
認証情報
送信元 (mailed-by): mail.daichi703n.com 署名元 (signed-by): daichi703n.com --- SPF: PASS (IP: 23.251.234.7) DKIM: PASS (ドメイン: daichi703n.com) DMARC: PASS
エラーログ
設定誤り時のPostfixのエラーログ
- 送信:認証失敗 (
reject_unauth_destination
不足)
554 5.7.1 <[host]@daichi703n.com>: Recipient address rejected: Access denied smtp-server: 554 5.7.1 <[host]@daichi703n.com>: Recipient address rejected: Access denied
- 送信:認証なし外部リレー
454 4.7.1 <[private]@gmail.com>: Relay access denied smtp-server: 454 4.7.1 <[private]@gmail.com>: Relay access denied
- 受信:
From
(sender_canonical_classes
,sender_canonical_maps
)不備header_checks
で書き換えるだけではエラーになった。
postfix/smtp[16169]: 50DF387715F: to=<[private]@gmail.com>, orig_to=<[to]@daichi703n.com>, relay=email-smtp.ap-northeast-1.amazonaws.com[52.196.119.170]:587, delay=0.33, delays=0.07/0.02/0.13/0.11, dsn=5.0.0, status=bounced (host email-smtp.ap-northeast1.amazonaws.com[52.196.119.170] said: 554 Message rejected: Email address is not verified. The following identities failed the check in region AP-NORTHEAST-1: [carrier-private]@h.vodafone.ne.jp (in reply to end of DATA command)) postfix/cleanup[16168]: A146C877163: message-id=<20220115025742.A146C877163@mail.daichi703n.com> postfix/bounce[16170]: 50DF387715F: sender non-delivery notification: A146C877163 postfix/qmgr[16157]: A146C877163: from=<>, size=2925, nrcpt=1 (queue active) postfix/qmgr[16157]: 50DF387715F: removed postfix/smtp[16169]: A146C877163: to=<[carrier-private]@h.vodafone.ne.jp>, relay=email-smtp.ap-northeast-1.amazonaws.com[52.196.119.170]:587, delay=0.15, delays=0/0/0.14/0, dsn=5.0.0, status=bounced (host email-smtp.ap-northeast-1.amazonaws.com[52.196.119.170] said: 501 Invalid MAIL FROM address provided (in reply to MAIL FROM command)) postfix/qmgr[16157]: A146C877163: removed
まとめ - Postfix on EC2で独自ドメイン宛メールをAmazon SESでGmailに転送する
EC2公開サーバにPostfixを構築してAmazon SES経由で転送できるようにした。ドメイン認証など、期待する構成とするために各種設定が必要だった。 記事中の設定により、独自ドメイン宛のメールを個人Gmailに統合することができた。