ガイド

ガイド3 分で読めます

HTML フォームの送信内容を自分のメールに届ける

メールサーバーなしで、すべての送信データを受信トレイに届けます。mailto: と PHP の mail() がうまくいかない理由と、スパムを除外して返信もできる構成を解説します。

Preet SutharIkiform 創業者

ブラウザーにはメールサーバーとやり取りする手段がないので、HTML フォームは単独ではメールを送れません。フォームの action をフォームバックエンドに向ければ、バックエンドが送信を受け取り、スパムを除外して保存し、あなたとチームにメールで知らせます。メールアドレスのフィールド名を email にすれば、受信トレイで Reply を押すだけでフォームを入力した人に直接返信できます。

ほとんどのサイトがお問い合わせフォームに求めることは 1 つ、誰かが読む受信トレイにメッセージが届くことです。これは見た目より難しいことがわかります。HTML には <form> 要素はあってもメールを送る手段がなく、昔ながらの近道は訪問者に作業を押し戻すか、迷惑メールフォルダーに入ってしまいます。このガイドではその理由を説明し、選択肢を率直に比較して、どのサイトでもどのスタックでもメールが届くフォームを設定します。

フォームが単独でメールを送れない理由

訪問者が Send を押すと、ブラウザーはフォームの action にある URL に HTTP リクエストを 1 回送ります。フォームにできるのはそれだけです。メールを送るには、受信側のサーバーが信頼するマシンからメールサーバーと SMTP でやり取りする必要があります。ブラウザーはその接続を開けませんし、仮に開けたとしても、どこかの訪問者のノートパソコンから届いたメールは拒否されます。そのため、フォームと受信トレイの間には必ずサーバー上の何かが入ります。自分のコード、ホスト上のスクリプト、あるいはサービスです。

フォームバックエンドなら、その何かは URL です。フォームは https://ikiform.com/f/<id> に送信し、残りは Ikiform が行います:

フォームの送信が受信トレイのメールになるまであなたのフォームどのサイトやスタックでもIkiform検証、スパム判定、保存受信者ごとに 1 通reply-to は送信者受信トレイReplyで訪問者に返信スパムとして保存メールも Webhookもなし送信スパムではない数秒スパムスコアに到達フォームの送信が受信トレイのメールになるまであなたのフォームどのサイトやスタックでもIkiform検証、スパム判定、保存受信者ごとに 1 通reply-to は送信者受信トレイReply で訪問者に返信スパムとして保存メールも Webhookもなし送信スパムではない数秒スパムスコアに到達
  1. 訪問者がフォームを送信し、ブラウザーかあなたのサーバーが Ikiform のエンドポイントに送ります。
  2. Ikiform はフィールドをフォームの定義と照らし合わせ、スパムスコアを付けて保存します。
  3. スパムスコアに達した送信はスパムとして保存されます。同じ成功の応答を返しますが、メールも Webhook も送りません。
  4. それ以外の送信では、訪問者のアドレスを reply-to にして、受信者ごとにメールを 1 通送ります。
  5. 数秒後にメールが受信トレイに届きます。Reply を押すと訪問者宛てに書けます。
訪問者がメールアドレスを目にすることも、メールアプリを開くこともありません。ページにあるのはフォームだけです。

フォームを受信トレイに届ける 6 つの方法

どれも誰かにとっては機能します。この表は、実際の訪問者と実際のボットがフォームを使い始めたときに、それぞれがどんなコストを生むかをまとめたものです。

