FirebaseでSendGridで送付したメッセージを追跡する

記事
IT・テクノロジー

FirebaseでSendGridで送付したメッセージを追跡する

SendGridは、単純にメッセージを送信するだけではなく、送信したメッセージを追跡する機能も提供しています。SendGridで送付したメッセージの追跡情報は、SendGridのWebサイトのユーザーインターフェースから見ることができます。
さらに、便利なのは、単にSendGridのWebサイトで追跡情報を見るだけではなく、Firebaseを使った独自のWebサービスやWebアプリにSendGridで送付したメッセージの追跡機能を取り込んで利用することも可能です。この記事では、SendGridで送付したメッセージをFirebaseを利用した独自のWebサービスやWebアプリで追跡する方法について解説します。

SendGridから送付できるメッセージは2種類

SendGrid経由で送付できるメッセージは2種類あります。
* E-Mail形式のメッセージ(E-Mailアドレスを指定して送付)
* マーケティングキャンペーン(送付先を登録したリストで送付)
の2つです。機能的には似ていますが、詳細の機能は違っています。
SendGridではどちらのタイプのメッセージも追跡して、送信の完了や開封状況、メッセージ中のリンクなどの情報を追跡する事ができます。
SendGridのていきょうするメッセージの追跡という観点で比べてみると以下のような点が違います。
* マーケティングキャンペーンはSendGrid上にメッセージの控えが残る
* マーケティングキャンペーンは登録されている送付先ごとに個別に送付される
* マーケティングキャンペーンはキャンペーン(メッセージ)作成時にIDが発行される
* E-Mail形式のメッセージはSendGridには控えが残りません
* E-Mail形式のメッセージは複数の宛先の場合は、一括して1通のメールとして送られる
* E-Mail形式のメッセージは送付時にIDが発行(処理の応答の一部として返送)される
などの違いがあります。
メルマガ(ニュースレター)の場合、個人情報保護の観点から、受取人以外のE-Mailアドレスは表示されない方が望ましくなります。この場合、E-Mail形式のメッセージの1通のメッセージで複数の宛先を指定する場合、「Bcc」で送る以外の方法はあります。それ以外の場合は、全ての宛先がE-Mail上に表示されてしまいます。
「Bcc」を指定しない方法は、個別に宛先を指定して、送付先分のE-Mailを別々に発送する必要があります。
例えば、送付先が10人の場合は10通のメッセージに分けて別々に送る必要があります。さらに、SendGrid経由でE-Mail形式のメッセージを追跡する場合は、10通のメッセージそれぞれに別のIDが発行されるので、その全てを保存しておく必要があります。
一方で、マーケティングキャンペーンの場合、送付先のE-Mailを登録したリストを指定して送る形式になっていて、個別の発想はSendGrid側で自動的に行ってくれます。SendGridが発行するメッセージのIDも一つで済みますし、メッセージの控えもSendGridのサーバーに保存されます。 メルマガやニュースレターなど複数の宛先に同じメッセージを配信する場合は、マーケティングキャンペーンの方が圧倒的に有利です。

メッセージの追跡は基本的に1種類

メッセージを追跡する場合に必要な機能は、E-Mail形式でもマーケティングキャンペーンでも1種類で対応可能です。
これは、SendGridの提供する「WebHook」という機能を利用します。
SendGrid経由で送付したメッセージの追跡は、SendGridが送付するメッセージに追跡の為の情報を埋め込んで送信します。この情報を元に、SendGridはメッセージの状態を追跡しています。
* 送信処理中(processed)
* 送信完了(delivered)
* 開封(open)
* リンクのクリック(click)
* 配信停止(unsbuscribe)
* スパム(spam_report)
* 受信拒否(bounce)
* 一時受け取り拒否(deferred)
* 送信エラー(dropped)
などの状態を追跡できます。
これらのイベント(event)をSendGridのサーバが検出すると、予めSendGridの利用者が指定したURLにそのイベントの発生を通知してくれます。この仕組みがWebHookです。
FirebaseとSendGridを利用して、メルマガ(ニュースレター)の配信サービスを実装するには、SendGridのAPIキー(秘密鍵/secret key)の利用が必要なため、バックエンドのサービス(functions)が必要になります。 このバックエンドのサービスの一部として、WebHookで送られてきたイベント情報を受信できる機能をバックエンド(functions)で実装すれば、SendGrid経由で送付したメッセージの追跡ができます。

