Amazon SES Mailbox Simulatorを試してみたの記事でバウンスメール等を簡単に発生させる(テストする)ことを以前紹介しました。
その際、通知をメールだけでなくSNSでも行えることがわかった為、メルマガ配信機能等を作る時に実装するバウンスメールの処理をこのSNSで出来ないか試してみました。
上記の記事では下図のSNSトピックに通知が行われるようになっており、その通知先(サブスクリプション)はメールとしていました。
この通知先には、次のようにHTTP(S)を利用することも可能です。
登録すると確認メッセージが送信され、そのメッセージ中のURLにアクセスすることでその通知先が承認されます。
通知先がメールの場合、確認メール本文中のURLをクリックすれば承認されたのですが、HTTP(S)の場合は、確認メッセージは指定した通知先URLにPOSTで送られます。その為、通知先URLには下記のようなPHPを配置しておきました。
この状態で上記の確認メッセージをPHPが受信すると、以下のようにエラーログが出力されます。
[Mon Oct 08 21:41:06 2012] [error] [client 27.0.1.155] { "Type" : "SubscriptionConfirmation", "MessageId" : "0812b051-affc-4fd4-ba19-5f273d85cce2", "Token" : "2336412f37fb687f5d51e6e241d09c81d...", "TopicArn" : "arn:aws:sns:us-east-1:81111815109...", "Message" : "You have chosen to subscribe to t...", "SubscribeURL" : "https://sns.us-east-1.amazonaws.c...", "Timestamp" : "2012-10-08T12:41:06.238Z", "SignatureVersion" : "1", "Signature" : "rm9LegteKP4lOljphEMqtliGfv/NO6DvS...", "SigningCertURL" : "https://sns.us-east-1.amazonaws.c..." }
このSubscribeURLにアクセスすると、下記のようなXMLが表示されます。
また次のように、無事通知先(サブスクリプション)が有効になります。
そして、SESでバウンスメールを発生させてみます。
すると、今度はエラーログに下記のようなバウンスメールの情報が出力されることがわかります。
[Mon Oct 08 22:00:41 2012] [error] [client 27.0.1.155] { "Type" : "Notification", "MessageId" : "463fbb0b-63ea-4a6d-90c5-33c8686e3bd1", "TopicArn" : "arn:aws:sns:us-east-1:811118151095:suz-lab-ses", "Message" : "{ \"notificationType\":\"Bounce\", \"bounce\":{ \"bounceType\":\"Permanent\", \"reportingMTA\":\"dns; a194-13.smtp-out.amazonses.com\", \"bouncedRecipients\":[{ \"emailAddress\":\"bounce@simulator.amazonses.com\", \"diagnosticCode\": \"smtp; 5.1.0 - Unknown address error 550-'5.1.1 user unknown' (delivery attempts: 0)\", \"status\":\"5.0.0\", \"action\":\"failed\" }], \"bounceSubType\":\"General\", \"timestamp\":\"2012-10-08T13:00:39.000Z\", \"feedbackId\":\"0000013a40768691-29692462-1148-11e2-9...\" }, \"mail\":{ \"timestamp\":\"2012-10-08T13:00:39.000Z\", \"source\":\"suzuki@suz-lab.com\", \"messageId\":\"0000013a40768169-3ba4f620-da2b-4b4a-95...\", \"destination\":[\"bounce@simulator.amazonses.com\"] } }", "Timestamp" : "2012-10-08T13:00:40.691Z", "SignatureVersion" : "1", "Signature" : "FDNBWbFhc5MXs+2tjw327zXhiKca3GLHbbVEN8vUmLAmnj60...", "SigningCertURL" : "https://sns.us-east-1.amazonaws.com/SimpleN...", "UnsubscribeURL" : "https://sns.us-east-1.amazonaws.com/?Action..." }
このあとは、この情報をパースし、解析して、データベースに登録する等、バウンスメールの処理ロジックを実行するだけです。
これらを図にすると、下記のようになります。
- メールを送信
- バウンスメールが返ってくる
- バウンスメールをユーザーに転送 / SNSのトピックに通知
- SNSがHTTP(S)でELBにアクセス
- ELBがHTTPでEC2にアクセス(ELBでSSL Termination)
- バウンス情報を S3 / RDS / DynamoDB に保存
バウンス情報を処理するEC2は、Auto Scalingで必要に応じて増減させることもできます。