フォームをメールに送る

フォームをメールに送る1 分で読めます

1 つのフォームを複数のメールアドレスに送る

1 つのフォームをチーム全員にメールで送ったり、トピックごとに適切な担当者に振り分けたり。ただし、誰に送るかをフォーム自身には決めさせません。

Preet SutharIkiform 創業者

ダッシュボードで各メンバーをフォームの受信者に追加します。ワークスペースのメンバーはチェックを入れるだけ、それ以外の人は確認リンクで、最大 10 アドレスまでです。全員が、すべての送信データのコピーを個別に受け取ります。営業の質問はある人に、サポートは別の人に送りたい場合は、代わりに Webhook でフィールドをもとに振り分けます。

ここが違う

古い PHP スクリプトや一部のフォームサービスでは、hidden の to や cc フィールドで、フォーム自身が受信者を指定できます。便利ですが、お問い合わせフォームがスパムのリレーになるのもこの仕組みのせいです。ボットが hidden フィールドを書き換えると、サーバーがあなたのドメインから好きな相手にメールを送ってしまいます。Ikiform には受信者のフィールドがありません。誰にメールを送るかはダッシュボードで設定し、ワークスペース外の人は先に確認が必要です。

そのため、ここには 2 つの別々の作業があり、それぞれ別の場所で解決します:

したいこと設定する場所上限
全員がすべての送信データを受け取るフォームの Notifications 設定の受信者フォームごとに 10 アドレス
送信データごとに適切な担当者へ送るフィールドを読んで 1 つのチームにメールする Webhookワークスペースごとに Webhook エンドポイント 3 つ

すべての送信データをチーム全員に送る

1 件の送信データにつき、受信者ごとに 1 通のメールあなたのフォーム1 回の送信Ikiform受信者を決定チェックしたメンバー確認済みのワークスペースのメール外部アドレスリンクで確認済みバウンスまたは確認待ちスキップ送信1 件の送信データにつき、受信者ごとに 1 通のメールあなたのフォーム1 回の送信Ikiform受信者を決定チェックしたメンバー確認済みのワークスペースのメール外部アドレスリンクで確認済みバウンスまたは確認待ちスキップ送信
  1. フォームは Ikiform に 1 回送信します。
  2. Ikiform が受信者リストを作ります。このフォームでチェックしたメンバー(またはワークスペースのデフォルト)に、確認済みの外部アドレスを加えたものです。
  3. 重複は除かれ、リストは 10 件で打ち切られます。
  4. 受信者ごとに別々のメールが届くので、ほかの人のアドレスは誰にも見えません。
  5. 確認待ちのアドレスと、バウンス後に一時停止されたアドレスはスキップされます。
コピーが別々なので、誰かが返信してもほかの人には共有されません。5 人を追加する前に、誰が何に答えるかを決めておきましょう。
  1. ダッシュボードでフォームを開き、Settings、Notifications の順に進みます。Email new submissions がオンになっていることを確認します。
  2. メールを受け取るワークスペースのメンバーにチェックを入れます。表示されるのは、アドレスが確認済みのメンバーだけです。
  3. ワークスペース外の人は、Add someone outside the workspace にアドレスを入力して Send link を押します。フォームごとに 5 件まで追加できます。
  4. 相手に確認してもらいます。確認されるまで、その行には Waiting for confirmation と表示され、何も届きません。

外部の受信者には送信データのフィールドと配信停止リンクが表示されます。アカウントがないので、ダッシュボードへのリンクはありません。メンバーには View submission ボタンが表示されます。誰かが抜けたらその行を削除してください。配信停止した場合は、行も自動で消えます。

10 人を超える場合や、メンバーがよく入れ替わるチームの場合は、Google グループやメールエイリアスのような共有アドレスを 1 つだけ受信者にして、メンバーはそちらで管理してください。

メンバーと外部アドレス

2 種類の受信者は動作が異なるので、誰をどこに追加するかを決めるときに重要です:

Itemワークスペースのメンバー外部アドレス
追加方法フォームでチェックを入れるSend link のあと、本人が確認
メールに表示されるものフィールドと View submission ボタンフィールドと配信停止リンク
ダッシュボードを開けるはいいいえ
メールが止まるときチェックを外したとき、またはワークスペースを抜けたとき行を削除したとき、または本人が配信停止したとき
カウント対象10 アドレスの上限10 アドレスの上限と、フォームごとの外部アドレス 5 件

メッセージに対応する人にはワークスペースの席を用意し、過去の送信データやスパムも見られるようにしましょう。マネージャーや共有の受信箱など、知っておくだけでよい相手には外部アドレスを使います。

トピックごとに送信データを振り分ける

受信者を、訪問者が選んだ内容によって変えることはできません。そうしたい場合は、チームを示すフィールドを追加し、小さな Webhook ハンドラーにアドレスを選ばせます。フォームは次のとおりです:

