ブログに戻る
技術 公開:16.09.2026 1分で読めます

フォームには「ありがとうございます」と出るのに、メールが届かないとき

お問い合わせフォームは、誰もエラーを見ないまま壊れることがあります。訪問者には親切な確認が表示されても、自分には何も届きません。その理由と、手遅れになる前に気付く方法を説明します。

小さな理学療法の診療所を想像してください。サイトにお問い合わせフォームがあり、動いています。少なくともそう見えます。訪問者が入力し、「送信」を押すと、「ありがとうございます。近日中にご連絡します」と表示されます。誰も気付かないのは、しばらく前からメッセージが診療所の受信トレイに届かなくなっていることです。エラーも、誰かの受信トレイへの不達通知も、どこかの赤い警告もありません。フォームは静かに失敗しています。

誰も気付かない理由

フォームの完了ページは、通常一つのことしか意味しません。サイトがメッセージを次へ渡したということです。その後でメールサーバーが受け付けるか、迷惑メールに分類するか、途中で拒否するかは、フォームには見えません。例えば PHP の mail() 関数は、ローカルシステムが配信のためにメッセージを受け付けた時点で成功を返し、誰かに届いた時点ではありません。そのため、訪問者は確認を受け取って離れます。一方、運営者は空の受信トレイを見て、今月は静かなだけだと思います。問い合わせが少ないだけでは、めったに警戒しません。休暇、天候、景気など、「フォームが壊れた」よりもっともらしく聞こえる説明は、いつでもあります。

仮の経過例
  1. 0 日目
    夜間に通常のプラグイン更新が実行されます。サイトの見た目は以前とまったく同じです。
  2. 1 日目
    最後のメッセージが届きます。それが最後だとは誰も知りません。
  3. 2–13 日目
    訪問者はフォームを送り続け、「ありがとうございます」を見続けます。受信トレイには何も届きません。
  4. 14 日目
    少しいら立った様子の人から電話があり、問い合わせに誰も答えない理由を尋ねられます。
  5. 15 日目
    一時間以内に原因が見つかります。フォームがコピーも保存していなければ、その二週間のメッセージは失われています。
実際の事例ではありませんが、とても典型的なパターンです。

よくある原因

  • SMTP のパスワードやメール提供者が変わった。フォームは古い認証情報でログインし続け、メールサーバーが拒否します。訪問者から見ると、何も起きていないように見えます。
  • 認証なしの PHP mail()。ウェブサーバーが適切なメールサーバーにログインせず、直接メールを送ります。多くの受信サーバーは不審とみなし、迷惑メールに入れるか、完全に拒否します。
  • SPF、DKIM、DMARC が整合していない。多くのフォームは From 欄に訪問者のアドレスを入れます。例えば gmail.com のアドレスを名乗りながら、自分のウェブサーバーから送られることになります。まさに DMARC が止めるために設計された状況です。
  • プラグイン更新やテーマ変更で、フォームや CAPTCHA が壊れた。変更したテンプレートから欄が落ちたり、スクリプトが読み込まれなくなったり、CAPTCHA のウィジェットだけが表示されてスクリプトがなくなったりし、すべての送信が検証に失敗します。
  • 受信先のメールボックスが満杯。メールサーバーが新しいメッセージを拒否し、不達通知は誰も読まないアドレスに届きます。
  • Cookie バナーがフォームのスクリプトをブロックしている。同意ツールが CAPTCHA やフォームのスクリプトを「マーケティング」に分類すると、Cookie を拒否した訪問者は送信できなかったり、トークンがないため送信を拒否されたりすることがあります。
  • TLS 証明書やドメインの期限切れ。訪問者がブラウザーの警告を見て離れるか、メールサーバーへ安全に接続できなくなります。受信メールボックスのドメインが期限切れになると、そこへのメールは単に止まります。
  • キャッシュ層が古いページを返す。ページ全体のキャッシュが、期限切れのセキュリティトークン(nonce や CSRF トークン)を含むフォームを返すことがあります。サーバーは送信を拒否し、設定によっては訪問者に明確なエラーが見えません。

From アドレスの罠

三つ目の原因は、多くのフォーム設定に標準で組み込まれているため、詳しく見る価値があります。DMARC は、見える From アドレスのドメインが、SPF または DKIM が保証するドメインと一致するかを確認します。フォームが訪問者のアドレスを送信元にすると、自分のサーバーにはそのドメインのために送る権限がないため、検証に失敗します。訪問者のドメインの DMARC ポリシーや、自分のメール提供者によって、迷惑メールに入るか拒否されます。修正は簡単です。自分のドメインのアドレスから送り、訪問者のアドレスは Reply-To に入れます。「返信」を押せば、従来どおり訪問者に届きます。

同じフォームメッセージを送る二つの方法
壊れやすい
  • From:訪問者のアドレス
  • Reply-To なし
  • ウェブサーバーから直接 PHP mail()
  • 送信ドメインに SPF、DKIM、DMARC がない
  • メッセージはメールとしてのみ存在
堅牢
  • From:自分のドメインのアドレス。例:form@yourdomain
  • Reply-To:訪問者のアドレス
  • 認証付き SMTP または送信サービス
  • SPF、DKIM、DMARC を設定し、整合させる
  • データベースにもコピーを保存
右側の方法でも手間はほとんど増えません。大半は設定です。

行うべきこと

  1. 1少なくとも毎月、そして更新、テーマ変更、メール設定の変更後には必ず、自分のフォームから定期的にテストメッセージを送ります。誰も返信しないよう、テストであることを明示します。
  2. 2通常の頻度を把握します。普段は週に数件届くフォームで二週間何も来なければ、静かな月だと考えず、確認する理由にしてください。
  3. 3PHP mail() に頼らず、メール提供者や専用の送信サービスを通じ、認証付き SMTP で送信します。
  4. 4From には自分のドメイン、Reply-To には訪問者のアドレスを使います。そのドメインに SPF、DKIM、DMARC を設定し、メールが検証に通るようにします。
  5. 5送信のたびにデータベースへコピーを保存します。多くのフォームプラグインが、場合によっては追加機能として提供しています。メール送信に失敗しても、問い合わせは残ります。
  6. 6プラグイン更新のたびに、CAPTCHA も含めてフォームを確認します。Cookie を拒否した状態でも確認してください。

このような確認は忘れやすいため、自動化する価値があります。アカウントと確認済みのドメインがあれば、formexposed はテストと明示した送信を行い、実際に届いたかを確認できます(配信チェック。明示的に有効化した場合のみ)。通常は届くメッセージが突然なくなる状態も検知し、通知メールの SPF、DKIM、DMARC、TLS 証明書とドメインの期限も確認します。変化があったときだけ通知します。

まず様子を見たい場合、formexposed.com の無料チェックはアカウント不要で、何も送信しません。例えば、スクリプトのないウィジェット、公開テストキー、ブラウザーエラーなど、存在していても壊れている CAPTCHA を示します。これは、フォームが静かに動かなくなる原因の一つです。本当にメッセージが届くかは、実際のテストメッセージでしか確認できません。今日、一件送ってみてください。