Google App EngineからSendGridを使うためのベストプラクティス

Google App EngineからSendGridを使うためのベストプラクティス

この記事は 5 Best Practices for Using SendGrid With Google App Engine の抄訳です。

SendGridはGoogle Cloud Platformパートナープログラムに参加しています。SendGridを使うことでGoogle App Engine上のアプリケーションに対して非常に簡単にメール配信機能を組み込むことができます。また、SendGridはメール配信に関する統計データやメールの送受信および分析のためのAPIを提供しています。本記事では、Google App EngineからSendGridを利用する際の5つのベストプラクティスをご紹介します。

1. はじめに

Google App Engineを利用する開発者はSendGridを利用することで無料でメールを送信することができます。以下のサンプルを試す前に、SendGridの新規会員登録を行ってください。

2. SendGridクライアントライブラリを使用する

SendGridを通じてメールを送信するためには次の2つの方法があります。

  • SMTPサーバへの接続設定を変更する
  • Web APIを使用する
  • いずれの方法でも同じ機能を実現できますが、Web APIはより簡単に利用することができます。一般的なプログラミング言語については、HTTPコールをラッピングしたクライアントライブラリもありますので、さらに手順を簡略化することができます。
    SendGridはGoogle App Engine上でJavaもしくはPythonを利用する開発者向けにライブラリを提供しています。それぞれ使い方をご紹介します。

Python

SendGrid公式Pythonライブラリをコピーしてプロジェクト内のsendgridサブディレクトリ配下に配置してください。以下のようなコードでライブラリをインポートして使用することができます。

from sendgrid import Sendgrid
from sendgrid import Message
# make a secure connection to SendGrid
s = sendgrid.Sendgrid(”, ”, secure=True)
# make a message object
message = sendgrid.Message(“from@mydomain.com”, “message subject”, “plaintext message body”, “<strong>HTML message body</strong>”)
# add a recipient
message.add_to(“someone@example.com”, “John Doe”)
# use the Web API to send your message
s.web.send(message)

Java

SendGrid.javaをsrcディレクトリ配下にコピーしてください。このクラスをインポートしてSendGridインスタンスを生成することで簡単にメールを送信することができます。

