Webhook APIを使ってGoogle Cloud Functionsを呼び出す

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

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

今回はGoogle Cloud FunctionsをWebhook APIと組み合わせて使ってみます。

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

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

Webhook設定ダイアログ

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

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

const functions = require("@google-cloud/functions-framework");

functions.http("helloHttp", (req, res) => {
    console.log(req.body);
    res.send(`Hello ${req.query.name || req.body.name || "World"}!`);
});

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

ログを確認する

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

{
    "filter": "from@example.com",
    "headers": [
        {
            "name": "Return-Path",
            "value": "<user@example.jp>"
        },
        {
            "name": "DKIM-Signature",
            "value": "v=1; a=rsa-sha256;...Q=="
        },
        {
            "name": "X-Proofpoint-GUID",
            "value": "4p9On8WGQfqvpaXY6KJnDRbwArNbk9SF"
        },
        {
            "name": "X-Persimmon",
            "value": "[%%...%%]"
        },
        {
            "name": "Received",
            "value": "from ...; Wed, 21 Dec 2022 12:56:55 +0000 (UTC)"
        },
        {
            "name": "X-Proofpoint-ORIG-GUID",
            "value": "4p9On8WGQfqvpaXY6KJnDRbwArNbk9SF"
        },
        {
            "name": "From",
            "value": "管理者 <admin@example.com>"
        },
        {
            "name": "Message-Id",
            "value": "<E96D9EE1-015B-4A03-9971-7772B4282A3E@example.com>"
        },
        {
            "name": "Subject",
            "value": "テキストメールテスト"
        },
        {
            "name": "Date",
            "value": "Wed, 21 Dec 2022 21:56:38 +0900"
        },
        {
            "name": "X-Mailer",
            "value": "Apple Mail (2.3731.300.101.1.3)"
        },
        {
            "name": "Delivered-To",
            "value": "admin@example.com"
        },
        {
            "name": "X-Proofpoint-Virus-Version",
            "value": "vendor=...signatures=0"
        },
        {
            "name": "X-Proofpoint-Spam-Details",
            "value": "rule=notspam...106"
        },
        {
            "name": "To",
            "value": "admin@example.com"
        },
        {
            "name": "Mime-Version",
            "value": "1.0 (Mac OS X Mail 16.0 \\(3731.300.101.1.3\\))"
        },
        {
            "name": "Content-Type",
            "value": "multipart/alternative;\tboundary=\"Apple-Mail=_756F623C-E817-4A52-80EF-D35AF4AE84CB\""
        }
    ],
    "subject": "テキストメールテスト",
    "envelope-to": "admin@example.com",
    "server_composition": "pro",
    "html": "<html><head><meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\"></head><body style=\"overflow-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;\"><div>テキストメールです。</div><div><br></div><div><b>HTML文</b>です。</div></body></html>",
    "text": "テキストメールです。\r\n\r\nHTML文です。",
    "envelope-from": "user@example.jp"
}

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

まとめ

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