ラフィド・ハサン
KaiMailとZapierをつなぐ―Webhookで受信メールを自動化する方法
【プログラミング不要な方法ガイド】KaiMailの受信メールWebhookをZapierに接続する
KaiMailは受信メールを構造化されたJSONとして任意のURLに転送する。Zapierは任意のWebhookをトリガーとしてワークフローを起動する。この2つを組み合わせれば、独自ドメインにメールが届いたときに走らせたい処理はほぼ何でも自動化できる。新規リードをスプレッドシートに記録する、Slackでチームに通知する、サポートチケットを起票する、CRMにデータを流し込む。発想次第である。
本記事ではセットアップを端から端まで通して説明する。コードは不要、所要時間は10分ほどだ。
何が作れるのか
KaiMail + Zapierでよく組まれる自動化の例:
- リード獲得:
[email protected]に届いたメールを、Google Sheetsの新規行やHubSpotのコンタクトに変換する。 - サポートチケット起票:
[email protected]宛のメールから、Zendesk・Freshdesk・Linearでチケットを自動作成する。 - チーム通知: 誰かが
[email protected]にメールを送ったら、SlackやDiscordに通知が飛ぶ。 - CRMの自動更新: キャンペーン用アドレスへの返信を、Salesforce・Pipedrive・Airtableの該当コンタクトに紐づける。
- 書類ワークフロー:
[email protected]への添付ファイルをGoogle DriveやDropboxに自動保存する。 - AIトリアージ: 受信メールをOpenAIやClaudeに渡し、要約・分類・自動返信を行う。
要するに、Zapierでできることなら何でもメールをきっかけに起動できるようになる、ということだ。
完成形のイメージ
最終的に出来上がるのは、こういうパイプラインである:
- 誰かが
[email protected]にメールを送る。 - KaiMailがそれを受信し、ヘッダー・本文・添付ファイルを含むメール全体をJSONとしてZapierにPOSTする。
- Zapierが設定済みのアクションを実行する。通知、データベースへの書き込み、API呼び出し、AIへのプロンプト送信、思いつくものは何でも。
ポーリングの遅延はない。メールが到着した瞬間にZapが発火する。
前提条件
始める前に以下を用意しておく:
- KaiMailのPLUS以上のプラン。Webhook配信はPLUS・PRO・BUSINESSで利用できる。BASIC(無料)プランには含まれない。プラン比較はこちら。
- KaiMailで設定済みの独自ドメイン。MXレコードがKaiMailを向いていること。まだの場合は、ダッシュボードでドメインを追加し、画面に表示されるDNS設定の手順に従う。
- Zapierアカウント。1ステップのZap(トリガー+1アクション)であれば無料プランで足りる。複数ステップのワークフロー、フィルター、後述の署名検証で使うCodeステップを試したい場合は有料プランが必要になる。
ステップ1―ZapierでCatch Hookトリガーを作る
まずZapier側を設定し、KaiMailに渡すURLを発行する。
- Zapierにログインし、Create a Zapをクリックする。
- トリガーの検索欄に「Webhooks by Zapier」と入力して選択する。

- トリガーイベントとしてCatch Hookを選び、Continueをクリックする。
- 「Pick off a Child Key」のステップは空欄のままContinueでよい。
- ここでZapierがカスタムWebhook URLを表示する。
https://hooks.zapier.com/hooks/catch/123456/abcdef/のような形式だ。このURLをコピーしておく。次のステップでKaiMailに貼り付ける。

Zapierのエディタは開いたままにしておく。KaiMail側の設定を済ませてから、トリガーのテストに戻ってくる。
ステップ2―KaiMailでWebhookメールボックスを設定する
次にKaiMail側のメールボックスを、先ほどのZapier URLに向ける。
- KaiMailのダッシュボードにログインし、Routesを開く。
- 使いたいドメイン(例:
yourdomain.com)をクリックする。

- Add Mailboxをクリックする。
- フォームを以下のように埋める:
- Email address: ローカル部を入力する(例:
zapier、notifications、support)。フルアドレスは[email protected]になる。 - Route Type: Webhookを選ぶ。
- Webhook URL: ステップ1でコピーしたZapierのCatch Hook URLを貼り付ける。

