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" ] } }
リンク