こんにちは、インフラエンジニアのささしゅう(@sasashuuu)です。 本日はAWS SESにおけるバウンスメール周りのお話をしようと思います。 タイトルにもあるように、ハードバウンスのようなメールがソフトバウンス扱いで届き、気になってサポートへ問い合わせた際のお話をご紹介します。
バウンスメールとは
そもそもバウンスメールとはなんらかの原因により配信できなかったメールのことで、その種類にはソフトバウンスとハードバウンスがあります。
違いは以下のような内容です。
- ソフトバウンス
- 一時的な原因による配信失敗のメール(送信先のメールボックスがいっぱいだったなど)
- ハードバウンス
- 恒久的な原因による配信失敗のメール(そもそも宛先のメールアドレスが存在しないなど)
詳細な内容は過去のブログでも取り上げておりますので、よろしければご覧ください。
届いたメールの内容
今回届いたバウンスメールの一部は以下のような内容です。
{ "notificationType": "Bounce", "bounce": { "feedbackId": "xxxx-xxx-xxx-xxx-xxx-xxx-xxxxxx", "bounceType": "Transient", "bounceSubType": "General", "bouncedRecipients": [ { "emailAddress": "xxxxxxxxxxxx", "action": "failed", "status": "5.1.1", "diagnosticCode": "smtp;550 5.1.1 RESOLVER.ADR.RecipNotFound; not found" }, ...
SESによってハンドリングされたバウンスメールは上記のようなJSONオブジェクトの形で配信されるのですが、いくつか項目をピックアップして見ていきましょう。(※詳細は公式ドキュメントを参照。)
notificationType
- 通知のタイプです。
Bounce
が入っているのでバウンスメール扱いとなります。
bounceType
- SESによって決定されるバウンスタイプです。
Transient
がソフトバウンスになります。ソフトバウンスであるかどうかを判断するには、SNS 通知の内容を確認します。bounceType が Transient の場合はソフトバウンスです。ソフトバウンスのタイプを確認するには、bounceSubType の値を確認します。
diagnosticCode
- DSNの
Diagnostic-Code
フィールドの値です。 - 配信が不可であった場合に返ってくる応答メッセージかな(?)と解釈しております。
- ちなみに
smtp;550 5.1.1 RESOLVER.ADR.RecipNotFound; not found
となっています。いかにも宛先などが見つからなかったようなメッセージですね。 なお、SESのデベロッパーズガイドのメールボックスシミュレーターのシュミレートシナリオや、バウンス応答アクションのテンプレート説明などでは、不明なユーザーやメールボックスが見つからなかったことなどを示唆するメッセージが見て取れます。
バウンス – 受取人のEメールプロバイダー は、SMTP 550 5.1.1 レスポンスコード (「不明な ユーザー」) レスポンスコードで E メールを拒否 します。
https://docs.aws.amazon.com/ja_jp/ses/latest/dg/ses-dg.pdf
• Mailbox Does Not Exist - SMTP 応答コード = 550、SMTP ステータスコード = 5.1.1
- DSNの
詳細は後述しますが、今回はこの smtp;550 5.1.1 RESOLVER.ADR.RecipNotFound; not found
のレスポンスメッセージがSES側で未知のものであったことがソフトバウンス認定されてしまっていた原因でした。
問い合わせと回答
これまでの内容を踏まえ、以下2点について内容をまとめサポートへ問い合わせをしました。
- なぜこのようなハードバウンスのような内容のメールがソフトバウンス扱いで届くのか。
- アカウントレベルのサプレッションリストの使用 のように、任意のソフトバウンスメールのメールついて2回目以降の送信が行われないような機能、または良い方法はあるのか。
得られた回答の要点をざっくりとご紹介します。
まず1点目の「なぜこのようなハードバウンスのような内容のメールがソフトバウンス扱いで届くのか」については以下の内容です。
- SES は受信MTAからのレスポンスからハードバウンスが発生したかどうかを判定する。
- しかしながら受信MTAによって異なるレスポンスメッセージを利用するため、SES が把握していないレスポンスメッセージが受信MTAから返却される場合がある。
- その場合、顧客のバウンス率の評価に悪影響を与えないようにSESではハードバウンスではなくソフトバウンスが発生したものとして扱う。
このようにSESが把握していないレスポンスメッセージに関しては意図的にソフトバウンス扱いとして対処しているとのことでした。
また、本件に関するレスポンスメッセージに関しては問い合わせ後、ハードバウンスと判定されるような修正を反映してくださったようで、今後本件のような事象(ハードバウンスのような内容がソフトバウンスで届く件)が発生した場合は同じようにフィードバックが欲しいとのことでした。(バウンス判定の質の向上のために使用したいとのことでした)
そして2点目の「アカウントレベルのサプレッションリストの使用 のように、任意のソフトバウンスメールのメールついて2回目以降の送信が行われないような機能、または良い方法があるか」については以下の内容です。
- SES のサービスのみでは実現が難しいため以下のような対応が案としてあげられる。
- 対象のアドレスについて、手動でサプレッションリストに登録する。
- Lambda関数にて特定の条件を満たした場合に対象のアドレスをサプレッションリストに登録するコードを実装し、SESのSNS通知と連携する。
問い合わせ時点ではSESの機能で要件を満たすものはないそうで、手動でのオペレーションや他のAWSサービスを組み併せて対応する必要があるみたいでした。
まとめ
最後に本記事の要点を簡単にまとめておきます。 AWS SESで把握していないMTAからのレスポンスメッセージはバウンスレートに影響しないようにハードバウンスであってもソフトバウンスとして扱われます。もしこのような状況に遭遇した場合はサポートへフィードバックを送り、解消を図るのが良いと思います。また、そうでなくとも任意のソフトバウンスメールを2回目以降に送らせないようにするには手動でサプレッションリストに登録する、もしくはSES・Lambda・SNSなどのサービスを組み合わせて独自のシステムを構築するのが良いと思います。 もし同じような現象に遭遇し、お困りの方がいれば本記事の内容をご活用いただければと思います。