最近は呼吸するかの如く 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 だとサーバいらずで簡単に実現できるわけです。
この Parse API ですが、デモアカウントか Silver 以上の契約じゃないと使えないので注意。日本円で 8000 円ぐらいでちょっとお高く感じますが、SMTP と POP サーバを立てるのに比べると、手間も費用も掛からないと思いますよ。
しかし、使い方は非常に簡単。ドキュメントは長々と書いてますが、以下の 2 ステップで設定完了です。
- 対象ホストの MX レコードを mx.sendgrid.net に変更する
- Parse API の設定ページからホスト名とコールバック URL を設定する
設定ページも以下のように非常にシンプルです。
ホスト名とコールバック 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 だけで十分だと思うので、メールサーバを立てる必要が完全に無くなるのではないかと思います。