方法得意なことトレードオフ
action="mailto:you@example.com"サーバーもアカウントも不要、属性 1 つだけ。何も送信されません。ブラウザーは訪問者のメールアプリで下書きを開くか、メールアプリが設定されていなければ何もしません。アドレスはページに載ったままなので、収集ボットに拾われます。Gmail のガイド を参照してください。
mail() を使う PHP スクリプトほぼどの共有 PHP ホストでも動き、第三者は不要。ホストのメール設定に左右され、自分のドメインから送ったことになっているメールは SPF や DMARC に通らず迷惑メールになりがちです。スパム除外も保存もなく、静的ホストでは PHP 自体がありません。PHP なしで送るを参照してください。
EmailJS などのブラウザー用メール SDKサーバー不要。メールテンプレートは相手のダッシュボードでデザインできる。キーとテンプレート ID がページの JavaScript に含まれるので、誰でも自分の文面であなたのテンプレートを送れてしまいます。EmailJS の代替を参照してください。
自前のルートと、Resend、Postmark、Amazon SES、SMTP 経由の Nodemailer などのメール API件名も HTML も自由に決められ、訪問者に確認メールも送れる。バリデーション、スパム除外、レート制限、保存、リトライを自分で作り、送信ドメインを認証する必要があり、静的サイトでもサーバーが要ります。Next.js のガイド を参照してください。
Web アプリとして公開する Google Apps Scriptすでに持っている Google アカウントで動く。スクリプトの割り当て上限で 1 日にメールを送れる宛先数が限られ、URL にスパム対策はなく、スクリプトの保守も自分で行います。
Ikiform、Formspree、Web3Forms などのフォームバックエンドaction に URL を 1 つ書くだけ。サーバーなしでスパム除外、保存、メール通知。メールのレイアウトと件名はサービス側のものです。Ikiform が訪問者にメールを送ることはありません。

完全に自社ブランドのメールや訪問者への確認メールが必要なら、メール API を使って自分でルートを書いてください。スパムを除いたメッセージが受信トレイに届き、返信できればよいのなら、フォームバックエンドがいちばん少ないコードで済みます。このガイドの残りでは Ikiform を使います。

フォーム

ほとんどのお問い合わせフォームは 3 つのフィールドで足ります。誰なのか、どこに返信するか、何を求めているかです。下でスタックを選んでください。その選択は、これらのガイドのすべてのコードサンプルに引き継がれます。

このフォームは JavaScript なしで動きます。ブラウザーが送信し、Ikiform があなたにメールを送り、訪問者は _redirect のページに移動します。各フィールドの下には、下のスクリプト用の空のエラー表示欄があります。

contact.html
<form id="contact" action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="POST">
  <label for="name">Name</label>
  <input id="name" name="name" autocomplete="name" required maxlength="120" />
  <p data-error="name"></p>

  <label for="email">Your email</label>
  <input id="email" name="email" type="email" autocomplete="email" required />
  <p data-error="email"></p>

  <label for="message">Message</label>
  <textarea id="message" name="message" rows="6" required minlength="10"></textarea>
  <p data-error="message"></p>

  <input type="hidden" name="page" value="/contact" />
  <input type="hidden" name="_redirect" value="https://example.com/contact/sent" />
  <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden />
  <button>Send message</button>
  <p id="contact-status" role="status"></p>
</form>

スクリプトは訪問者をページにとどめます。fetch で送信し、サーバーのエラーを各フィールドの下に書き、フォームを返信先のアドレスを繰り返す一文に置き換えるので、入力ミスにすぐ気づけます。

contact.js
const form = document.getElementById("contact");
const status = document.getElementById("contact-status");
const button = form.querySelector("button");

form.addEventListener("submit", async (event) => {
  event.preventDefault();
  for (const slot of form.querySelectorAll("[data-error]")) slot.textContent = "";
  button.disabled = true;
  status.textContent = "Sending";

  try {
    const response = await fetch(form.action, {
      method: "POST",
      headers: { Accept: "application/json" },
      body: new FormData(form),
    });
    const result = await response.json();
    if (result.ok) {
      const email = form.elements.namedItem("email").value;
      const done = document.createElement("p");
      done.setAttribute("role", "status");
      done.textContent = `Sent. We'll reply to ${email}.`;
      form.replaceWith(done);
      return;
    }
    for (const [field, messages] of Object.entries(result.error.fields ?? {})) {
      const slot = form.querySelector(`[data-error="${field}"]`);
      if (slot) slot.textContent = messages[0];
    }
    status.textContent = result.error.fields ? "Check the fields above." : result.error.message;
  } catch {
    status.textContent = "Couldn't send. Check your connection and try again.";
  }
  button.disabled = false;
});
  • frm_xxxxxxxxxxxxxxxx をダッシュボードにある自分のフォームの ID に置き換えます。
  • name="email" を付けたフィールドが、通知メールの reply-to アドレスになります。ラベルが「Your email」などでも、name はこのままにしてください。
  • page は普通の hidden フィールドです。メールに表示されるので、どのページから届いたメッセージかがわかります。
  • _gotcha はハニーポットです。人には見えず、ここに入力したボットはスパムとして保存され、誰にもメールは送られません。
  • _redirect は、フォームの Allowed domains にある https: の URL でしか機能しません。省略してフォーム設定の Redirect after submit を使うこともでき、どちらもなければ Ikiform 自身のサンクスページが表示されます。

