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でできることなら何でもメールをきっかけに起動できるようになる、ということだ。

完成形のイメージ

最終的に出来上がるのは、こういうパイプラインである:

  1. 誰かが[email protected]にメールを送る。
  2. KaiMailがそれを受信し、ヘッダー・本文・添付ファイルを含むメール全体をJSONとしてZapierにPOSTする。
  3. 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を発行する。

  1. Zapierにログインし、Create a Zapをクリックする。
  2. トリガーの検索欄に「Webhooks by Zapier」と入力して選択する。

Webhooks by Zapierをトリガーアプリに選択する画面

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

ZapierからCatch Hook URLをコピーする画面

Zapierのエディタは開いたままにしておく。KaiMail側の設定を済ませてから、トリガーのテストに戻ってくる。

ステップ2―KaiMailでWebhookメールボックスを設定する

次にKaiMail側のメールボックスを、先ほどのZapier URLに向ける。

  1. KaiMailのダッシュボードにログインし、Routesを開く。
  2. 使いたいドメイン(例: yourdomain.com)をクリックする。

Add MailboxボタンのあるDomain detailページ

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

Webhookルートタイプを選択したAdd Mailboxフォーム

  1. Add Mailboxをクリックする。

KaiMail側はこれで完了だ。このアドレスに届いた全てのメールが、JSONとしてZapierにPOSTされるようになる。

Tip: 後で署名検証を行いたい場合(本ガイド末尾のオプションセクションを参照)、メールボックスのEditを開いてWebhook Signing Secretを表示し、安全な場所にコピーしておく。基本的なZapier連携には不要である。

ステップ3―テストメールを送って動作を確認する

新しいメールボックス宛に実際のメールを送り、接続を確認する。

  1. 任意のメールクライアント(Gmail、Outlook、スマホのメールアプリなど)から、新しいアドレスに向けてメールを送る。件名は「Zapier test」など、後で見分けやすいものにしておく。
  2. Zapierのエディタに戻り、Test triggerをクリックする。
  3. ZapierがKaiMailから受け取ったデータを表示する。以下のようなフィールドが見えるはずである:
  4. headers__Subject: メールの件名
  5. headers__From: 送信者のアドレス
  6. body_text: プレーンテキスト本文
  7. body_html: HTML本文(存在する場合)
  8. envelope__sender: SMTPエンベロープの送信者
  9. account__domain: 自分の独自ドメイン

KaiMailからのフィールドをパースして表示したZapierのテスト画面

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. 入力欄をクリックする(または右端の+ボタンを押す)。
  2. ドロップダウンが開き、前のステップから渡されたデータがステップ番号でグループ化されて表示される。
  3. 「1. Catch Hook in Webhooks by Zapier」を展開する。
  4. 使いたいフィールドをクリックする。色付きの「pill」(トークン)として挿入される。リテラルの文字列ではない、というのがポイントだ。

落とし穴: 入力欄を空のままにしてもZapierはアクションを実行し、成功として報告する。ただし書き込まれる値は空である。テストが「成功」したのに、Slackのメッセージや行が空っぽ、というケースは大抵この「pillを差し込み忘れ」が原因だ。

トリガーの下にある+をクリックしてアクションステップを追加する。以下によく使う2つの例を示す。

例―Google Sheetsに記録する

Zapier側を触る前に、書き込み先のGoogle Sheetを作っておく。1行目には、これから取り込みたいKaiMailのフィールドに対応する列ヘッダーを入れる。例えばenvelope__senderheaders__Subjectbody_texttimestampなど。ヘッダー名は読みやすければ何でもよい。

Zapier側ではこう進める:

  1. Google Sheetsを検索して選択する。
  2. アクションイベントとしてCreate Spreadsheet Rowを選ぶ。
  3. Googleアカウントを接続する。
  4. Configureタブで:
  5. Drive: 対象のスプレッドシートが置かれているGoogle Driveを指定する。
  6. Spreadsheet: 先ほど作成したシートを選ぶ。
  7. Worksheet: 使うタブを選ぶ(通常はSheet1)。
  8. ここでZapierが列ヘッダーを読み取り、列ごとに1つの入力欄を表示する。それぞれの欄は「この列に何を書き込むか」を聞いている、と思えばよい。+データピッカーで、トリガーから渡された対応するKaiMailのフィールドを挿入する。おすすめのマッピングはこうなる:
