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..."
}

このあとは、この情報をパースし、解析して、データベースに登録する等、バウンスメールの処理ロジックを実行するだけです。

これらを図にすると、下記のようになります。

  1. メールを送信
  2. バウンスメールが返ってくる
  3. バウンスメールをユーザーに転送 / SNSのトピックに通知
  4. SNSがHTTP(S)でELBにアクセス
  5. ELBがHTTPでEC2にアクセス(ELBでSSL Termination)
  6. バウンス情報を S3 / RDS / DynamoDB に保存

バウンス情報を処理するEC2は、Auto Scalingで必要に応じて増減させることもできます。

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら