フォームをメールに送る1 分で読めます
1 つのフォームを複数のメールアドレスに送る
1 つのフォームをチーム全員にメールで送ったり、トピックごとに適切な担当者に振り分けたり。ただし、誰に送るかをフォーム自身には決めさせません。
ダッシュボードで各メンバーをフォームの受信者に追加します。ワークスペースのメンバーはチェックを入れるだけ、それ以外の人は確認リンクで、最大 10 アドレスまでです。全員が、すべての送信データのコピーを個別に受け取ります。営業の質問はある人に、サポートは別の人に送りたい場合は、代わりに Webhook でフィールドをもとに振り分けます。
ここが違う
古い PHP スクリプトや一部のフォームサービスでは、hidden の to や cc フィールドで、フォーム自身が受信者を指定できます。便利ですが、お問い合わせフォームがスパムのリレーになるのもこの仕組みのせいです。ボットが hidden フィールドを書き換えると、サーバーがあなたのドメインから好きな相手にメールを送ってしまいます。Ikiform には受信者のフィールドがありません。誰にメールを送るかはダッシュボードで設定し、ワークスペース外の人は先に確認が必要です。
そのため、ここには 2 つの別々の作業があり、それぞれ別の場所で解決します:
| したいこと | 設定する場所 | 上限 |
|---|---|---|
| 全員がすべての送信データを受け取る | フォームの Notifications 設定の受信者 | フォームごとに 10 アドレス |
| 送信データごとに適切な担当者へ送る | フィールドを読んで 1 つのチームにメールする Webhook | ワークスペースごとに Webhook エンドポイント 3 つ |
すべての送信データをチーム全員に送る
- フォームは Ikiform に 1 回送信します。
- Ikiform が受信者リストを作ります。このフォームでチェックしたメンバー(またはワークスペースのデフォルト)に、確認済みの外部アドレスを加えたものです。
- 重複は除かれ、リストは 10 件で打ち切られます。
- 受信者ごとに別々のメールが届くので、ほかの人のアドレスは誰にも見えません。
- 確認待ちのアドレスと、バウンス後に一時停止されたアドレスはスキップされます。
- ダッシュボードでフォームを開き、Settings、Notifications の順に進みます。Email new submissions がオンになっていることを確認します。
- メールを受け取るワークスペースのメンバーにチェックを入れます。表示されるのは、アドレスが確認済みのメンバーだけです。
- ワークスペース外の人は、Add someone outside the workspace にアドレスを入力して Send link を押します。フォームごとに 5 件まで追加できます。
- 相手に確認してもらいます。確認されるまで、その行には Waiting for confirmation と表示され、何も届きません。
外部の受信者には送信データのフィールドと配信停止リンクが表示されます。アカウントがないので、ダッシュボードへのリンクはありません。メンバーには View submission ボタンが表示されます。誰かが抜けたらその行を削除してください。配信停止した場合は、行も自動で消えます。
メンバーと外部アドレス
2 種類の受信者は動作が異なるので、誰をどこに追加するかを決めるときに重要です:
| Item | ワークスペースのメンバー | 外部アドレス |
|---|---|---|
| 追加方法 | フォームでチェックを入れる | Send link のあと、本人が確認 |
| メールに表示されるもの | フィールドと View submission ボタン | フィールドと配信停止リンク |
| ダッシュボードを開ける | はい | いいえ |
| メールが止まるとき | チェックを外したとき、またはワークスペースを抜けたとき | 行を削除したとき、または本人が配信停止したとき |
| カウント対象 | 10 アドレスの上限 | 10 アドレスの上限と、フォームごとの外部アドレス 5 件 |
メッセージに対応する人にはワークスペースの席を用意し、過去の送信データやスパムも見られるようにしましょう。マネージャーや共有の受信箱など、知っておくだけでよい相手には外部アドレスを使います。
トピックごとに送信データを振り分ける
受信者を、訪問者が選んだ内容によって変えることはできません。そうしたい場合は、チームを示すフィールドを追加し、小さな Webhook ハンドラーにアドレスを選ばせます。フォームは次のとおりです:
<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)経由で送信します。自分でメールを送るので、件名も自由に決められます:
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 通受け取らないようにします。
動作を確認する
- フォームの Notifications 設定で、受信者の行をすべて確認します。Waiting for confirmation と表示されている行があってはいけません。
- ページのフォームに入力して送信します。自分のサンクスページか、Ikiform のサンクスページに移動します。
- 受信者はそれぞれ自分宛てのメールを受け取ります。誰か 1 人に To 欄を確認してもらってください。本人のアドレスだけが表示されています。
- Webhook で振り分ける場合は、部署ごとに 1 回ずつ送信し、Webhooks の配信ログを確認します。どれも
succeededになっています。 - ハニーポットを埋めて
_gotcha=botで送信します。成功の応答は返りますが、送信データはスパムとして保存され、メールも Webhook も送られません。
ハマりどころ
- CC や BCC はありません。 受信者ごとに別々のメッセージが届くので、共有のスレッドはありません。誰が返信するかを決めておくか、トピックで振り分けてください。
- 上限は受信者数ではなく送信数で数えます。 1 つのフォームで 1 時間に 50 件を超えると、受信者全員が代わりにダイジェストを受け取ります。
- メンバーの変更。 ワークスペースを抜けた人には、すぐにメールが届かなくなります。チームが変わったらフォームの受信者を確認し、誰にもメールが届かない状態にならないようにしてください。
- バウンスしたアドレスは一時停止されます。 その行には日付付きで Emails bounced と表示され、その日以降にメールが再開されます。アドレスを修正するか、削除してください。
- 訪問者には何も届きません。 Ikiform はフォームに入力した人にはメールを送りません。通知メールはあなたとチームだけに届くので、自動返信、確認メール、ダブルオプトインはありません。それらは Webhook をきっかけに、自分のメールツールから送ってください。
よくある質問
Ikiform はそのアドレスへのメールをしばらく一時停止し、フォームの設定でその行に Emails bounced と表示します。ほかの受信者には影響しません。アドレスを修正するか削除してください。
最大 10 件です。チェックを入れたワークスペースのメンバーと、最大 5 件の外部アドレスを含みます。外部アドレスはそれぞれ、先にリンクで確認します。
いいえ。これは意図的です。受信者のフィールドがあると、誰でもフォームを使って任意のアドレスにメールを送れてしまいます。代わりに Webhook で select フィールドをもとに振り分け、アドレスは自分のコードに置いてください。
いいえ。受信者はそれぞれ、自分だけに宛てた別々のメールを受け取ります。
はい、Webhook を使えばできます。フォームに部署の select を追加し、小さなハンドラーや自動化ツールにアドレスを選ばせてメールを送ります。
手順で詰まったときや、あなたの状況に合うガイドがほしいときはメールでどうぞ: hello@ikiform.com