SESでバウンスが起きた際メールアドレスを通知【実装例あり】

バウンス通知のアーキテクチャ

SESを利用する際、バウンス対策は必須です。今回はバウンスが発生した際に、「どこに送ろうとしてバウンスになったのか?」を通知できないかと思い、調査しました。

目次

アーキテクチャ バウンス契機でSNSに通知しLambda関数をトリガする

バウンス検知の仕組みはAWSが用意してくれています。SESの設定で、Bounceが起きた際にSNSに通知することができます。
下記のようなアーキテクチャで実現でき、今回は実際にトリガされるLambdaでどのような情報を受け取れるのかを見ていきます。

SESバウンス通知のアーキテクチャ図
図1 バウンス通知のアーキテクチャ

バウンス発生時、SNS→Lambdaに通知される内容をeventをprintすることで見ていきます。

まずはバウンス通知を設定してみる

SESの設定 バウンス発生時にSNSに通知する設定

SES側の設定はSES→設定→検証済みID→通知から設定できます。

事前にSNSTopicを作成しておいてください。ここではSESBounceTestというTopicを事前に作成していたのでこれを使います。

設定は画面下部フィードバック通知からできます。編集を押してBounceで使用したいSNSTopicを選択します。

マネジメントコンソールでSESの設定を行う画面
図2 SES側設定画面

今回はBounceですが、Complaint(苦情)、Delivery(配信)時もSNSTopicに通知することが可能です。

Lambdaの設定 SNSTopicトリガでLambda関数を起動するように設定

続いてLambda側の設定です。当該SNSトピックにメッセージが入ったらLambdaが起動するように設定します。

Lambda関数もデフォルトでOKなので事前に作成をお願いします。

筆者は使い慣れているPython3.9でLambda関数を作成しました。今回はログを出すだけなので使い慣れているランタイムでOKです。


Lambda→設定→トリガーからトリガーを追加でSNSTopicを選択します。

Lambdaの設定画面でトリガーにSNSを設定した画面
図3 Lambda側の設定画面

Lambda関数でログ出力コード作成

今回は渡されたeventに何が入っているのかを見たいのでeventをprintするだけのコードです。

import json

def lambda_handler(event, context):
    print(event)
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

デフォルトのコードにprint分を追記しただけです。

動作確認

SESコンソールからテストメールを送信してみる

SESコンソールからテストメールを送ってみましょう。メールを送信してバウンスが起きればlambdaが起動されるはずです。
SES→設定 検証済みID→対象のメールアドレスからテストEメールの送信を押下します。

SESテストメール送信画面
図4 SESのテストメール送信

SESではバウンス用のシミュレーションメールアドレスが用意されているのでそこにメールを送ってみましょう。

SESテストEメール送信画面
図5 バウンスシミュレーションへのメール送信

Lambda関数の実行ログ確認

するとLambdaがトリガされます。CloudWatchを確認すると以下のようなログが出力されました!(見やすくするために改行しています。)送信元アドレス、送信先アドレスをはじめとしていろいろな情報がありますね。

{'Records': [
 {'EventSource': 'aws:sns', 'EventVersion': '1.0', 'EventSubscriptionArn': 'arn:aws:sns:us-east-1: 123456789012:SESBounceTest:c95fd482-2874-403e-91ac-24c1996cb917', 
  'Sns': {'Type': 'Notification', 'MessageId': '17209c42-105e-5a57-b22b-c04c89467e97', 
   'TopicArn': 'arn:aws:sns:us-east-1: 123456789012:SESBounceTest', 'Subject': None, 'Message': '{
    "notificationType": "Bounce",
    "bounce": {
     "feedbackId": "01000184fc6d3eb7-0bdde073-a787-4c59-b8c5-ad627d91a5f0-000000",
     "bounceType": "Permanent",
     "bounceSubType": "General",
     "bouncedRecipients": [{
       "emailAddress": "bounce@simulator.amazonses.com",
       "action": "failed",
       "status": "5.1.1",
       "diagnosticCode": "smtp; 550 5.1.1 user unknown"
      }],
    "timestamp": "2022-12-10T14:25:28.000Z",
    "remoteMtaIp": "107.20.80.195",
    "reportingMTA": "dns; a48-97.smtp-out.amazonses.com"
   },
   "mail": {
    "timestamp": "2022-12-10T14:25:28.294Z",
    "source": "test@gmail.com",
    "sourceArn": "arn:aws:ses:us-east-1:123456789012:identity/test@gmail.com",
    "sourceIp": "124.212.15.103",
    "callerIdentity": "root",
    "sendingAccountId": "123456789012",
    "messageId": "01000184fc6d3ce6-a1da1e67-1e61-4c61-a520-1c6210857e75-000000",
    "destination": [
     "bounce@simulator.amazonses.com"
    ]
   }
  }', 'Timestamp': '2022-12-10T14: 25: 28.929Z', 
  'SignatureVersion': '1', 
  'Signature': 'N5FpkFP5WDKf2mekJhguzcvE9YOAUgDryw76Vxxxxxxxxxxxxxxxxxxxxxxx', 
  'SigningCertUrl': 'https: //sns.us-east-1.amazonaws.com/SimpleNotificationService-xxxxxxxxxxxxxxxx.pem', 
  'UnsubscribeUrl': 'https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:123456789012:SESBounceTest:c95fd482-2874-403e-91ac-24c1996cb917', 
  'MessageAttributes': {}
  }
 }
]}

PR
当ブログはWordPressテーマSWELLを使用しています。非常に使いやすく、簡単にプロのようなデザインを使えるのでお勧めです!!

SWELL – シンプル美と機能性両立を両立させた、圧巻のWordPressテーマ

ランキング

ランキングに参加しています。クリックして応援いただけると嬉しいです。
にほんブログ村 IT技術ブログ クラウドコンピューティングへ
にほんブログ村
AWSランキング
AWSランキング

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次