フレームワーク別のガイドではさらに詳しく説明しています: Next.js、Astro、SvelteKit、Nuxt、React、Vue、プレーンな HTML。Webflow や Carrd などのサイトビルダーには専用のページがあり、お問い合わせフォームのテンプレートには件名のフィールドが追加されています。

ダッシュボードでもフィールドを定義すると、Ikiform は定義に合わない送信を 422 validation_failed とフィールドごとのメッセージで拒否し、上のコードがそれを各入力欄の横に表示します。ここで試せます。同じバリデーターがブラウザーで動きます:

プレビュー

Ikiform のバリデーターをブラウザーで実行します。何も送信されません。

この定義をフォームの Fields タブに貼り付けます。定義がなければ、Ikiform はどんなフィールド名でも受け付け、届いた内容をそのままメールで送ります。

メールの見た目

受け付けた送信データごとに、シンプルで読みやすいメールが送られます。テキスト版の例です:

通知メール
From: Ikiform <notifications@ikiform.com>
To: you@yourcompany.com
Reply-To: ada@example.com
Subject: New submission: Contact

Contact got a new submission on Oct 25, 2026, 9:14 AM UTC.

name: Ada Lovelace
email: ada@example.com
message: Do you ship to Canada? I'd like to order 40 units before December.
page: /contact

View it in Ikiform:
https://ikiform.com/dashboard/submissions?form=frm_xxxxxxxxxxxxxxxx&submission=sub_...
  • 送信元は notifications@ikiform.com です。メールは Ikiform のドメインから送られるので、DNS レコードや送信ドメインを設定する必要はありません。
  • 件名は常に New submission: <form name> です。_subject は通知メールの件名を変えません。meta.subject として Webhook と API に渡されます。フォームを見分けるには、ダッシュボードで「Contact, pricing page」のようにフォームごとにわかりやすい名前を付けてください。
  • フィールドは送信された順に、name をラベルにして並びます。_ で始まるフィールドは含まれません。
  • とても長いフォームや回答は短縮され、メールにはダッシュボードに残りのフィールドがいくつあるかが書かれます。具体的な数値は制限のページ にあります。
  • パスワードやカード番号のように見えるフィールドは含まれず、それを含む送信のメールは確認のために保留されます。フォームバックエンドで認証情報を集めないでください。
  • ワークスペースのメンバーには View submission ボタンが表示されます。ワークスペース外の人には、フィールドと配信停止のリンクが届きます。

メールを受け取る人

受信者はダッシュボードでフォームごとに設定し、フォーム自体で指定することはありません。受信者を指定できるフィールドがあれば誰でもあなたのフォームを使って誰にでもメールを送れてしまうので、Ikiform にはそのようなフィールドはありません。

対象追加方法注意
デフォルト何もしなくてよいワークスペースの Notification email に選ばれたメンバー。選ばれていなければワークスペースのオーナー全員
選んだメンバーフォームの Notifications 設定でチェックを入れるメールアドレスが認証済みのメンバーのみ
ワークスペース外の人Add someone outside the workspace を選び、Send link を押す本人が確認するまでメールは届かない。フォームごとに最大 5 人で、それぞれ配信停止できる

1 つのフォームがメールを送る宛先は最大 10 件です。CC で共有するのではなく受信者ごとに個別に届くので、他の人のアドレスは見えません。受信者のメールボックスでバウンスすると、Ikiform はそのアドレスへのメールをしばらく停止し、ダッシュボードの横に Emails bounced と表示します。受信者の設定だけではできない、件名ごとの振り分けは複数の受信者で説明しています。

Ikiform ではなく、本人に返信する