import packageName.Sendgrid
// set credentials
Sendgrid mail = new Sendgrid(“”,”");
// set email data
mail.setTo(“foo@bar.com”)
.setFrom(“me@bar.com”)
.setSubject(“Subject goes here”)
.setText(“Hello World!”)
.setHtml(“<strong>Hello World!</strong>”);
// send your message
mail.send();

3. Event Webhookを使用する

アプリケーションからメールを送信し始めると、そのパフォーマンスを知りたくなってくるでしょう。StatisticsはSendGridの機能の中で最も利用されている機能の一つです。一方、「全てのデータを見たい」時に威力を発揮するのがEvent Webhookです。これにより得られるデータの利用方法は様々ですが、一般的には独自で開発したダッシュボード上にメールの分析データを表示したり、配信停止リクエストや迷惑メール報告に即座に対応するために利用します。より進んだユーザは、例えば直近2ヶ月間にクリックまたはメールを開封した宛先にのみメールを送信することで、エンゲージメントを向上させるために利用しています。

Event WebhookはSendGridのシステム上でイベントが記録されると、JSON形式でアプリケーションに通知します。この通知を受けて、アプリケーション側で何らかの処理を実行したり、イベントデータ自体を保存したりすることができます。

9種類のイベント

  • Processed(配信準備) — SendGrid側でメッセージが受信され、配信準備が完了しました
  • Dropped(ドロップ) — エラーもしくは不正なアドレスだったため配信されませんでした
  • Delivered(配信) — メッセージは受信側サーバに受け付けられました(受信トレイに入ったという意味ではありません)
  • Deferred(遅延) — 受信側サーバから一時的に拒否されました
  • Bounce(バウンス) — 受信側サーバが受信できません(しません)でした
  • Open(メールの開封) — 受信者がHTMLメッセージを開封しました(画像が読み込まれました)
  • Click(クリック) — 受信者がメッセージ内のリンクをクリックしました
  • Spam Report(迷惑メール報告) — 受信者がメッセージを迷惑メールとして扱いました
  • Unsubscribe(配信停止) — 受信者が配信停止リンクをクリックしました

Event Webhookの有効化

これら9つのイベントを利用することでアプリケーションのメール機能はほぼ完全なものになります。このデータをアプリケーション側で利用するために、Event Webhookの設定を行う必要があります。

Event Notification設定画面

  • SendGridのダッシュボードにログインしてEvent Notification Appを有効化します
  • Event Notification Appの設定を変更します
  • 通知したいイベントを選択します(全てのイベントを選択しても構いません)
  • 通知を受信するGoogle App EngineアプリケーションのエンドポイントURLを入力します

「Save」ボタンをクリックして変更を保存すると、指定したアプリケーションに選択したイベントがJSON形式で通知されます。

JSONによるイベント通知

一つのメッセージは複数のイベントを発生させます。各イベントは配列に格納されて通知されますが、一つ一つのイベントはシンプルなJSON形式です。

例えば、Openイベントの例を以下に示します。

{"timestamp": "1234567890", "email": "adam@example.com", "event": "open"}

いくつかのイベントは追加のデータ(スターテスコードやクリックされたURLなど)を含む場合があります。全てのデータフィールドについてはEvent Webhookのドキュメントを参照してください。日本語のドキュメントもご用意していますので是非ご覧ください(ご利用登録が必要です)。

短時間に複数のイベントが発生した場合、毎秒もしくは1MBに到達のいずれか早いタイミングでまとめて通知されます。

[
    {"timestamp": "1234567890", "email": "adam@example.com", "event": "open"},
    {"timestamp": "1234567890", "email": "eve@example.com", "event": "delivered"},
    {"timestamp": "1234567890", "email": "able@example.com", "event": "processed"},
]

4. カテゴリとユニーク引数の設定

統計データを取得する目的でEvent Webhookを使う場合、「カテゴリ」と「ユニーク引数」を使用することでさらに利用しやすくなります。メールを送信する際にSMTPヘッダまたはWeb APIを使用してカテゴリとユニーク引数を追加することができます。これらは、後でメールのサブセット単位でデータ分析をしたり、個々のメールデータを識別するために利用することができます。

  • カテゴリ
    メールのタイプ毎にタグ付けすることによってメールデータの分析の役に立ちます。例えば、パスワードリセットに関するメッセージを除いてデータ分析したいと思うかもしれません。または、コホート分析やユーザのセグメント分けを行いたいと思うかもしれません。カテゴリは無制限に作成することができ、自由にメールの分析を行うことができます。
  • ユニーク引数
    ユニーク引数はメールにデータを追加して個々のメールを識別するために使用します。例えば、登録済みユーザIDをメールに含めることで、メールとアカウントの紐付けを簡単にすることができます。

まとめると、カテゴリはメールのグループ化に利用され、ユニーク引数は各メールの識別に利用することができます。

カテゴリとユニーク引数はx-smtpapiヘッダにJSON形式で設定することができます。

{
    "category": "Example Category",
    "unique_args": {
        "user_id": 1235,
        "first_name": "Pedro"
    }
}

複数のカテゴリを指定する場合、配列で指定します。

{
    "category": [
        "rocks",
        "rivers",
        "trees"
    ]
}

SendGrid公式ライブラリを使用した場合、カテゴリやユニーク引数を追加するのにJSONフォーマットについて考える必要はありません。

Python

message = sendgrid.Message("from@mydomain.com", "subject", "plain body", "&lt;strong&gt;Html here&lt;/strong&gt;")
# set two categories for this message
message.add_category(["Category 1", "Category 2"])
# set 'Customer' to a value of 'Someone'
message.add_unique_argument("Customer", "Someone")

Java

Sendgrid mail = new Sendgrid("","");
// set two categories for this message
mail.addCategory("Category 1");
mail.addCategory("Category 2");
// set 'Customer' to a value of 'Someone'
mail.addUniqueArgument("Customer", "Someone");

5. Parse Webhookでインタラクティブに

SendGridでメール送信できることはよく知られていますが、実はメールを受信できることはあまり知られていません。メール受信機能であるParse Webhookはアプリケーションを強力かつインタラクティブにします。例えば、顧客からのメールでサポートチケットの処理を自動化したり、外出先の従業員が送信するメールからデータを収集するために利用できます。また、NudgeMailのリマインダサービスはParse Webhook上に構築されています。

Event Webhookと同様、Parse Webhookも何か新しいイベントが発生した際にアプリケーションにデータを送信します。Parse Webhookの場合、予め設定したドメイン宛にメールが届いたタイミングで送信されます。なお、Parse Webhookを使う場合は事前にDNSのセットアップを行う必要があります。

DNSのセットアップ

Parse Webhookで受信するメールアドレスのドメイン(またはサブドメイン)のMXレコードの値を「mx.sendgrid.net」に変更します。全ての受信メールはSendGridに流れるため、既存のメールを受信しているドメインを使用しないように注意してください。

全世界のDNSサーバに設定変更が反映されるまで数分から数時間かかる場合があるため、DNSの設定変更は余裕を持って行うことが重要です。

エンドポイントの設定

SendGridアカウントでダッシュボードにログインしてParse Webhookの設定画面を表示してください。メールをデータとして受信するエンドポイントを追加するために、以下の設定を行います。

Parse Webhook設定画面

  • 「Hostname」にはメールのドメイン(またはサブドメイン)を設定します。ここに送信されたメールがパースされます
  • 「URL」にはメールをデータとして受信するGoogle App Engineのアプリケーションのエンドポイントを設定します
  • 「Spam Check」は送信されるメールのうち迷惑メールの受信を制限するためのオプションのフィルタです
  • 「Add host & URL」ボタンをクリックすると「Hosts & URLs」一覧に設定が追加されます

メールをJSONとして受信する

DNSの設定変更が反映され、エンドポイントが有効になると設定したドメイン宛のメールの内容がエンドポイントにPOSTされます。POSTの内容はmultipart/form-data形式です。これをパースすることで以下のようなプログラムから扱いやすいJSON形式でメールの内容を取り出すことができます。

{
    "from": "adam@example.com",
    "to": "eve@example.com",
    "subject": "Parse API example",
    "html": "&lt;p&gt;Body of email in HTML (if set by sender)&lt;/p&gt;",
    "text": "Text body of email (if set by sender)"
}

POSTされるデータにはさらに多くのフィールド(例えば添付ファイルなど)が存在します。全てのフィールドについてはParse Webhookのドキュメントを参照してください。日本語のドキュメントもご用意していますので是非ご覧ください(ご利用登録が必要です)。
これでSendGridを使って、メールの送信に加え受信もできるようになりました。

さいごに

今回ご紹介した5つのベストプラクティスを実践すると立派なメールのパワーユーザです。是非ご利用登録およびライブラリをダウンロードして、Google App EngineからSendGridをお試しください!