LoginSignup
3
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-10-25

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

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

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

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

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

参考

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2