フォームには「ありがとうございます」と出るのに、メールが届かないとき
お問い合わせフォームは、誰もエラーを見ないまま壊れることがあります。訪問者には親切な確認が表示されても、自分には何も届きません。その理由と、手遅れになる前に気付く方法を説明します。
小さな理学療法の診療所を想像してください。サイトにお問い合わせフォームがあり、動いています。少なくともそう見えます。訪問者が入力し、「送信」を押すと、「ありがとうございます。近日中にご連絡します」と表示されます。誰も気付かないのは、しばらく前からメッセージが診療所の受信トレイに届かなくなっていることです。エラーも、誰かの受信トレイへの不達通知も、どこかの赤い警告もありません。フォームは静かに失敗しています。
誰も気付かない理由
フォームの完了ページは、通常一つのことしか意味しません。サイトがメッセージを次へ渡したということです。その後でメールサーバーが受け付けるか、迷惑メールに分類するか、途中で拒否するかは、フォームには見えません。例えば PHP の mail() 関数は、ローカルシステムが配信のためにメッセージを受け付けた時点で成功を返し、誰かに届いた時点ではありません。そのため、訪問者は確認を受け取って離れます。一方、運営者は空の受信トレイを見て、今月は静かなだけだと思います。問い合わせが少ないだけでは、めったに警戒しません。休暇、天候、景気など、「フォームが壊れた」よりもっともらしく聞こえる説明は、いつでもあります。
- 0 日目夜間に通常のプラグイン更新が実行されます。サイトの見た目は以前とまったく同じです。
- 1 日目最後のメッセージが届きます。それが最後だとは誰も知りません。
- 2–13 日目訪問者はフォームを送り続け、「ありがとうございます」を見続けます。受信トレイには何も届きません。
- 14 日目少しいら立った様子の人から電話があり、問い合わせに誰も答えない理由を尋ねられます。
- 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少なくとも毎月、そして更新、テーマ変更、メール設定の変更後には必ず、自分のフォームから定期的にテストメッセージを送ります。誰も返信しないよう、テストであることを明示します。
- 2通常の頻度を把握します。普段は週に数件届くフォームで二週間何も来なければ、静かな月だと考えず、確認する理由にしてください。
- 3PHP mail() に頼らず、メール提供者や専用の送信サービスを通じ、認証付き SMTP で送信します。
- 4From には自分のドメイン、Reply-To には訪問者のアドレスを使います。そのドメインに SPF、DKIM、DMARC を設定し、メールが検証に通るようにします。
- 5送信のたびにデータベースへコピーを保存します。多くのフォームプラグインが、場合によっては追加機能として提供しています。メール送信に失敗しても、問い合わせは残ります。
- 6プラグイン更新のたびに、CAPTCHA も含めてフォームを確認します。Cookie を拒否した状態でも確認してください。
このような確認は忘れやすいため、自動化する価値があります。アカウントと確認済みのドメインがあれば、formexposed はテストと明示した送信を行い、実際に届いたかを確認できます(配信チェック。明示的に有効化した場合のみ)。通常は届くメッセージが突然なくなる状態も検知し、通知メールの SPF、DKIM、DMARC、TLS 証明書とドメインの期限も確認します。変化があったときだけ通知します。
まず様子を見たい場合、formexposed.com の無料チェックはアカウント不要で、何も送信しません。例えば、スクリプトのないウィジェット、公開テストキー、ブラウザーエラーなど、存在していても壊れている CAPTCHA を示します。これは、フォームが静かに動かなくなる原因の一つです。本当にメッセージが届くかは、実際のテストメッセージでしか確認できません。今日、一件送ってみてください。