SendGrid 新人成長記 第七回 Inbound Parse Webhookを用いてメールを受信する

SendGrid 新人成長記

新人がTwilio SendGridの機能を試してみる連載の第七回目です!Twilio SendGridは名前の通りメール送信に特化したサービスで、これまでの連載でもメールを送ることに着目して機能を紹介してきました。その一方で、少し設定をすればメールの受信も可能とのこと。今回は、”Inbound Parse Webhook”というメール受信の機能を試してみます。この機能は、指定したドメインに送られてきたメールをTwilio SendGridが代わりに受信して、その内容を指定したURLへPOSTするものです。Twilio SendGridはGmailやMicrosoft Outlookなどと違って受信メールボックスが用意されているわけではありません。この記事でメール受信の方法を見ていきませんか?

以下の手順で進めていきます。

  1. 受信するメールアドレス(ドメイン)を用意する
  2. Domain Authenticationを設定する
  3. ドメインのMXレコードを設定する
  4. Inbound Parse Webhookの設定をする
  5. POSTされたメールを受け取るアプリケーションを用意する

1. 受信するメールアドレス(ドメイン)を用意する

まず、送信先となるメールアドレスを用意します。後ほどメールの配送先をTwilio SendGridに設定するので、DNSレコードを編集できるドメインを持っている必要があります。本記事では、example.comのドメインを所有していて、mail.example.com宛のメールを受け取る設定で話を進めます。サブドメインとしてつけた”mail.”は説明の都合上のもので、後で述べるように必須という訳ではありません。自分で試すにあたっては、無料でドメインを取得できるサービスFreenomを用いました。

2. Domain Authenticationを設定する

Domain Authenticationは送信ドメイン認証(SPF/DKIM)を設定する機能ですが、Inbound Parse Webhookを利用する際にもセキュリティ上の理由から予め設定が必要になります。設定方法は前回のブログ連載記事を参照してください。

3. ドメインのMXレコードを設定する

次に、ドメインのMXレコード(そのドメインに送られてきたメールをどこに配送するか)をTwilio SendGridに向ける設定をしましょう。これもDNSサービスの管理画面から設定します。イメージとしては以下のような感じです(以下はFreenomの管理画面)。

MXレコードの設定

ここでメールアドレスのドメインを入力しましょう。上のようにmailと入力すれば、mail.example.comが受信用のメールアドレスのドメインになります。ここを空欄にすればメールアドレスのドメインは単にexample.comとなります。
次に、メール配送先としてmx.sendgrid.netを指定します。Priority(優先度)を指定する欄がある場合は数値を入力しましょう(上の例では10)。ない場合は配送先を”10 mx.sendgrid.net”のようにします。これで設定を反映させます。

4. Inbound Parse Webhookの設定をする

ここまでの設定で@mail.example.com宛のメールがTwilio SendGridのメールサーバに届くようになったので、これをInbound Parse Webhookを使ってPOSTさせましょう。

Inbound Parse Webhook

今回も前回のEvent Webhook同様、Pythonスクリプトを使ってPOSTされた内容をローカルのターミナル上に表示させようと思うので、最初にServeoを利用してPOST先のURLを取得します。

$ ssh -R parsetest:80:localhost:5000 serveo.net

これでhttps://parsetest.serveo.netへのPOSTをローカルで受け取れます。
※ 2020/01/20現在、一時的にServeoが使用できない状況になっているようです。

次にInbound Parse Webhookの設定です。ダッシュボードのSettingsからInbound Parseを選び、右上の”Add Host & URL”ボタンをクリックします。下のように、メールアドレスのドメインと、メールをPOSTするURLを入力して、Addボタンを押せば設定が完了します。上同様、”mail”の欄を空欄にしておけばメールアドレスのドメインがexample.comになります。

Add Host & URL

5. POSTされたメールを受け取るアプリケーションを用意する

最後に、POSTされた内容を表示させるPythonスクリプトです。

from flask import Flask, request

app = Flask(__name__)


@app.route('/', methods=['POST'])
def Parse_webhook():
    data = request.get_data()
    print(data)
    return ""


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

やっていることは、単純にPOSTされたデータを取ってきて表示しているだけです。これを実行し、”(適当なユーザ名)@mail.example.com”宛にメールを送信すれば、POSTの中身を見ることができます。ただし、これだとメールのヘッダや本文を含む全ての情報が一緒くたになっていて見にくいです(以下はその一部)。

POSTされたデータ

そこで、ちょっと改良したコードが以下です。

from flask import Flask, request
from cgi import FieldStorage  # 追加
from io import BytesIO  # 追加

app = Flask(__name__)


@app.route('/', methods=['POST'])
def Parse_webhook():
    # POSTされるmultipart/form-dataのデータを処理します
    environ = {'REQUEST_METHOD': 'POST'}
    headers = {'content-type': request.content_type,
               'content-length': request.content_length}
    files = FieldStorage(BytesIO(request.get_data()),
                         headers=headers, environ=environ)
    for f in files.list:  # forループを回して要素ごとにprintします
        s = f'{f.name}\n{f.type}\n{f.value}\n'
        s += '- '*20
        print(s)
    return ""


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

これを実行してメールを送信すると、メール本文やヘッダなどのメールを構成する各要素の名前、MIMEタイプ、中身がずらっと表示されます(以下は上と同じ部分)。他にどんな要素があるかはTwilio SendGrid公式ドキュメント(英語)をご覧ください。

POSTされたデータ(コード改良版)

一見とっつきにくいメール受信機能ですが、空メール送信を契機に会員登録をしたり、送信内容をサービスに反映させたりなど色々な使い道があります。応用すればメールクライアントで確認することもできるので、カスタマイズの幅は広いです。ぜひお試しあれ!

メールを成功の原動力に

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