AWS SESから送信したBounceメールを処理する

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

SESで送信したEメールがBounce(不達)だった場合、Bounce情報をLambda関数で受け取る例。

BounceはSESの差出人アドレス宛に通知がくるので、

  • SESのアドレスにBounce通知時にSNSトピックに通知する設定を行う
  • SNSはサブスクリプション先のLambdaを起動する

流れでLambda関数にBounce情報を伝達します。


SNSのトピック作成

bounce時に通知するSNSトピックを作成します。

このトピックを作成するSNSリージョンは使用するSESのリージョンと合わせないといけないので注意。


SESの差出人アドレスの設定

bounceメールは差出人宛に通知されるのでFromアドレスに指定するアドレスをSESのコンソール上から設定します。

  • SESコンソール
  • Email Addresses
  • 差出人アドレスを選択
  • View Detailボタンを押下
  • Notifications -> Edit Configuration
  • bounceに先ほど作成したSNSトピックを指定する


Bounceメールを処理するLambda関数の作成

このLambda関数もSNS同様、SESと同じリージョンに作成します。

Lambda関数でbounceメールの情報取得。pythonでの例。

def lambda_handler(event, context):
    for rec in event['Records']:
        #バウンスしたメールアドレスの取得
        message = rec['Sns']['Message']
        data = json.loads(message)
        bounces = data['bounce']['bouncedRecipients']
        for b in bounces:
            email = b['emailAddress']

rec['Sns']['Message']はJSON構造をエスケープした文字列が入ってくるので、json.loads(message)としてdictでアクセスするよう処理します。

data = json.loads( "{\"notificationType\":\"Bounce\", ... }" )

のような文字列をjsonとして解釈するよう処理しています。


bounce情報のダンプ
{
    "notificationType": "Bounce",
    "bounce": {
        "bounceType": "Undetermined",
        "bounceSubType": "Undetermined",
        "bouncedRecipients": [
            {
                "emailAddress": "ooto@simulator.amazonses.com"
            }
        ],
        "timestamp": "2020-06-11T08:20:02.000Z",
        "feedbackId": "01000172a276ed3f-8c977df9-4888-412b-b410-b29ead35c893-000000"
    },
    "mail": {
        "timestamp": "2020-06-11T08:20:02.590Z",
        "source": "ichikawa.fumiya@gmail.com",
        "sourceArn": "arn:aws:ses:us-east-1:865823437905:identity/ichikawa.fumiya@gmail.com",
        "sourceIp": "13.114.103.3",
        "sendingAccountId": "865823437905",
        "messageId": "01000172a276ea82-8838accc-7db3-41b6-b149-0cdf6238d62f-000000",
        "destination": [
            "ooto@simulator.amazonses.com"
        ]
    }
}