- Add Mailboxをクリックする。
KaiMail側はこれで完了だ。このアドレスに届いた全てのメールが、JSONとしてZapierにPOSTされるようになる。
Tip: 後で署名検証を行いたい場合(本ガイド末尾のオプションセクションを参照)、メールボックスのEditを開いてWebhook Signing Secretを表示し、安全な場所にコピーしておく。基本的なZapier連携には不要である。
ステップ3―テストメールを送って動作を確認する
新しいメールボックス宛に実際のメールを送り、接続を確認する。
- 任意のメールクライアント(Gmail、Outlook、スマホのメールアプリなど)から、新しいアドレスに向けてメールを送る。件名は「Zapier test」など、後で見分けやすいものにしておく。
- Zapierのエディタに戻り、Test triggerをクリックする。
- ZapierがKaiMailから受け取ったデータを表示する。以下のようなフィールドが見えるはずである:
headers__Subject: メールの件名headers__From: 送信者のアドレスbody_text: プレーンテキスト本文body_html: HTML本文(存在する場合)envelope__sender: SMTPエンベロープの送信者account__domain: 自分の独自ドメイン

Note: Zapierは入れ子になったJSONのキーをダブルアンダースコアで平坦化する。KaiMailのJSONで
headers.Subjectだったものは、Zapierではheaders__Subjectになる。仕様通りの挙動だ。
「We couldn't find a request」と表示された場合、メールがまだ配送中の可能性があるので、少し待ってからやり直す。それでも出てこない場合は、ドメインのMXレコードがKaiMailを向いているか、メールボックスのRoute TypeがWebhookになっているかを確認する。
なお、KaiMailのWebhookペイロードの構造や署名検証の細かい話は、KaiMail Webhookをテストする方法で詳しく解説している。Python製のローカルレシーバーで中身を確認しておきたい場合はこちらが参考になる。
ステップ4―アクションを追加する
トリガーが動いたところで、アクションを追加する。メールが届いたときにZapierが実際に行う処理だ。
Zapierのフィールドマッピングの仕組み
これはどのアクションでも共通で、初めての人が一番つまずきやすい部分なので先に書いておく。Zapierはトリガーデータをアクションの入力欄に自動入力しない。名前が一致していても、である。 値はひとつずつ、データピッカーを使って明示的に挿入する必要がある。
アクション設定の各入力欄では、こうする:
- 入力欄をクリックする(または右端の
+ボタンを押す)。 - ドロップダウンが開き、前のステップから渡されたデータがステップ番号でグループ化されて表示される。
- 「1. Catch Hook in Webhooks by Zapier」を展開する。
- 使いたいフィールドをクリックする。色付きの「pill」(トークン)として挿入される。リテラルの文字列ではない、というのがポイントだ。
落とし穴: 入力欄を空のままにしてもZapierはアクションを実行し、成功として報告する。ただし書き込まれる値は空である。テストが「成功」したのに、Slackのメッセージや行が空っぽ、というケースは大抵この「pillを差し込み忘れ」が原因だ。
トリガーの下にある+をクリックしてアクションステップを追加する。以下によく使う2つの例を示す。
例―Google Sheetsに記録する
Zapier側を触る前に、書き込み先のGoogle Sheetを作っておく。1行目には、これから取り込みたいKaiMailのフィールドに対応する列ヘッダーを入れる。例えばenvelope__sender、headers__Subject、body_text、timestampなど。ヘッダー名は読みやすければ何でもよい。
Zapier側ではこう進める:
- Google Sheetsを検索して選択する。
- アクションイベントとしてCreate Spreadsheet Rowを選ぶ。
- Googleアカウントを接続する。
- Configureタブで:
- Drive: 対象のスプレッドシートが置かれているGoogle Driveを指定する。
- Spreadsheet: 先ほど作成したシートを選ぶ。
- Worksheet: 使うタブを選ぶ(通常は
Sheet1)。 - ここでZapierが列ヘッダーを読み取り、列ごとに1つの入力欄を表示する。それぞれの欄は「この列に何を書き込むか」を聞いている、と思えばよい。
+データピッカーで、トリガーから渡された対応するKaiMailのフィールドを挿入する。おすすめのマッピングはこうなる:
| 列ヘッダー/入力欄 | トリガーから挿入する値 |
|---|---|
envelope__sender |
envelope__sender |
headers__Subject |
headers__Subject |
body_text |
body_text |
timestamp |
timestamp |
列ヘッダーとトリガーフィールドの名前が完全に一致していても、pillは手動で挿入しなければならない。Zapierは勝手にマッチングしてくれない。
作業が終わると、Configureパネルは下のようになる。4つの入力欄それぞれに、テストメールから取り出した実際の値を持つ色付きのpillが入っているはずだ:

- Continueを押してTest stepを実行する。シートを開くと、テストメールの実際の送信者・件名・本文・タイムスタンプを持つ新しい行が現れるはずだ。行が空のままなら、Configureタブに戻り、各入力欄にpillが入っているか(空欄でないか、リテラル文字列になっていないか)を確認する。

