Amazon SES で受信したメールに対して API を使ってバウンスメールを送信してみた

2023.05.30

いわさです。

先日 Amazon SES のメール送信パターンを整理していました。

その際に SES の API について棚卸ししていて気がついたのですが、Amazon SES から主体的にバウンスメールを送信する機能があることに気がつきました。

どうやら SES v1 API でのみ使える機能のようです。

まず、Amazon SES ではメールの送信だけでなく実はメールを受信する機能も備わっています。

この機能は通常のメールクライアントを使ってメール受信を行うような用途ではく、どちらかというと受信したメールを S3 バケットや Lambda、SNS などに連携して、ワークフローなど何かしら自動化の処理を実行するなどを目的としていると思います。
また、東京リージョンでは使用出来ない機能です。

どうやら冒頭で紹介したバウンスメール送信機能はこの受信機能でメールを受信した 24 時間以内に API を使ってバウンスメールを送信するための機能のようです。
何に使うんだ?という感じだったのでとりあえず使ってみることに。

前提:Amazon SES のメール受信機能を使う

繰り返しになりますが本機能は Amazon SES のメール受信機能で使うことができる機能です。
次のように本日時点では東京リージョンではメール受信機能を利用することが出来ません。

バージニア北部リージョンで Amazon SES を構成し、E メール受信メニューからメール受信条件を設定しています。

E メール受信機能のセットアップ手順は冒頭の記事あるいは以下の公式ドキュメントに従って設定してください。本記事では割愛します。

メールを受信後にバウンスメール送信

上記のように SNS トピックが構成されている状態で、Amazon SES でメールを受信すると、受信アクションが実行され SNS トピックへ次のような JSON データが送信されます。

{
    "notificationType": "Received",
    "mail": {
        "timestamp": "2023-05-29T21:13:43.560Z",
        "source": "iwasa.takahito@example.com",
        "messageId": "i284vnnoqg1a6k5285cj8v5lrct8sq7vuotqj5o1",
        "destination": [
            "hoge@mail-useast1.tak1wa.com"
        ],
        "headersTruncated": false,
        "headers": [
:
        ],
        "commonHeaders": {
:
        }
    },
    "receipt": {
:
    },
    "content": "<content>"
}

上記ハイライト部分からメッセージ ID と、受信メールアドレスを確認することができるので、それらをパラメータに次のように API を実行してみます。

% cat send-bounce1.json
{
    "OriginalMessageId": "i284vnnoqg1a6k5285cj8v5lrct8sq7vuotqj5o1",
    "BounceSender": "hoge-bounce@mail-useast1.tak1wa.com",
    "BouncedRecipientInfoList": [
        {
            "Recipient": "hoge@mail-useast1.tak1wa.com",
            "BounceType": "ContentRejected"
        }
    ]
}
% aws ses send-bounce --cli-input-json file://send-bounce1.json --region us-east-1
{
    "MessageId": "01000188696dd8c7-4953ae7a-f46a-406a-bcc0-acba61826bf1-000000"
}

上記は最も最低限のパラメータである一番シンプルなパターンですが、BounceType を指定せずに細かいパラメータを設定することも可能です。
BounceType を指定すると細かいパラメータは自動で設定してくれます。
ちなみに、BounceType に指定可能なパラメータは以下に定義されています。

先程のコマンドを実行すると、次のようにバウンスメールが返ってきました。
Amazon SES で一度メールは受信しつつも、対外的にはバウンスとして処理することが出来ました。

なお、このコマンドではメール受信が出来た場合にバウンスメールを送る処理になっており、そもそもメールが受信出来なかった場合のバウンスをカスタマイズするためのものではありません。

単純にバウンス応答したいだけであればアクションが用意されている

なお、単純にメール受信後にバウンス送信したいというだけであれば、受信ルールのアクションで「バウンス応答の返信」が用意されておりこちらを使って頂くことが可能です。

このことから、今回の API は Lambda などで受信イベントを処理しつつ一定条件の場合のみバウンス送信するなど、より柔軟なカスタマイズを行う場合に使う用途のコマンドだと解釈しました。

さいごに

本日は Amazon SES で受信したメールに対して API を使ってバウンスメールを送信してみました。

受信ルールのアクションで組み込みのものが用意されているのと SES v2 API では利用出来ないことからあまり利用するシーンは無い気もしますが、「なんだこれ?」と思った方の参考になれば幸いです。