Ikiform は reply-to のアドレスを、まず _replyto フィールドから、次に email、email_address、your_email、reply_to、contact_email という名前のフィールドから設定します。値は有効なメールアドレス 1 つでなければならず、そうでなければ無視されます。reply-to が設定されていれば、Gmail、Outlook、Apple Mail で Reply を押すと訪問者への返信が開き、返信は自分のアドレスから送られます。

reply-to がなければ、返信は誰も読まない notifications@ikiform.com に送られます。これがいちばんよくある想定外の動きで、たいていは user_email や空白入りの Email Address という名前のフィールドが原因です。名前を変えるか、_replyto を追加してください。メールアドレスのフィールドが 2 つあるフォームや、フィールド名を勝手に変えるビルダーについては reply-to のガイドで説明しています。

一度に大量に届いたとき

各フォームが送る通知メールは 1 時間に最大 50 通、ワークスペースの作成から 7 日未満なら 10 通です。それを超えると、その時間の残りの送信データは通常どおり保存され、1 時間が終わった後にまとめて 1 通のダイジェストメールで届きます。この上限は、フォームが大きな場所に掲載されたときやボットがフィルターをすり抜けたときに、あなたの受信トレイと、メールプロバイダーから見た Ikiform のメールの評判を守ります。

忙しい 1 時間に通知メールがどうなるか1 フォーム、UTC の毎正時から 1 時間1〜50 件目の送信それぞれ 1 通、数秒後51 件目以降保存、ダイジェスト用に保持1 時間が終了フォームごとにダイジェスト 1 通上限に到達次の 1 時間忙しい 1 時間に通知メールがどうなるか1 フォーム、UTC の毎正時から 1 時間1〜50 件目の送信それぞれ 1 通、数秒後51 件目以降保存、ダイジェスト用に保持1 時間が終了フォームごとにダイジェスト 1 通上限に到達次の 1 時間
  1. 毎正時から 1 時間のうち、フォームへの最初の 50 件の送信は通常どおりそれぞれメールを送ります。
  2. 同じ 1 時間のそれ以降の送信は保存されてすぐにダッシュボードに表示されますが、1 件ごとのメールは送られません。
  3. 1 時間が終わると、各受信者に件数とダッシュボードへのリンクを載せたダイジェストが 1 通届きます。
上限はフォームごとに数えるので、1 つのフォームへの集中が他のフォームを遅くすることはありません。Webhook に上限はなく、すべての送信で発火します。

ダイジェストの件名は件数とフォーム名で、フィールドの一覧も reply-to もないので、それらのメッセージにはダッシュボードから返信してください。上限を頻繁に超えるなら、そのフォームにはメールが向いていません。代わりに Webhook で Slack や共有の受信トレイに送ってください。

受信トレイにスパムを入れない

メールではスパムのコストが高くつきます。ボットの送信 1 件ごとに、誰かが開く通知が 1 通届くからです。Ikiform はスパムを通常の成功の応答とともに保存するのでボットは何も学べず、スパムについてはメールを送りません。何をスパムとみなすかは 4 つの仕組みで決まります:

防御策防げるもの設定
ハニーポットすべての入力欄を埋めるボット非表示の _gotcha 入力欄
スパムスコア名前欄のリンク、3 つ以上のリンク、既知のスパム文句、使い捨てアドレス、まったく同じ再送信。5 でスパムになる不要
許可ドメイン他のサイトからの送信フォームの設定に自分のドメインを追加
人間確認本物のブラウザーを動かすボットSpam check を Ikiform に設定

ときどきダッシュボードの Spam フィルターを確認してください。本物のメッセージが入っていたら、スパムではないとマークすれば、その時点でメールが送られます。人間確認をオンにすべきときも含め、各シグナルはスパム対策のドキュメントで説明しています。

メールでできないこと

Ikiform はフォームを入力した本人にはメールを送りません。通知メールが届くのはあなたとチームだけなので、自動返信、確認メール、ダブルオプトインはありません。それらは Webhook をきっかけに、自分のメールツールから送ってください。サイトで「メッセージを受け付けました」と伝えたいなら、送信後のページに表示してください。上のコードはすでにそうしています。

  • チームの共有受信トレイ。 チームのアドレスを受信者に追加するか、メールプロバイダーで転送してください。
  • チャットのチャンネル。 各送信データを Webhook で Slack、Discord、Microsoft Teams に送ります。1 日に数件以上届くフォームにはチャットが向いています。
  • スプレッドシートや CRM。 Google Sheets や、Zapier または n8n 経由の任意のツールに送れます。
  • 添付ファイル。 ファイルのアップロードにはまだ対応していません。ファイル付きの送信には 422 files_not_supported が返ります。代わりに共有ファイルへのリンクを尋ねてください。