列ヘッダー/入力欄 トリガーから挿入する値
envelope__sender envelope__sender
headers__Subject headers__Subject
body_text body_text
timestamp timestamp

列ヘッダーとトリガーフィールドの名前が完全に一致していても、pillは手動で挿入しなければならない。Zapierは勝手にマッチングしてくれない。

作業が終わると、Configureパネルは下のようになる。4つの入力欄それぞれに、テストメールから取り出した実際の値を持つ色付きのpillが入っているはずだ:

KaiMailのフィールドをpillとしてマッピングしたGoogle Sheetsアクション

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

KaiMailのデータで作成されたGoogle Sheetsの新しい行

ここが正念場だ。Zapをオンにすれば、これ以降、KaiMailのWebhookメールボックスに届く全てのメールが、自動的にこのスプレッドシートに流れ込んでいく。

もう一つの例―Slackに通知を送る

  1. Slackを検索して選択する。
  2. アクションイベントとしてSend Channel Messageを選ぶ。
  3. まだ未接続ならSlackアカウントを接続する。
  4. Configureタブで:
  5. Channel: 投稿したいSlackチャンネルを選ぶ。
  6. Message Text: メッセージ欄をクリックし、+データピッカーでKaiMailのフィールドを通常の文章の間に挿入する。エディタ上では最終的に次のような形になる。下のハイライトされている部分はそれぞれ挿入されたpillで、タイプした文字列ではない:

    New email from {envelope__sender} Subject: {headers__Subject} Body: {body_text}

  7. Continueを押してTest stepを実行する。数秒以内に、指定したチャンネルに実際のSlackメッセージが投稿されるはずである。

ステップ5―Zapをオンにする

テストが成功したら:

  1. Publishをクリックする(またはZapをOnに切り替える)。
  2. Zapが本番稼働を開始する。これ以降、KaiMailのWebhookメールボックスに届くメールは、すべて自動でこのワークフローを起動する。

Zapが有効化されて稼働中の画面

もう一通テストメールを送り、本番でエンドツーエンドの流れが動いていることを確認する。

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 添付ファイルのリスト。各要素にfilenamecontent_typesize、ダウンロード用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-Signaturesha256=<hex digest>形式で送られる。

基本的なZapier連携の用途では、署名検証は必須ではない。Catch Hook URLは推測困難なユニークURLである。ただし、機微なデータを扱っていて余分なセキュリティレイヤーを追加したい場合は、Code by Zapierステップ(有料プラン必須)でHMAC-SHA256署名を検証できる。

トレードオフの話を一つしておく。署名検証にはペイロードの正確な生バイト列が必要になるので、トリガーをCatch HookからCatch Raw Hookに変える必要がある。Catch Raw Hookでは、パース済みのheaders__Subjectbody_textなどの代わりに、ボディ全体が単一のrawBodyフィールドとして渡される。そのため、自分で軽くJSONパースをすることになる。

セットアップは以下のとおり:

  1. トリガーをWebhooks by Zapier → Catch Raw Hookに変更する(URLは同じものを使い続ける)。
  2. トリガーの後にCode by Zapierステップを追加し、Run Javascriptを選ぶ。
  3. 入力データを設定する:
  4. signatureheaders__x_kai_webhook_signatureにマップする(ZapierはHTTPヘッダーを小文字化しアンダースコアに変換する)
  5. payload → Catch Raw HookトリガーのrawBodyにマップする
  6. secret → KaiMailメールボックスの編集画面に表示されているWebhook署名シークレットを貼り付ける
  7. 以下のコードで署名を検証し、後続ステップ用にメール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ステップで返したフィールド(subjectfromなど)は、後続のアクションステップで入力として参照できるようになる。

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署名、扱いやすいダッシュボードを提供する。無料で始められる。クレジットカード登録不要。