hipchat
SendGrid
serverless
AzureFunctions

Azure FunctionsとEvent WebhookでSendGridのメール配信状況をチェックする

More than 1 year has passed since last update.

Azure FunctionsのSendGridバインディングで、特にライブラリをインストールせずとも簡単にメールを配信できます

しかし、配信リクエストが正しく送れたとしても、その後にどうなるかは気にする必要があります。例えば、

  • SendGridから送信先のメールに配送されたのか
  • メールは開封されたのか
  • そして開封されたメールに記載してあるリンクはクリックしてもらえたのか
  • そもそもメールは途中のメールサーバーで拒否されていないか
  • 届いたけれどもスパムとして扱われていないか

などといったことを気にしないといけません。SendGridは、それを確認するためのActivity機能を提供しています。
これは大変便利なのですが、画面の応答が遅く、複数人でこの画面を見ているとエラーになったりします。

Event Webhook

「この情報を自分たちのシステムに持っておきたい!」と思う人のために、SendGridはEvent Webhookを提供しています。これは、各メールの配送状況を指定したWebhookのエンドポイントに情報を送ってくれる機能です。

Event Webhook より

メールの配送リクエストを受け付けた後のそれぞれの状態について、それら固有の情報をJSONとして、登録したWebhookのエンドポイントに送信してくれます。

Azure Functions でWebhookのエンドポイントを実装

Webhook とくれば、Azure Functions のHttpトリガーの出番です!ということで、試しに作ってみました。

このサンプルは、メールが期待どおりに届かなかった場合にHipChatの指定したルームに通知をしてくれるFunctionです。

SendGridWebhook/index.js
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();
};

実際の通知はこんな感じです。ちゃんと配送された場合は緑で、何かしら問題があった場合は赤く通知が届くようになっています。

Screen Shot 2017-10-26 at 0.08.41.png

今回は配送状況を知りたいだけだったので通知にしました。他にも応用として、

  • メール開封、クリックを含めてコンバージョンを計測したい。
  • メールが配送できなかった場合に、ユーザーの情報にフラグを立てたい。

といったことも出来そうです。

それでは楽しいメールライフを < ⚡ >

参考