メールをオフにする

にぎわうニュースレター登録のように、メールがないほうがよいフォームもあります。フォームの Notifications 設定で Email new submissions をオフにしてください。送信データは保存され、Webhook も発火し続けます。

新しいワークスペースでは上限が低く、最初の 7 日間はフォームごとに 1 時間 10 通です。スクリプトでテストしていると、後よりも早くダイジェストが届くことがあります。

状況に合わせて選ぶ

上の設定はどこでも同じです。以下のページでは、特定の受信トレイ、特定のスタック、または乗り換え元のツールについて説明しています。

動作を確認する

フォームを公開する前に、次の手順を確認してください。Ikiform に無料プランはありません。テストは無料で、プランのないワークスペースでも localhost からのテスト送信を月 50 件まで受け付けます。本番運用するには、月 $6 で 500 件からの Pro を選ぶか、1 回払いで 10,000 件 $49 または 50,000 件 $149 のパックを購入します。クレジットに有効期限はありません。料金を参照してください。

  1. フォームの Allowed domains に自分のサイトのドメインと、開発中は localhost を追加します。空にしておくと、どこからの送信でも受け付けます。
  2. フォームの Notifications 設定で、Email new submissions がオンで、正しい人にチェックが入っていることを確認します。
  3. ページのフォームに入力して送信します。自分のサンクスページか、Ikiform のサンクスページに移動します。
  4. ダッシュボードで Submissions を開きます。送ったすべてのフィールドを含む新しい送信データがあります。
  5. 通知メールを開きます。件名は New submission: とフォーム名で、送ったすべてのフィールドが並んでいます。
  6. Reply を押します。To の欄には、Ikiform ではなくフォームに入力したアドレスが表示されます。
  7. ハニーポットを埋めて _gotcha=bot で送信します。成功の応答は返りますが、送信データはスパムとして保存され、メールも Webhook も送られません。
  8. 何も届かない場合は、ダッシュボードのステータスフィルターを Spam に切り替えてください。スパムにも本物の送信と同じ成功の応答が返ります。

トラブルシューティング

問題対処法
送信データはダッシュボードにあるのに、メールが届かないまず迷惑メールやプロモーションのフォルダーを確認し、notifications@ikiform.com を連絡先に追加してください。次にフォームの Notifications 設定を確認します。メールがオフになっているか、外部のアドレスがまだ Waiting for confirmation のままか、Emails bounced と表示されている可能性があります。
送信データはダッシュボードにあるのに、メールも Webhook も届かないスパムとして保存されています。スパムでは何も送られません。Spam フィルターで開いて理由を確認し、スパムではないとマークすればメールと Webhook が送られます。
Reply の宛先が notifications@ikiform.com になるreply-to が見つかりませんでした。メールアドレスのフィールド名を email、email_address、your_email、reply_to、contact_email のいずれかにするか、訪問者のアドレスを入れた _replyto フィールドを追加してください。
メールが止まり、代わりにダイジェストが届いたフォームが 1 時間に 50 通(新しいワークスペースでは 10 通)を超えました。すべてダッシュボードにあります。Spam でボットの集中送信がないか確認するか、忙しいフォームには Webhook を使ってください。
_subject で件名が変わらない_subject は通知メールの件名を変えません。meta.subject として Webhook と API に渡されます。
403 origin_not_allowed が返るか、すべての送信がスパムになるページのドメインがフォームの Allowed domains にありません。追加し、ローカルでのテスト用に localhost も追加してください。登録したドメインのサブドメインは許可されます。
422 validation_failed送信がフォームのフィールド定義に合っていません。error.fields に各フィールドと理由が示されます。入力欄の name をフィールド ID に合わせてください。
402 test_limit_reachedワークスペースにプランがなく、今月の無料の localhost テスト 50 件を使い切っています。プランを選ぶか、ダッシュボードの Send test を使ってください。

よくある質問

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