zuntan02のはてなブログ

備忘録的なものです

AWS SESでメールを受信する

【前提】
某サービスで、独自ドメイン(仮にmail@hoge.jpとする)へのメールをSESで受けてみるメモ。
※これまでは、たまに来る承認メールとかのためにメールサーバを用意してた。
 問い合わせなどは別の窓口で対応していたので、ホントに特定のメールが取れれば良い程度。

【参考】
Amazon SES によるメール受信の概念
https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/receiving-email-concepts.html
dev.classmethod.jp
→クラスメソッドさんのページに全部書いてある。以下は俺メモ

【手順】
https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/receiving-email-getting-started-before.html
こちらからのステップに従って作業を進める

ステップ 1: 開始する前に

AWSへのサインアップとRoute53によるドメインの登録:省略

スステップ 2: ドメインの検証

1.Route53を登録しているAWSアカウントでhttps://console.aws.amazon.com/sesAmazon SES コンソールを開きます。→「SES is not available in アジアパシフィック (東京). Please select another region.」といわれる。2016年11月現在東京リージョンは使用できないので、バージニア北部を利用してみる。

2.[Identity Management]-[Domains]-[Verify a New Domain] を選択

3.Domain:にAmazon Route 53 に登録したドメインの名前を入力、[Generate DKIM Settings] は未選択のままで、[Verify This Domain] を選択。

4.[Verify a New Domain] ページに、DNS サーバーに追加する必要があるレコードが表示されているので、[Use Route 53] を選択。

5.[Use Route 53] ページで、[Domain Verification Record] 、[Email Receiving Record]、および使用するホストゾーンを選択。

6.[Create Record Sets] を選択し、[Domain Identities] リストに戻る。

7.数分間待ってから、コンテンツページの右上にある最新表示ボタン押下、ドメインのステータスが [verified] であることを確認します。

※この時点でRote53を確認すると、MXレコードが[inbound-smtp.us-east-1.amazonaws.com]に切り替わっていた。

ステップ 3: 受信ルールの設定

受信ルールセットは、受信するメールに対してどのような処理を行うのかを指定する順序が指定された受信ルールの集合。

受信ルールを作成する

1.[SES Home]-[Email Receiving]-[Rule Sets]-[Create a Receipt Rule] を選択。
2.[Recipients] ページで、[Next Step] を選択。
 ※受信者(Recipients)を追加していないため、この受信ルールは、すべての確認済みドメインのすべての受信者宛てのメールを処理します。下記の場合、”*@hoge.jp”あてのメールはすべてs3に保存されることになります。

3.[Add action] メニューから [S3] を選択
4.[S3 bucket] で、[Create S3 bucket] を選択
BucketNmae:mail.hoge.jp(任意)
その他のオプションはデフォルト設定のままにして、[Next Step] を選択。

5.[Rule Details] ページで、ルール名に [rule-for-mail.hoge.jp] と入力し、その他のオプションはデフォルト設定のまま[Next Step] を選択、[Review] ページで、[Create Rule] を選択。

ステップ 4: テストE メールの送信

hogefuga@hoge.jpにメールすると先ほど作成したs3にメールが溜まっていく。
ダウンロードして内容を確認。
→OK。

おまけ:メールが届いたらSNSからお知らせする

1.[SES Home]-[Email Receiving]-[Rule Sets]で既存のルールをEdit
Action:S3の[SNS Topic]-[Create SNS topic]でSNS topicを作成する

例:
TopicName:hoge-email-recieved
Display Name:hoge-email-recieved
・[Topic ARN] フィールドで、前のタスクで作成したトピック ARNをペーストします。
・[Protocol] ドロップダウンボックスで [Email] を選択します。
・[Endpoint] ボックスに、通知を受信するために使用できる E メールアドレスを入力します。
→[Create subscription] をクリックします。

これで、メールがS3に保存されると同時に内容を記載したメールが送られてきます。

おまけ2:特定の受信者(Recipients)のみAmazon WorkMailで受信し、それ以外はS3に落とす

1)WorkMail(1アカウント当たり$4/月)を契約
[Quick setup]→Alias : hoge.jp
[Domains]-[Add domain] : hoge.jp
[Users]-[Create User] : info@hoge.jp

2)[SES]-[Rule Sets]

→WorkMailのルールに以下を設定
1.Recipient:info@hoge.jpのみにする
2.[Action]の[WorkMail]の次に [Stop Rule Set]を追加し、
 info@へのメール処理が終わった場合はここで評価を終了するようにする

3.WorkMailのルールを一番最初にする。

【動作】
・info@hoge.jpにメールが来た場合は最初のWorkMailのルールが評価されてWorkMailに落ちる
・hogehoge@hoge.jpなど上記のRecipientにマッチしないメールアドレスに届いた場合は
 上のステップ3で作成した[rule-for-mail.hoge.jp]で、S3への保存とSNSによる通知を実施

おまけ3:SESで届いたACM承認メールから承認リンクを取り出す

admin/hostmasterなどすべての宛先に飛ぶため、それぞれのドメイン宛に5通飛ぶ。マルチドメイン証明とかしてると一気に何十通も飛んできて、見つけ出すのが面倒だったので。

# EC2インスタンス上の作業ディレクトリにてS3にたまっているメールを取得
aws s3 cp s3://mail.hoge.jp ./ --recursive

# 以下のコマンドでadmin@へのメールのみあたりをつける
find . -mtime -1 -type f | xargs grep 'To: admin@' | cut -d ":" -f 1 | xargs -I{} sh -c 'grep ^Domain {};grep certificates.amazon.com/approvals?code {} | grep -v "</a>"'