はじめに
Amazon SESを使って、Eメールメッセージを加工する処理を作った。
構築自体はかなり簡単にできるので、正直なめていた。(反省はしていない)
SESを使うときは、メールの世界のルールを守らないといけない様子
構築
メールの流れ
① SESでのドメイン検証:受信をするためにドメイン所有者から許可を受けている事を証明する
② SES受信ルール設定:メールが到着したときの動作を決める(今回の場合Lambdaを起動)
③ Lambda関数内から、SESからメール送信する
ここまではドメインやLambdaの知識があれば、比較的簡単にできる。(構築方法は別途)
受信するメールアドレス と 送信するメールアドレス を同じにしておいた(フラグ注意。下記参照)
メール送信のモニタリングを実装
バウンスが多いと、AWSから「スパムメール発行業者」と認定されるらしい。まぁそりゃそうだ。
こんなに手軽にメールサーバを作れるのに、悪用されたらたまったもんじゃない。
公式サイト等の手順を見ながら、メール送信後、バウンスを検知したらアラートを飛ばすようにしてみる。
通知を使用した Amazon SES E メール送信のモニタリング

| 項目 | 設定値 |
|---|---|
| Email Feedback Forwarding: | Enabled |
| Bounce Notifications SNS Topic: | EmailサブスクリプションつけたSNSトピックARN |
とりあえずこれで。👇こんなイメージになるんだなと。
テスト用のメールアドレスも準備されている。
Amazon SES での E メール送信のテスト
事件
Lambdaからのメール送信先を、テスト用バウンスアドレス"bounce@simulator.amazonses.com"にして実行。。
実行後すぐに、SNSで指定したメールアドレス宛に通知メールが届いた。
・・・止まらない。

200件超えたあたりで、SES > Domains > Notifications の SNSTopicを削除して、ようやく止まる。。
無限ループ?!
Lambdaのログ見てみよう
あああ
(フラグ回収)
解説
メール送信した後、SESに対して、”バウンス”・”苦情”・”到着”等のレスポンスが返るらしい。
バウンスを受け取ったとき、SNS経由で別なメールアドレスに通知するようにした。
FeedbackもONにしていた。→ 送信元にも通知するという事だろう。
今回、受信メールアドレスと送信メールアドレスを同じものにしていた。。つまり
SESがメールを受信→Lambda起動してSESでメール送信(テスト用バウンスアドレス)→バウンスがSESに通知される
→SESからSNS経由で、通知される
→ Feedbackにより、メール送信元に通知される(メール送信元=SES受信用メールアドレス) 👈こいつが無限ループ
解決策
・ 受信・送信のアドレスは分けないといけない(これは当たり前レベルの話orz)
・ Feedback を Disableにする(SNS通知のみにする。いや…無限ループを避けるためにする設定ではない。。)
・ E メールのフィードバック転送先 ←こちらを参考とする

まとめ
メールサーバをミドルウェアで構築していた時により、運用上検討すべき箇所がまとまってきた感。