contact.html
<form action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="post">
  <label for="department">Who should read this?</label>
  <select id="department" name="department" required>
    <option value="sales">Sales</option>
    <option value="support">Support</option>
    <option value="billing">Billing</option>
  </select>

  <label for="name">Name</label>
  <input id="name" name="name" autocomplete="name" required />

  <label for="email">Email</label>
  <input id="email" name="email" type="email" autocomplete="email" required />

  <label for="message">Message</label>
  <textarea id="message" name="message" rows="5" required></textarea>

  <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden />
  <button>Send</button>
</form>

ダッシュボードで department を select フィールドとして定義すれば、送信に含められるのは sales、support、billing だけになります。それ以外を送るボットは 422 validation_failed を受け取り、ハンドラーには届きません。

次にハンドラーです。署名を検証し、department からチームを選び、自分のメールプロバイダー(ここでは Resend)経由で送信します。自分でメールを送るので、件名も自由に決められます:

app/api/route-message/route.ts
import { Resend } from "resend";
import { verifyWebhook, WebhookVerificationError } from "@ikiform/sdk/webhooks";

const resend = new Resend(process.env.RESEND_API_KEY);

const TEAMS: Record<string, string[]> = {
  sales: ["sales@example.com"],
  support: ["support@example.com", "oncall@example.com"],
  billing: ["accounts@example.com"],
};

export async function POST(request: Request) {
  const payload = await request.text();
  try {
    const event = await verifyWebhook({
      payload,
      headers: request.headers,
      secret: process.env.IKIFORM_WEBHOOK_SECRET!,
    });
    if (event.type !== "submission.created") return new Response(null, { status: 204 });

    const fields = event.data.fields;
    const department = String(fields.department ?? "support");
    const { error } = await resend.emails.send(
      {
        from: "Website <forms@example.com>",
        to: TEAMS[department] ?? TEAMS.support,
        replyTo: typeof fields.email === "string" ? fields.email : undefined,
        subject: `[${department}] ${String(fields.name ?? "New message")}`,
        text: Object.entries(fields)
          .map(([key, value]) => `${key}: ${String(value)}`)
          .join("\n"),
      },
      { idempotencyKey: event.id },
    );
    if (error) return new Response(error.message, { status: 502 });
    return new Response(null, { status: 204 });
  } catch (error) {
    if (error instanceof WebhookVerificationError) return new Response(error.reason, { status: 400 });
    throw error;
  }
}
  • アドレスはフォームではなくコードの中にあります。訪問者が選ぶのはチーム名であって、アドレスではありません。
  • replyTo により、Ikiform 自身のメールと同じく Reply は訪問者宛てになります。
  • idempotencyKey: event.id により、リトライされた配信では新たに何も送られません。Ikiform は 2xx を受け取れなかった配信を、同じ ID でリトライします。
  • プロバイダーが失敗したときに 502 を返すと Ikiform が後でリトライするので、短い障害でメッセージが失われることはありません。
  • 不明な部署や部署の指定がない場合は、メッセージを捨てずに support に回します。

ダッシュボードの Webhooks に URL を追加し、その whsec_ シークレットを IKIFORM_WEBHOOK_SECRET にコピーします。リトライとペイロードについては Webhook のドキュメントにあります。コードを書きたくなければ、部署ごとにフィルターを付けた Zapier や n8n のフローでも同じことができます。

保険として 1 人分だけ Ikiform 自身のメールをオンにしておくか、Email new submissions をオフにして、誰もメッセージを 2 通受け取らないようにします。

動作を確認する

  1. フォームの Notifications 設定で、受信者の行をすべて確認します。Waiting for confirmation と表示されている行があってはいけません。
  2. ページのフォームに入力して送信します。自分のサンクスページか、Ikiform のサンクスページに移動します。
  3. 受信者はそれぞれ自分宛てのメールを受け取ります。誰か 1 人に To 欄を確認してもらってください。本人のアドレスだけが表示されています。
  4. Webhook で振り分ける場合は、部署ごとに 1 回ずつ送信し、Webhooks の配信ログを確認します。どれも succeeded になっています。
  5. ハニーポットを埋めて _gotcha=bot で送信します。成功の応答は返りますが、送信データはスパムとして保存され、メールも Webhook も送られません。

ハマりどころ

  • CC や BCC はありません。 受信者ごとに別々のメッセージが届くので、共有のスレッドはありません。誰が返信するかを決めておくか、トピックで振り分けてください。
  • 上限は受信者数ではなく送信数で数えます。 1 つのフォームで 1 時間に 50 件を超えると、受信者全員が代わりにダイジェストを受け取ります。
  • メンバーの変更。 ワークスペースを抜けた人には、すぐにメールが届かなくなります。チームが変わったらフォームの受信者を確認し、誰にもメールが届かない状態にならないようにしてください。
  • バウンスしたアドレスは一時停止されます。 その行には日付付きで Emails bounced と表示され、その日以降にメールが再開されます。アドレスを修正するか、削除してください。
  • 訪問者には何も届きません。 Ikiform はフォームに入力した人にはメールを送りません。通知メールはあなたとチームだけに届くので、自動返信、確認メール、ダブルオプトインはありません。それらは Webhook をきっかけに、自分のメールツールから送ってください。

よくある質問

手順で詰まったときや、あなたの状況に合うガイドがほしいときはメールでどうぞ: hello@ikiform.com