しばやん雑記

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

SendGrid の Inbound Parse Webhook を ASP.NET MVC から簡単に使うためのヘルパーを作った

以前に SendGrid の Parse API を使ってメールの受信をフックする - しばやん雑記 で使ったことがある SendGrid の Inbound Parse Webhook は、簡単にメールの受信が出来てとても便利なのですが、送信されるパラメータが多く、部分的に JSON だったりもするので、簡単に使うためにヘルパークラスを作ってみました。

ちなみに Inbound Parse Webhook のドキュメントは以下の通り。当然ながら英語です。*1

Inbound Parse Webhook - SendGrid Documentation | SendGrid

今回は ASP.NET MVC を使って Parse Webhook 向けにモデルバインダと属性を用意しました。サンプルコードは既に GitHub にて公開してあります。

折角なので、それぞれについて簡単に使い方を紹介しておきます。

ParseModelBinder クラス

Webhook の呼び出しと同時に渡されるパラメータをいい感じにクラスにバインドする ParseModelBinder と、その器である ParseInfo クラスを用意しました。

使い方は以下のようにとてもシンプルです。

public class WebhookController : Controller
{
    [HttpPost]
    public ActionResult Index(ParseInfo model)
    {
        
        return new HttpStatusCodeResult(200);
    }
}

ParseInfo クラスに ModelBinder 属性を付けてあるので、普通にメソッドの引数として受け取るだけです。

実際にメールを受信した際には、以下のようにデータがバインドされた形で渡されます。

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

ParseInfo には扱いやすい形でデータを入れているので、空メールのハンドリングや添付ファイルを利用するアプリケーションなどで便利に使えると思います。

ParseTo 属性

Parse Webhook では特定のホスト宛てのメールを全て同じエンドポイントで受信するので、どのアドレス宛に送られたのかは Webhook 側で判断する必要があります。

しかし、やはりちょっとめんどくさいと思ったので ASP.NET MVC の ActionMethodSelector 属性を継承した ParseTo 属性を実装しました。コンストラクタで指定したメールアドレス宛てのメールのみ、そのアクションが実行されるようになります。

これもコードは以下のようにシンプルです。

public class WebhookController : Controller
{
    [HttpPost]
    [ParseTo("info@shibayan.jp")]
    public ActionResult Index(ParseInfo model)
    {
        return new HttpStatusCodeResult(200);
    }

    [HttpPost]
    [ParseTo("web@shibayan.jp")]
    public ActionResult Index(string to, ParseInfo model)
    {
        return new HttpStatusCodeResult(204);
    }
}

実際にメールを送り、ngrok を使って確認してみました。

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

送信先メールアドレスと同じ値の ParseTo 属性が付いているアクションが呼ばれているのが確認出来ました。

メールを受信したタイミングで何らかのアクションを実行したいという要求は思った以上にあると思うので、これからも Parse Webhook を便利に使っていきたいですね。

*1:KKE に相談すれば日本語のドキュメントをくれるのかもしれないけど