Amazon SESのBounce SNS通知をRailsで処理する

Amazon SESのBounceをHTTPで受け取って処理するための設定。

■Amazon SESでの設定
Amazon SESのコンソールにログイン
スクリーンショット 2014-02-21 22.11.09.png
左メニューのEnail Addressesを選択し、Verified Sendeのメールアドレス一覧からBounce SNS通知を設定したいメールアドレスの横にある虫メガネアイコンをクリック

Feedback → Edit Configurationを選択すると以下のダイアログが開く。
スクリーンショット 2014-02-21 21.52.02.png
通知にはAmazon SNSのTopicが必要なので、新規作成sの場合は「Click here to create a new Amazon SNS topic.」でTopic Nameを入力して作成、すでにある場合はSNS ConfigurationのプルダウンからBounces、Complainsを選択。

■Amazon SNSでの設定
Amazon SNSのコンソールに移動。
左メニューのTopicsから設定したいトピックを選択し、右画面の「Create Subscription」をクリック
ProtocolにHTTPあるいはHTTPSを選択し、EndpointにBounce用のURLを入力。
Subscribeボタンをクリックすると、すぐにEndpointのURLに確認用のトークンなどがPOSTで送信される。
Railsの場合authencity tokenチェックがあるのでprotect_from_forgery :except、skip_before_filter :verify_authenticity_tokenなどで無効にしておく。

送信されたPOSTデータはJSON形式なので、パースしてSubscribeURLをopenするようにすれば、サブスクリプションがすぐに完了できる。
def confirm_subscription(request.raw_post)
require 'json'
json = JSON.parse(request.raw_post)
subscribe_url = json['SubscribeURL']
require 'open-uri'
# Subscription認証用URLを開いて認証を完了する
open(subscribe_url)
end

本番環境だとOpen SSLエラーになったりする場合はloggerでrequest.raw_postを記録してログのSubscribeURLを開くというのが楽かもしれない。
サブスクリプションの確認をすぐしたい場合はAmazon SNS管理コンソールのTopic編集画面で「Create Subscription」をクリックして作成済みのURLを入力するとすぐにリクエストが送信され、同じURLが重複するということもない。

SubscribeURLにアクセスすると、サブスクリプションが完了してSubscription IDがPendingConfirmationからarn:aws:sns:us-west-2:1111...のようになる。

ちなみにSubscribeURLはこのような感じ。
https://sns.us-east-1.amazonaws.com/
?Action=ConfirmSubscription
&TopicArn=arn:aws:sns:us-east-1:123456789012:My-Topic
&Token=51b2ff3edb475b7d91550e0ab6edf0c1de2a34e6ebaf6
c2262a001bcb7e051c43aa00022ceecce70bd2a67b2042da8d8
eb47fef7a4e4e942d23e7fa56146b9ee35da040b4b8af564cc4
184a7391c834cb75d75c22981f776ad1ce8805e9bab29da2329
985337bb8095627907b46c8577c8440556b6f86582a95475802
6f41fc62041c4b3f67b0f5921232b5dae5aaca1

以降は設定したEndpointにJSON形式の通知が送られてくる。

通知のサンプル
{
"notificationType":"Bounce",
"bounce":{
"bounceType":"Permanent",
"bounceSubType": "General",
"bouncedRecipients":[
{
"emailAddress":"recipient1@example.com"
},
{
"emailAddress":"recipient2@example.com"
}
],
"timestamp":"2012-05-25T14:59:38.237-07:00",
"feedbackId":"00000137860315fd-869464a4-8680-4114-98d3-716fe35851f9-000000"
},
"mail":{
"timestamp":"2012-05-25T14:59:38.237-07:00",
"messageId":"00000137860315fd-34208509-5b74-41f3-95c5-22c1edc3c924-000000",
"source":"email_1337983178237@amazon.com",
"destination":[
"recipient1@example.com",
"recipient2@example.com",
"recipient3@example.com",
"recipient4@example.com"
]
}
}
posted by digital-squad at 2014年02月21日 22時22分 | Comment(0) | TrackBack(0) | Web関連ニュース
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック