SendGrid 新人成長記 第五回 Event Webhookを用いてイベントログを見る

SendGrid 新人成長記

こんにちは!新人がお届けする連載企画の第五回目です。これまで複数回にわたってメールの送信について書いてきましたが、SendGridの機能はそれだけではありません。第一回でも触れたように、SendGridを使うことで、送信したメールの状況を知ることもできます。メールがきちんと宛先に届いて、それが開封されたかどうか等の情報を把握することは、企業がよりよいサービスをユーザに提供する上で重要なことでしょう。今回は、これを実現する機能を試してみました。

ダッシュボードからログの確認

直近のメールのログはSendGridのダッシュボードから簡単に確認できます。ダッシュボードの左側のメニューにある”Activity”を選択すると、”Activity Feed”というページが表示されます。この画面で、宛先メールサーバにメールが届いたり (Delivered) 、メールが開封されたり (Opens) といったメールの状況(イベント)が一目でわかります。イベントの詳細はドキュメントを参照してください。

Activity Feed

Activity Feed 画面

ただしActivity Feedには最大で過去7日間のイベントしか表示されません。全てのイベントのログを保持するためには、Event Webhookという機能を用いてログを収集する仕組みを作っておく必要があります。

Event Webhookによるイベントログの保持

Event Webhookは、指定したURLにイベントをPOSTする機能です。POSTされるJSON形式のデータをデータベースに格納するなどの処理を実装すれば、イベントの保持管理が可能になります。今回は簡単な挙動確認として、POSTされたイベントをターミナルに表示させてみました。

Event Webhook

実装するシステムの構成

まず、PythonのWebフレームワークであるFlaskを用いて、JSONを受け取って表示させるスクリプトを書いてみます。

from flask import Flask, request
from json import dumps

app = Flask(__name__)


@app.route('/', methods=['POST'])
def Display_json():
    json_list = request.get_json()
    for data in json_list:
        dumped = dumps(data)
        print(dumped)
    return ""


if __name__ == '__main__':
    app.run()

肝になるのは”Display_json()”という関数だけです。Event Webhookでは複数のJSONが配列にまとめられてPOSTされるので、forループで配列内のJSONを順次表示させています。
このPythonスクリプトを実行すると、ローカルの5000番ポートでPOSTを待ち受けてくれます(5000番ポートはFlaskのデフォルトポートです)。”show_events.py”という名前で保存して実行した結果がこちらです。

$ python show_events.py 
 * Serving Flask app "show_events" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

ただ、これだけだとローカルで閉じているためEvent WebhookのPOST先として指定できません。そこで、ローカルのWebサービスをhttpsのURLで公開できるServeoというサービスを用いて、5000番ポートにHTTPリクエストを転送(トンネル)してもらいましょう。sshが使える環境であれば、新しくターミナルを立ち上げて下のコマンドを実行するだけです。

$ ssh -R <指定したいサブドメイン>:80:localhost:<ポート番号> serveo.net

ここでは<ポート番号>は5000、<指定したいサブドメイン>は何でもよいのでwebhooktestとしておきます。

Forwarding HTTP traffic from https://webhooktest.serveo.net
Press g to start a GUI session and ctrl-c to quit.

と返ってきたら、PythonのWebアプリがhttps://webhooktest.serveo.net
というURLで公開できたことになります。
(ブログ公開時点でServeoがダウンしてしまっているようです。これを使わない方法もあるので、最終段落のリンクを参照ください。)

いよいよ、Event Webhookの設定をして挙動を確認しましょう。ダッシュボードの左側にあるSettingsからMail Settingsを選び、Event Notificationを選択します。OFF/ONが選べるのでONにし、右側の”edit”を押して、”HTTP POST URL”に先ほど設定したURLを入力します。最後に、”Test Your Integration”という青いボタンをクリックします。

Event Webhookの設定手順

Event Webhookの設定手順

これで、確認用のデータがServeoのURLにPOSTされ、それがローカルの5000番ポートにトンネルされ、Pythonスクリプトで処理が行われるはずです。ターミナルを確認してイベントのJSONが表示されれば成功です!
この状態のままSendGridからメールを送れば、そのメールのイベントもターミナルに表示されます。

ターミナル

確認用のイベントのJSONがターミナルに表示されたところ

ちなみにEvent Webhookで遊んでいて気がついたことですが、同じイベントが複数回POSTされることがあるようです(参考:公式ドキュメント)。各イベントは”sg_event_id”というユニークなIDを持つので、同じsg_event_idのものが複数POSTされたら2つ目以降は無視するような処理があると良いと思います。

今回はメールのイベント情報の確認方法について学びました。個人的には、(ほぼ)初めてWebフレームワークに触れられたというのも収穫でした。正直なところHTTPはURLの先頭にあるおまじないだ、ぐらいのITリテラシーしかなかったので、Event Webhookを知ることを通じてHTTPリクエストなどネットワークの基礎も学べて、これまでの自分の無知を実感する日々です(笑)。

今回はWebフレームワークを使いましたが、Event Webhookの挙動を確認する程度であれば、上の方法以外にも色々な方法があります。使わない理由はない機能ですので、試してみてはいかがでしょうか。

アーカイブ

メールを成功の原動力に

開発者にもマーケターにも信頼されているメールサービスを利用して、
時間の節約、スケーラビリティ、メール配信に関する専門知識を手に入れましょう。