Webhook APIを使ってAWS Lambdaを呼び出す

Customers Mail Cloudではプログラム側からデータを取得したり、メールを送信するWeb APIの他に、Customers Mail Cloudでメールを受信した時にイベントを伝えてくれるWebhook APIが用意されています。

Webhook APIを使うことで、自前でメールサーバを立てずにメール受信のタイミングでシステムを起動させられるようになります。メールサーバを安定して動作させ続けるのはメンテナンスコストが大きいですが、Customers Mail Cloudを使うことで簡単にメールと連携したシステムが作れるようになるでしょう。

今回はAWSのAPI GatewayとLambdaをWebhook APIと組み合わせて使ってみます。

フォーマットはJSONとマルチパートフォームデータ

Webhookの形式として、JSONとマルチパートフォームデータ(multipart/form-data)が選択できます。この二つの違いは、添付ファイルがあるかどうかです。JSONの場合、添付ファイルは送られてきません。Lambdaで使う場合、添付ファイルは使えないのでJSONを選択してください。

f:id:moongift:20200227212807p:plain
Webhook設定ダイアログ

内容を確認するためのコード

今回は送られてくる内容を確認するため、bodyを出力してみます。

exports.handler = async (event) => {
    // TODO implement
    console.log(event.body);
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

この状態でメールを送ってみます。

ログを確認する

Cloud Watchのログを見ると、次のようなデータが送られているのが分かります(一部)。

{
    "filter": "Lambda",
    "headers": [
        {
            "name": "Return-Path",
            "value": "<admin@smtps.jp>"
        },
        {
            "name": "DKIM-Signature",
            "value": "..."
        },
        {
            "name": "X-Persimmon",
            "value": "..."
        },
        {
            "name": "Received",
            "value": "..."
        },
        {
            "name": "From",
            "value": "Atsushi Nakatsugawa <atsushi@smtps.jp>"
        },
        {
            "name": "Message-ID",
            "value": "<CAMU...com>"
        },
        {
            "name": "Date",
            "value": "Thu, 21 May 2020 15:49:10 +0900"
        },
        {
            "name": "Subject",
            "value": "テストメール"
        },
        {
            "name": "Delivered-To",
            "value": "lambda@mx.smtps.jp"
        },
        {
            "name": "To",
            "value": "lambda@mx.smtps.jp"
        },
        {
            "name": "Content-Type",
            "value": "multipart/alternative; boundary=\"00000000000094e53005a622e902\""
        }
    ],
    "subject": "テストメール",
    "envelope-to": "lambda@mx.smtps.jp",
    "server_composition": "sandbox",
    "html": "<div dir=\"ltr\">...</div>",
    "text": "これはテストメールです",
    "envelope-from": "admin@smtps.jp"
}

データをJSONで受け取れていますので、FromやToを使ってデータベースを検索するといった仕組みを作るのも簡単でしょう。

まとめ

AWS Lambdaならば、実行された時だけ呼び出されるので課金額もごくわずかです。サーバレスな環境として、セキュアに運用できるでしょう。ぜひCustomers Mail Cloudと組み合わせてみてください。