AWS の SES でのメール受信について。まず、SES がメールを受信して S3 に保存するまでをやっつける。
仕様
Amazon SES で以下のドメイン宛メールをすべて受信し、raw MIME のまま S3 へ保存する。
sampledomain.com
sub.sampledomain.com
保存先は共通の S3 バケットとし、ドメインごとに prefix を分離する。
s3://mail-in-bucket/
├── sampledomain/
│ └── raw/
└── sub-sampledomain/
└── raw/
前準備
リージョン ap-northeast-1 に以下の Identity を作成するが、先にドメインの MX レコードを変更しておく。今回 Route 53 で行っているが、BIND のゾーンファイルなら以下のような感じになるはず。
@ 300 IN MX 10 inbound-smtp.ap-northeast-1.amazonaws.com.
sub 300 IN MX 10 inbound-smtp.ap-northeast-1.amazonaws.com.
mail-in-bucket バケットも以下のような設定で作成しておく。
- Bucket type: General purpose
- Object Ownership: Bucket owner enforced
- ACL: Disabled
- Block Public Access: All enabled
- Versioning: Disabled
- Default encryption: SSE-S3
- Object Lock: Disabled
ID の作成 < SES
前に挙げた sampledomain.com と sub.sampledomain.com の ID を作成する。
ID の作成画面で ID タイプでドメインを選択すると、以下の内容を入力できる。
- Domain: ドメイン名
- Assign a default configuration set: OFF ← 送信時に使用
- Assign to a tenant: OFF ← 送信時に使用
- Use a custom MAIL FROM domain: OFF ← 送信時に使用
ドメインの検証は Easy DKIM で行った。
- DKIM signing key length: RSA_2048_BIT
- Publish DNS records to Route53: ON
- DKIM signatures: ON
しばらくすると ID ステータスが検証済みになるはず。
Receipt Rule Set < SES
Receipt Rule Setとして mail-in を作成し、Active に設定した。
sampledomain.com
- Rule name: sampledomain
- Recipient condition: sampledomain.com
- TLS: Optional
- Spam/virus scanning: Enabled
S3 Action も設定する。
- Bucket: mail-in-bucket
- Object key prefix: sampledomain/raw/
- Message encryption: OFF
- IAM role: mail-in-bucket-ses-role
- SNS: なし
sub.sampledomain.com
- Rule name: sub-sampledomain
- Recipient condition: sub.sampledomain.com
- TLS: Optional
- Spam/virus scanning: Enabled
S3 Action も設定する。
- Bucket: mail-in-bucket
- Object key prefix: sub-sampledomain/raw/
- Message encryption: OFF
- IAM role: mail-in-bucket-ses-role
- SNS: なし
Role < IAM
SES から S3 に書き込むためのロール mail-in-bucket-ses-role を作成した。
S3 書込権限
インラインポリシー mail-in-bucket-s3-put を作成。s3:PutObject を許可した。
対象リソースは以下の 2 つ。
- arn:aws:s3:::mail-in-bucket/sampledomain/raw/*
- arn:aws:s3:::mail-in-bucket/sub-sampledomain/raw/*
SES によるメール保存には不要なため、s3:GetObject や s3:DeleteObject、s3:ListBucket は設定していない。
信頼ポリシー
Principal は ses.amazonaws.com で、許可するアクションは sts:AssumeRole で、AWS:SourceAccount は自分のアカウント ID。AWS:SourceArn は arn:aws:ses:ap-northeast-1:<アカウントID>:receipt-rule-set/mail-in:receipt-rule/sampledomain と arn:aws:ses:ap-northeast-1:<アカウントID>:receipt-rule-set/mail-in:receipt-rule/sub-sampledomain に。* でまるっと括らずつくった 2 つのルールセットを指定している。
受信テスト
これで外部からメールを送信して、S3 にオブジェクトができていることを確認する。
わかったこと
SES で受信したメールには Delivered-To ヘッダが付加されていない。しかし、SES 受信時のイベントには envelope recipient が含まれている。
通常 foo@sampledomain.com と bar@sampledomain.com 宛のメールというのは、それぞれのメールボックスに配送される。受信時に RCPT TO が foo@sampledomain.com と bar@sampledomain.com の 2 回あったときに S3 に保存されるメールとしてはいくつになるのかがまだ不明。