Webhook APIを使ってGmailのようなエイリアスメールアドレスを処理する

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

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

Gmailでは mail@smtps.jp のようなアドレスの他、 mail+aaa@smtps.jp のように + 記号を使ってエイリアスを作成できます。今回はCustomers Mail Cloudでも同様の処理を行えるか試してみました。

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

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

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

この時、通知条件を次のように設定します。

  • TO : mail+[0-9a-zA-Z]+@smtps.jp

これは正規表現になります。+は正規表現の記号なので、mail+という文字で判別する場合には mail+ とバックスラッシュを付ける必要があります。その後、[0-9a-zA-Z]+ という指定で、0〜9またはa〜z、A-Zの一文字以上が来る設定としています。その後は@以降のメールドメインになりますが、.(ドット)も正規表現上の記号なので、 . としています。これだけ覚えておけば簡単な正規表現は記述できるでしょう。

作成した正規表現が正しいかどうかは Regex Test Drive | 正規表現オンラインテストサイト のようなサイトで確認できます。

メールを受信してみる

では実際に受信した場合になります。まずは mail+111aa@smtps.jp に送った場合です。以下はPHPで出力した例です。 envelope-to にアドレスが入っています。

Array
(
    [server_composition] => sandbox
    [filter] => mailinglist
    [headers] => [...]
    [subject] => もう一度メールテスト
    [envelope-from] => admin@smtps.jp
    [envelope-to] => mail+111aa@smtps.jp
    [text] => メール
    [html] => <div dir="ltr">...</div>
    [attachments] => 0
)

同様に mail+test@smtps.jp に送った場合です。こちらもWebhookが実行されています。

Array
(
    [server_composition] => sandbox
    [filter] => mailinglist
    [headers] => [...]
    [subject] => もう一度メールテスト
    [envelope-from] => admin@smtps.jp
    [envelope-to] => mail+test@smtps.jp
    [text] => メール
    [html] => <div dir="ltr">...</div>
    [attachments] => 0
)

正規表現にマッチしなかったメールについて

条件にマッチしないメールの場合、Webhookはそもそも呼ばれません。Webhookが呼ばれなければ、そもそも送信されたのかどうかも分かりませんので注意してください。もしどんなメールでも取得したい場合にはTOを .* と指定すればいいですが、アプリケーション側で判別することになるでしょう。

まとめ

Webhookを使えば、メール受信をフックしたアプリケーション実行が簡単に実現できます。ぜひ実装してみてください。

受信サーバ | Customers Mail Cloud