ここが正念場だ。Zapをオンにすれば、これ以降、KaiMailのWebhookメールボックスに届く全てのメールが、自動的にこのスプレッドシートに流れ込んでいく。
もう一つの例―Slackに通知を送る
- Slackを検索して選択する。
- アクションイベントとしてSend Channel Messageを選ぶ。
- まだ未接続ならSlackアカウントを接続する。
- Configureタブで:
- Channel: 投稿したいSlackチャンネルを選ぶ。
-
Message Text: メッセージ欄をクリックし、
+データピッカーでKaiMailのフィールドを通常の文章の間に挿入する。エディタ上では最終的に次のような形になる。下のハイライトされている部分はそれぞれ挿入されたpillで、タイプした文字列ではない:New email from {envelope__sender} Subject: {headers__Subject} Body: {body_text} -
Continueを押してTest stepを実行する。数秒以内に、指定したチャンネルに実際のSlackメッセージが投稿されるはずである。
ステップ5―Zapをオンにする
テストが成功したら:
- Publishをクリックする(またはZapをOnに切り替える)。
- Zapが本番稼働を開始する。これ以降、KaiMailのWebhookメールボックスに届くメールは、すべて自動でこのワークフローを起動する。

もう一通テストメールを送り、本番でエンドツーエンドの流れが動いていることを確認する。
KaiMail Webhookフィールドリファレンス
Zapier上でフィールドをマッピングする際の参考に、各KaiMailフィールドが何を含むかをまとめておく:
| Zapierのフィールド名 | 説明 |
|---|---|
version |
ペイロードスキーマのバージョン(現在は1.0) |
timestamp |
メール処理時のISO 8601タイムスタンプ |
headers__From |
送信者のメールアドレス(From:ヘッダー) |
headers__To |
受信者アドレス(To:ヘッダー) |
headers__Subject |
メールの件名 |
headers__Date |
メールの送信日時 |
body_text |
プレーンテキスト本文。HTMLのみのメールの場合は空 |
body_html |
HTML本文。プレーンテキストのみのメールの場合は空 |
attachments |
添付ファイルのリスト。各要素にfilename、content_type、size、ダウンロード用url(24時間有効)を持つ |
envelope__sender |
SMTPエンベロープの送信者(MAIL FROM)。実際の送信元アドレス |
envelope__recipient |
SMTPエンベロープの受信者(RCPT TO)。自分のメールボックスアドレス |
account__email |
KaiMailアカウントのメールアドレス |
account__domain |
メールを受信した独自ドメイン |
account__mailbox |
メールを受信した個別のメールボックスアドレス |
metadata__authentication_results |
SPF、DKIM、ARCの検証結果 |
添付ファイルについて: KaiMailは添付ファイルそのものではなく、ダウンロード用URLを提供する。URLは署名付きで、24時間で期限切れとなる。Zapで添付ファイルを保存したい場合(例: Google Driveへ)、アクションが早めに走るように設計しておく必要がある。
オプション―Webhookの署名を検証する
KaiMailは全てのWebhookペイロードをHMAC-SHA256で署名し、改ざんされていないことを検証可能にしている。署名はHTTPヘッダーX-KAI-Webhook-Signatureにsha256=<hex digest>形式で送られる。
基本的なZapier連携の用途では、署名検証は必須ではない。Catch Hook URLは推測困難なユニークURLである。ただし、機微なデータを扱っていて余分なセキュリティレイヤーを追加したい場合は、Code by Zapierステップ(有料プラン必須)でHMAC-SHA256署名を検証できる。
トレードオフの話を一つしておく。署名検証にはペイロードの正確な生バイト列が必要になるので、トリガーをCatch HookからCatch Raw Hookに変える必要がある。Catch Raw Hookでは、パース済みのheaders__Subjectやbody_textなどの代わりに、ボディ全体が単一のrawBodyフィールドとして渡される。そのため、自分で軽くJSONパースをすることになる。
セットアップは以下のとおり:
- トリガーをWebhooks by Zapier → Catch Raw Hookに変更する(URLは同じものを使い続ける)。
- トリガーの後にCode by Zapierステップを追加し、Run Javascriptを選ぶ。
- 入力データを設定する:
signature→headers__x_kai_webhook_signatureにマップする(ZapierはHTTPヘッダーを小文字化しアンダースコアに変換する)payload→ Catch Raw HookトリガーのrawBodyにマップするsecret→ KaiMailメールボックスの編集画面に表示されているWebhook署名シークレットを貼り付ける- 以下のコードで署名を検証し、後続ステップ用にメールJSONを再パースする:
const crypto = require('crypto');
const expected = 'sha256=' + crypto
.createHmac('sha256', inputData.secret)
.update(inputData.payload)
.digest('hex');
if (expected !== inputData.signature) {
throw new Error('Invalid webhook signature');
}
const email = JSON.parse(inputData.payload);
output = [{
verified: true,
subject: email.headers.Subject,
from: email.headers.From,
body_text: email.body_text,
envelope_sender: email.envelope.sender,
account_domain: email.account.domain,
}];
このCodeステップで返したフィールド(subject、fromなど)は、後続のアクションステップで入力として参照できるようになる。
Webhookペイロードと署名のより詳しい話は、KaiMail Webhookドキュメントを参照のこと。
トラブルシューティング
Route Typeのドロップダウンに「Webhook」が出てこない Webhook配信にはKaiMailのPLUS・PRO・BUSINESSプランのいずれかが必要だ。BASICプランではEmail Forwardしか表示されない。Webhookを使いたい場合はプランをアップグレードする。
Zapierが「We couldn't find a request」と表示する
Catch Hookをセットアップした後に、正確なメールボックスアドレス(例: [email protected])宛にメールを送ったか確認する。ドメインのMXレコードがKaiMailを向いていること、メールボックスがアクティブ(一時停止されていない)であることもチェックする。
Zapierにデータは出るが、フィールドが空になっている
body_textが空なら、メールがHTMLのみの可能性がある。body_htmlを見るとよい。headers__Subjectが空なら、送信者が件名を入れずに送った可能性がある。
アクションのテストは成功するのに、Slackのメッセージ/Google Sheetsの行が空になる
アクションの入力欄にデータpillを挿入し忘れている。Zapierはトリガーのデータをアクションの入力に自動マッピングしない。各入力欄をクリックし、+データピッカーでトリガーからの値をpillとして挿入する必要がある。ステップ4の「Zapierのフィールドマッピングの仕組み」を参照。
Zapが一度しか動かない(無料プランの制限) Zapierの無料プランは2ステップのZap(トリガー+アクション1つ)と月100タスクまでしかサポートしない。複数のアクション、フィルター、より多い処理量が必要な場合は有料プランが必要だ。
添付ファイルのURLが動かない 添付ファイルのダウンロードURLは24時間で期限切れになる。Zapが遅延している、もしくは古いトリガーデータでテストしている場合は、URLが既に切れている可能性がある。新しいテストメールを送り直す。
ここからどう発展させるか
今作ったものを拡張する方向性をいくつか挙げておく:
- フィルターを追加する: Zapierの「Filter」ステップを使い、特定の送信者・件名・ドメインのメールだけにアクションを限定する。
- 複数アクションを連結する: 同じメールから、スプレッドシートへの記録、Slack通知、CRMへのコンタクト作成をすべてまとめて走らせる。
- AIに渡す: OpenAIやClaudeのステップを挟み、要約や構造化データの抽出、返信案の下書きまで行ってから後続ステップに渡す。
- メールボックスを増やす:
sales@、support@、billing@をそれぞれ別のZapに紐づける。KaiMailのPLUSプランは複数の独自メールボックスに対応しており、PRO・BUSINESSでさらに上限が広がる。 - KaiMailから返信も送る: 有料プランでは独自ドメインからのSMTP送信(ポート587、STARTTLS)にも対応している。ZapierのSMTPアクションと組み合わせれば、同じアドレスから返信を返してループを閉じられる。送信側のセットアップは独自ドメインでのSMTP送信ガイドに詳しい。
まとめ
これで、独自ドメインに届く受信メールとZapierエコシステムの間にリアルタイムのブリッジが手に入った。運用するサーバーもなく、保守するコードもなく、自分のドメインの前段にサードパーティのメールパーサーを置く必要もない。ここでZapierが食べているのと同じWebhookペイロードは、n8nやMake、自前のバックエンド、HTTP POSTを受けられる場所であれば他のどこでも動く。ロックインされる心配はない。
面白いものを作ったら、ぜひ教えてほしい。[email protected]までひと言送ってもらえれば嬉しい。
KaiMailは、独自ドメイン向けの開発者ファーストなメール転送サービスである。自分のドメインでのメール受信・ルーティング・送信、Webhook配信、SMTP submission、DKIM署名、扱いやすいダッシュボードを提供する。無料で始められる。クレジットカード登録不要。