バックエンドのサービス(functions)の実装

バックエンドのサービス(functions)の実装は、SendGrid他のサービスの実装とほぼ同じ要領で実装できます。 expressのルーティング処理にWebHookを受け取るURLを加えて、受け取った情報をFirebaseのデータベース(Cloud Firestore)に登録するだけです。
this.app.post(
      CONSTANTS.IH_API_TRACKING_EVENTS_ADD;
      async (req: express.Request, res: express.Response) => {
        await this.sendgrid.setParameter();
        const events: string = JSON.stringify(req.body);
        const items: Array<TYPE.SgEvent> = JSON.parse(
          events
        ) as Array<TYPE.SgEvent>;
        for (const item of items) {
          await this.sendgrid.addEvent(item);
        }
        res.end(JSON.stringify({ result: true }));
      }
    );
Firebaseのデータベースに登録する際は、重複したイベントがないかチェックをして保存します。 実際に、SendGridから送られてくるイベントのデータを調べてみると、重複したデータが送られることがあるので、同じデータを複数保存しない処理が必要になります。
addEvent(item:any) {
    return new Promise((resolve) => {
        const ref: firebase.firestore.CollectionReference = firebase.
            firestore().collection("events");
        ref
            .where("event","==", item.event)
            .where("sg_message_id","==",item.sg_message_id)
            .where("timestamp", "==", item.timestamp)
            .get()
            .then((querySnapshot:firebase.firestore.QuerySnapshot) => {
                if (querySnapshot.size === 0) {
                    ref.add(item).then(() => {
                        resolve(true);
                    })
                    .catch((error:any) => {
                        resolve(false);
                    })
                }
            }).catch((error:any) => {
                resolve(false);
            })
    })
}
この追跡のイベントデータは、E-Mail形式とマーケティングキャンペーンでは若干送られてくる情報のフィールド名が異なりますが、Firebaseのデータベースの場合、異なるフィールドのデータでも同じコレクションに保存する事が可能なので、受け取ったデータをそのまま保存して問題ありません。
実際にメッセージの追跡をする場合は、イベントデータの探し方が異なります。
E-Mail形式の場合
送付の際に、SendGridが送信のリクエストの応答のヘッダーに含まれるメッセージIDを取得して保存しておきます。 このIDを先頭に含む、「sg_event_id」を持つものを探します。このイベントが対象となるメッセージの追跡情報になります。追跡情報には、イベントのタイプと宛先にE-Mailが含まれているので、これを元にメッセージの追跡が可能です。
マーケティングキャンペーンの場合
イベントのデータに、「marketing_campaign_id」のフィールがあるので、これを元に追跡するメッセージを特定できます。メッセージ自体もSendGridのサーバーに保存されているので追跡は簡単です。同じメッセージは同一のキャンペーンのIDが割り当てられるのでメッセージ毎のデータの集計も簡単にできます。

まとめ

SendGrid経由で送信されたメッセージは、Firebaseのバックエンドサービス(functions)を利用すれば簡単に追跡する事ができます。SendGridのサービスを利用してメッセージを送る場合、いずれにしてもバックエンドのサービス(functions)は必要になるので、その一部としてWebHookの機能を実装してしまえば、メッセージの追跡も簡単にサポートせきます。
メッセージの追跡は、一般的なE-Mail形式のメッセージでも可能ですが、いろいろな面でマーケティングキャンペーンを利用した方が簡単に実現できます。E-Mailを利用した、メルマガ(ニュースレター)の開封状況やリンクのクリックのデータがあると、配信する内容に対する興味などのデータを集めることができるので、配信する情報の方向性などを修正するのに役立てることができます。
配信するだけならば、無料のサービスもたくさんありますが、配信したメッセージの詳細を追跡することを考えると、この機能はとても便利です。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す ココナラコンテンツマーケット ノウハウ記事・テンプレート・デザイン素材はこちら