しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

SendGrid の Parse API を使ってメールの受信をフックする

最近は呼吸するかの如く SendGrid に色々とお世話になっているんですが、実は SendGrid は名前から想像しにくいですが、メール受信の機能も持っています。

今日はそのメール受信機能である Parse API について調べる機会があったので書いておきます。

Inbound Parse - SendGrid Documentation - Email Delivery. Simplified.

要するに、Parse API はとあるホストに送信されたメールを受信して、予め指定していた URL へメールのデータを POST してくれる API です。挙動的には SMTP -> HTTP の変換を行っていると言えば理解しやすいかもしれません。

SendGrid's Parse API: Parsing Incoming Email is Now Faster and Easier

Parse API を使えばガラケー時代によくあった、空メールを送信して登録 URL のリンク付きのメールが送られてくるサービスや、メールを送信するだけでブログや SNS への投稿が出来るといったサービスを簡単に実装することが出来そうです。

メールの受信をトリガーとして別の処理を実行するためには、PHP などでは qmail を使ってスクリプト実行とかやってましたよね。それが Parse API だとサーバいらずで簡単に実現できるわけです。

f:id:shiba-yan:20131004181302p:plain

この Parse API ですが、デモアカウントか Silver 以上の契約じゃないと使えないので注意。日本円で 8000 円ぐらいでちょっとお高く感じますが、SMTP と POP サーバを立てるのに比べると、手間も費用も掛からないと思いますよ。

しかし、使い方は非常に簡単。ドキュメントは長々と書いてますが、以下の 2 ステップで設定完了です。

  • 対象ホストの MX レコードを mx.sendgrid.net に変更する
  • Parse API の設定ページからホスト名とコールバック URL を設定する

設定ページも以下のように非常にシンプルです。

f:id:shiba-yan:20131004175913p:plain

ホスト名とコールバック URL の組み合わせを複数登録できるのがまた良いですね。

SendGrid から先程設定したコールバック先には POST としてメールの情報が送信されるので、特に難しく考えずに ASP.NET の場合は Request.Form プロパティで値が取れます。キー名に関しては公式のドキュメントを参照してください。

例を挙げると ASP.NET MVC の場合は以下のようなコードで受信できます。

// HTML タグとか混ざる可能性があるので検証をオフにする
[ValidateInput(false)]
public ActionResult Callback()
{
    // envelope にメールアドレスの情報が JSON で含まれている
    dynamic envelope = JsonConvert.DeserializeObject(Request.Form["envelope"]);

    // from アドレスを取得
    ViewBag.FromAddress = envelope.from;

    return View();
}

注意点としてはコメントでも書いてあるように、メール情報には HTML タグが含まれることがあるので、POST 値の検証をオフにしないと ASP.NET ランタイムにリクエストを蹴られます。ちなみに 200 以外を返した場合には SendGrid が自動的にリトライをしてくれるみたいなので、そのあたりも安心感がありますね。

そして、Parse API では添付されているファイルもコールバック URL に multipart/form-data の形で送信されるので、簡単に処理が出来ます。

ASP.NET の場合は Request.Files プロパティに HttpPostedFile として格納されるので、サンプルの PHP よりもかなり楽です。

[ValidateInput(false)]
public ActionResult Callback()
{
    // 1 つ目の添付ファイルを取得する
    var attachment1 = Request.Files["attachment1"];

    return View();
}

非常にシンプルなコードで添付ファイルまで取得できます。データを POST で受け取ってしまえば後はこちらで煮るなり焼くなり、好きに処理できるので使い勝手が良いですね。

プログラムからメールの送受信が必要な場合には Parse API だけで十分だと思うので、メールサーバを立てる必要が完全に無くなるのではないかと思います。