Azure FunctionsのSendGridバインディングで、特にライブラリをインストールせずとも簡単にメールを配信できます。
しかし、配信リクエストが正しく送れたとしても、その後にどうなるかは気にする必要があります。例えば、
- SendGridから送信先のメールに配送されたのか
- メールは開封されたのか
- そして開封されたメールに記載してあるリンクはクリックしてもらえたのか
- そもそもメールは途中のメールサーバーで拒否されていないか
- 届いたけれどもスパムとして扱われていないか
などといったことを気にしないといけません。SendGridは、それを確認するためのActivity機能を提供しています。
これは大変便利なのですが、画面の応答が遅く、複数人でこの画面を見ているとエラーになったりします。
Event Webhook
「この情報を自分たちのシステムに持っておきたい!」と思う人のために、SendGridはEvent Webhookを提供しています。これは、各メールの配送状況を指定したWebhookのエンドポイントに情報を送ってくれる機能です。
メールの配送リクエストを受け付けた後のそれぞれの状態について、それら固有の情報をJSONとして、登録したWebhookのエンドポイントに送信してくれます。
Azure Functions でWebhookのエンドポイントを実装
Webhook とくれば、Azure Functions のHttpトリガーの出番です!ということで、試しに作ってみました。
このサンプルは、メールが期待どおりに届かなかった場合にHipChatの指定したルームに通知をしてくれるFunctionです。
var Hipchatter = require('hipchatter');
var hipchatter = new Hipchatter(process.env.HIPCHAT_ROOM_TOKEN)
function notifyToRoom(event, context)
{
event.timestamp = new Date(event.timestamp * 1000);
var options = {
message: `/code ${JSON.stringify(event, null, ' ')}`,
message_format: 'text'
};
switch (event.event) {
case 'bounce':
case 'deferred':
case 'dropped':
case 'spamreport':
case 'unsubscribe':
options.color = 'red';
options.notify = true;
break;
case 'delivered':
case 'open':
case 'click':
options.color = 'green';
break;
default:
options.color = 'gray';
break;
}
hipchatter.notify(process.env.HIPCHAT_ROOM_ID, options,
function (err) {
if (err)
context.log.error(err);
}
);
}
module.exports = function (context, req) {
var events = req.body;
if (!events) {
context.log.error(`unexpected body: ${req.body}`);
return;
}
events.forEach(function(event) {
notifyToRoom(event, context);
context.log(event);
}, this);
context.res = { status: 200, body: '' }
context.done();
};
実際の通知はこんな感じです。ちゃんと配送された場合は緑で、何かしら問題があった場合は赤く通知が届くようになっています。
今回は配送状況を知りたいだけだったので通知にしました。他にも応用として、
- メール開封、クリックを含めてコンバージョンを計測したい。
- メールが配送できなかった場合に、ユーザーの情報にフラグを立てたい。
といったことも出来そうです。
それでは楽しいメールライフを < ⚡ >