【保存版】Contact Form 7で「送信できない」時の原因と解決チェックリスト

WordPress

送信ボタンを押しても反応がない、ずっと読み込み中のまま、赤いエラーが表示される、あるいは「送信完了」と出るのにメールが届かない――Contact Form 7(CF7)の「送信できない」問題は、クライアント側(ブラウザ/JS)とサーバー側(REST/API/メール)のどちらにも要因が潜みます。本記事は、現場での復旧手順をもとに、最短で原因を絞り込むための実践的な手順をまとめたものです。

まずは症状を3つに分類する

1. 送信が開始されない(ボタン無反応・スピナーが出ない・ずっとグルグル)

2. 送信は動くがエラーになる(赤枠メッセージ・「送信に失敗しました」・HTTPエラー)

3. 成功表示だがメールが届かない(ユーザー側は成功、管理者メール未着)

ケース1:送信が開始されない(ボタン無反応・永遠に読み込み)

JavaScriptエラーが最有力です。ブラウザの開発者ツール(Console)でエラーが出ていないか確認してください。テーマや他プラグインのJSがCF7のスクリプト実行を妨げることがあります。

JS最適化(defer/async付与、結合、遅延読み込み)でCF7の依存関係が崩れると動きません。最適化ツールを使っている場合は、CF7関連スクリプト(wpcf7、recaptchaなど)を除外して動作確認します。

ページキャッシュで古いトークン(nonce)が配られていると送信が始まりません。コンタクトページはページキャッシュ対象から除外し、ブラウザのキャッシュをクリアして再検証します。

reCAPTCHAやCSP(Content Security Policy)、広告ブロッカーがCF7のスクリプト読込・通信を妨げているケースもあります。ネットワークタブで関連スクリプトが200で取得できているか確認します。

ケース2:送信は動くがエラーになる(赤枠・HTTPエラー)

REST APIが正常に到達していない可能性があります。CF7は通常 /wp-json/contact-form-7/v1/contact-forms/ID/feedback にPOSTします。ここが404/403/401等なら、パーマリンクの不整合、.htaccessの破損、セキュリティ系(WAF/プラグイン)でブロックされていることが多いです。まず「設定 → パーマリンク → 変更を保存」でRewriteを再生成します。

「Nonce is invalid」系の失敗は、ページキャッシュや長時間の滞在でトークンが失効した場合に起きます。コンタクトページをキャッシュ除外し、TTLを短くする、フォームを再読み込みしてから送信します。

reCAPTCHA v3のスコアが閾値未満だと弾かれます。スパムが多い環境では閾値を下げる、v2(私はロボットではありません)へ切替、またはHoneypot等の併用を検討します。

ファイル添付の制限違反(拡張子・サイズ上限)や禁止語句によるフィルタで失敗することがあります。CF7のタグ設定と「メッセージ」タブの文言、サーバーの upload_max_filesize / post_max_size を確認します。

WAF/ModSecurityが本文内の特定語や送信パターンを誤検知することがあります。テキストを「テスト」だけにして通るか試し、通る場合は特定ルールの除外や /wp-json/contact-form-7/v1/ を許可対象にします。

ケース3:成功表示だがメールが届かない

「送信」は完了していても「配信」が失敗している典型例です。まずは到達可否の切り分けを行います。Flamingoを利用している場合は受信一覧にレコードが保存されているかを確認し、フォーム自体は動いていることを確定させます。

PHPのメール関数(wp_mail())だと到達率が不安定になりがちです。SMTPプラグインを導入し、認証済みのSMTP(SendGrid、Amazon SES、各社メールサーバー)経由で送信すると改善します。

SPF/DKIM/DMARCの整合性が取れていないと受信側で捨てられます。送信元のFromアドレスは自ドメインのメールを使用し、Reply-Toでユーザーのメールを設定する運用にします。DNSにSPFとDKIM(可能ならDMARC)を正しく設定してください。

受信側の迷惑メール振り分けや、企業メーラーの添付・URL制限も想定します。管理者メールを複数用意し、Gmail/独自ドメイン/社内メールなど複数系統で受信テストを行います。

本番だけ失敗・特定環境だけ失敗する場合

CDN/リバースプロキシのキャッシュやWAF設定差により、本番のみトークン失効・RESTブロックが発生しているケースがあります。コンタクトページと /wp-json/contact-form-7/v1/ の経路をキャッシュ除外し、WAFの除外ルールを設定します。

wwwと非www、HTTPとHTTPSの混在や、サイトURL/ホームURLの不一致が原因で送信先がクロスオリジン扱いになっている場合があります。サイトURLを統一し、ネットワークタブでPOST先のホスト名とプロトコルを確認します。

10分でできる最短チェック(実運用向け)

1. パーマリンクを「変更を保存」で再生成し、再送信テストを行う。

2. 開発者ツールのConsole/NetworkでエラーやHTTPステータスを確認(feedbackエンドポイントが200で返るか)。

3. ページキャッシュ/JS最適化を一時停止し、CF7/recaptcha関連スクリプトを最適化から除外して再検証。

4. reCAPTCHAキー/閾値を確認し、テキストのみで送信して通るかをテスト。

5. SMTP経由に切り替えて管理者メールの到達テスト(Fromは自ドメイン、Reply-Toを使用)。

ログの取り方と再発防止

ブラウザのHAR(Networkの保存)とConsoleログ、サーバーのエラーログ/WAFログを取得してパターンを特定します。復旧後は、コンタクトページのキャッシュ除外、SMTP運用、DNS(SPF/DKIM/DMARC)の整備、最適化ツールの除外設定、セキュリティ設定の許可リスト化で再発を防ぎます。

まとめ

CF7の「送信できない」は、フロントのJS実行不全、REST到達エラー、メール配信の3層に分けて見ると早く解決にたどり着けます。最初にパーマリンク再保存とキャッシュ除外で土台を整え、次にConsole/Networkで事実を確認、最後にSMTPとDNSで配信品質を底上げする――この順で進めれば、ほとんどのケースを短時間で解消できます。