送信ボタンを押しても反応しない、赤いエラーが出る、送信完了と出るのにメールが届かない――Contact Form 7(CF7)の「送信できない」問題は、原因が多岐にわたるため特定が難しいトラブルの一つです。
この記事では、症状を3つに分類して、それぞれの原因と解決方法をチェックリスト形式で解説します。上から順に確認していけば、最短で原因にたどり着けます。
最初にやること:症状を3つに分類する
まず、どのパターンに該当するかを確認してください。
| 症状 | 原因の場所 | 該当セクション |
|---|---|---|
| ボタンが反応しない・ずっと読み込み中 | フロントエンド(JavaScript) | ケース1 |
| 赤枠エラー・「送信に失敗しました」 | サーバー(REST API / 設定) | ケース2 |
| 送信成功だがメールが届かない | メール配信 | ケース3 |
ケース1:送信ボタンが反応しない・ずっと読み込み中
ボタンを押しても何も起きない、またはスピナーが回り続ける場合は、JavaScriptのエラーが原因です。
チェック1:ブラウザのコンソールでJSエラーを確認する
ブラウザで問い合わせページを開き、F12 → Console タブを確認します。
// よくあるエラー例 Uncaught TypeError: Cannot read properties of undefined wpcf7 is not defined $ is not a function
これらのエラーが出ている場合、テーマや他のプラグインのJavaScriptがCF7のスクリプトと競合しています。
対処法:
- テーマを一時的にデフォルトテーマ(Twenty Twenty-Four等)に切り替えて動作確認
- プラグインを1つずつ無効化して原因を特定
チェック2:JS最適化プラグインとの競合
Autoptimize、WP Rocket、LiteSpeed Cache などのJS最適化(結合・遅延読み込み・defer/async付与)が、CF7の依存関係を壊していることがあります。
対処法:
- 最適化プラグインの設定で、以下のスクリプトを最適化対象から除外する
wp-content/plugins/contact-form-7/ wpcf7 recaptcha
チェック3:ページキャッシュが原因
キャッシュされたページでは、CF7のセキュリティトークン(nonce)が古くなり、送信が開始できません。
対処法:
- 問い合わせページをキャッシュ対象から除外する
- ブラウザのキャッシュをクリアして再テスト
- Contact Form 7×キャッシュの原因と対処法も参照
チェック4:reCAPTCHAの読み込み失敗
reCAPTCHA v3を使用している場合、スクリプトの読み込みがブロックされると送信が開始できません。
対処法:
- F12 → Network タブで
recaptchaのリクエストが200で返っているか確認 - 広告ブロッカーを無効化してテスト
- CSP(Content Security Policy)ヘッダーで
google.com/recaptchaが許可されているか確認
ケース2:赤枠エラー・「送信に失敗しました」が表示される
送信処理は動くがエラーになる場合は、サーバー側の問題です。
チェック1:パーマリンクを再保存する(最も多い解決策)
CF7はWordPressのREST API(/wp-json/contact-form-7/v1/contact-forms/ID/feedback)を使って送信します。このエンドポイントが壊れると送信に失敗します。
対処法:
- WordPress管理画面 → 設定 → パーマリンク
- 何も変更せずに「変更を保存」をクリック
- これだけで .htaccess が再生成され、REST APIが復活することが多い
チェック2:REST APIがブロックされていないか確認
ブラウザで以下のURLに直接アクセスして、JSONが返るか確認します。
https://あなたのサイト/wp-json/
404や403が返る場合、REST APIがブロックされています。
よくある原因:
- セキュリティプラグイン(SiteGuard、Wordfence、All In One WP Security)がREST APIを制限している
- サーバーのWAF(Web Application Firewall)がブロックしている
- .htaccess にREST APIを無効化するルールが入っている
対処法:
- セキュリティプラグインの設定で REST API を許可する
- サーバーのWAF設定で
/wp-json/contact-form-7/を除外する - .htaccess に以下のようなブロックルールがないか確認する
# この記述があるとREST APIがブロックされる RewriteRule ^wp-json/ - [F,L]
チェック3:「メッセージの送信に失敗しました」のエラー
このメッセージが表示される場合、メール送信自体が失敗しています(REST APIは正常)。
対処法:
- CF7の「メール」タブで送信先アドレスが正しいか確認
- 送信元(From)にサイトのドメインと一致するメールアドレスを設定する
- サーバーのPHP
mail()関数が使用可能か確認する
チェック4:reCAPTCHA v3のスコアで弾かれる
reCAPTCHA v3は「人間らしさ」のスコア(0.0〜1.0)で判定します。スコアが閾値未満だとスパム判定されて送信に失敗します。
対処法:
- reCAPTCHAの閾値を下げる(デフォルト0.5 → 0.3など)
- reCAPTCHA v2(「私はロボットではありません」チェックボックス)に変更する
- reCAPTCHAを外してテスト送信し、原因がreCAPTCHAかどうか切り分ける
チェック5:ファイル添付の制限
ファイル添付フィールドがある場合、以下の制限に引っかかることがあります。
| 設定 | 確認場所 | 推奨値 |
|---|---|---|
| 許可する拡張子 | CF7のフォーム編集画面 | jpg|png|pdf|doc|docx |
| ファイルサイズ上限 | CF7のフォーム編集画面 | limit:10mb |
| upload_max_filesize | php.ini / サーバー設定 | 10M以上 |
| post_max_size | php.ini / サーバー設定 | upload_max_filesizeより大きく |
チェック6:WAF / ModSecurity の誤検知
フォームの本文に特定のキーワードやHTMLタグが含まれると、WAFがリクエストをブロックすることがあります。
確認方法:本文を「テスト」の1語だけにして送信。通る場合はWAFの誤検知が原因です。
対処法:
- サーバーのWAF設定で
/wp-json/contact-form-7/v1/を除外する - エックスサーバーの場合:サーバーパネル → WAF設定 → 該当ルールをOFFにする
ケース3:送信成功だがメールが届かない
「ありがとうございます。メッセージは送信されました。」と表示されるのにメールが届かない場合は、メール配信の問題です。
チェック1:フォーム自体が動作しているか確認する
Flamingo プラグインを使っている場合、WordPress管理画面の「Flamingo」→「受信メッセージ」に送信データが記録されているか確認します。記録があれば、フォームは正常に動作しており、メール配信だけが問題です。
チェック2:SMTPプラグインを導入する(最も効果的)
WordPressのデフォルトのメール送信(PHP mail()関数)は、迷惑メール判定されやすく到達率が低いです。
対処法:SMTPプラグインを導入してメール配信を改善します。
- WP Mail SMTP(最も人気)
- Post SMTP Mailer(ログ機能が充実)
SMTPの送信元には、自分のドメインのメールアドレス(例:info@あなたのドメイン.com)を設定してください。GmailやYahooメールを送信元にすると、SPF認証に失敗して迷惑メールに分類されます。
チェック3:SPF / DKIM / DMARC を設定する
メールの認証設定が不備だと、受信サーバーがメールを拒否または迷惑メールフォルダに振り分けます。
| 設定 | 役割 | 設定場所 |
|---|---|---|
| SPF | 送信元IPの正当性を証明 | DNSのTXTレコード |
| DKIM | メールの改ざんを検知 | DNSのTXTレコード |
| DMARC | SPF/DKIMの認証ポリシー | DNSのTXTレコード |
エックスサーバーを使用している場合、サーバーパネルからSPF/DKIMを設定できます。
チェック4:迷惑メールフォルダを確認する
受信者側の迷惑メールフォルダに振り分けられている場合があります。
確認すべきこと:
- Gmail / Yahoo / Outlook の迷惑メールフォルダ
- 企業メールの場合、社内メールフィルタの設定
- CF7の「メール」タブで、送信先アドレスが正しいか
チェック5:CF7のメールタブの設定を見直す
| 項目 | 推奨設定 |
|---|---|
| 送信先(To) | 受信したいメールアドレス |
| 送信元(From) | サイト名 <info@自ドメイン.com> |
| 返信先(Reply-To) | [your-email](ユーザーのメールアドレス) |
注意:送信元(From)にユーザーのメールアドレス([your-email])を使うと、SPF認証に失敗します。Fromは自ドメインのアドレスにして、Reply-Toにユーザーのメールを設定するのが正しい運用です。
本番環境だけ失敗する場合
CDN / リバースプロキシの影響
Cloudflare などのCDNを使用している場合、コンタクトページと /wp-json/ のキャッシュ設定を確認してください。
対処法:Cloudflareのページルールで以下を設定
example.com/contact/→ キャッシュレベル: バイパスexample.com/wp-json/*→ キャッシュレベル: バイパス
URL の不一致(www / 非www、HTTP / HTTPS)
WordPress設定のURLとアクセスURLが異なると、REST APIへのリクエストがクロスオリジン扱いになり失敗します。
確認:WordPress管理画面 → 設定 → 一般 で「WordPressアドレス」と「サイトアドレス」が一致しているか確認します。
10分でできる最短チェックリスト
上から順番に試すだけで、ほとんどのケースが解決します。
- パーマリンクを再保存する(設定 → パーマリンク → 変更を保存)
- ブラウザのキャッシュをクリアして再送信テスト
- F12 → Console でJSエラーがないか確認
- F12 → Network で
feedbackリクエストのHTTPステータスを確認 - ページキャッシュ / JS最適化を一時停止してテスト
- reCAPTCHAを一時的に外してテスト
- セキュリティプラグインを一時無効化してテスト
- SMTPプラグインを導入してメール配信を改善
デバッグに便利な設定
原因が特定できない場合は、WordPressのデバッグモードを有効にしてエラーログを確認します。
// wp-config.php に追加 define( 'WP_DEBUG', true ); define( 'WP_DEBUG_LOG', true ); define( 'WP_DEBUG_DISPLAY', false );
エラーログは wp-content/debug.log に出力されます。CF7やメール送信に関するPHPエラーが記録されるので、原因特定に役立ちます。
注意:デバッグ確認後は必ず WP_DEBUG を false に戻してください。本番環境でデバッグモードを有効にしたままにすると、エラー情報が蓄積されてディスクを圧迫したり、セキュリティ上のリスクになります。
まとめ
| 症状 | 最も多い原因 | 最初に試すこと |
|---|---|---|
| ボタンが反応しない | JS競合 / キャッシュ | F12でConsole確認 + キャッシュクリア |
| 赤枠エラーが出る | REST APIブロック | パーマリンク再保存 |
| 成功するがメール届かない | PHP mail() の到達率 | SMTPプラグイン導入 |
解決のポイント:
- CF7の問題はフロント(JS)→ サーバー(REST API)→ メール配信の3層に分けると早い
- 最初にパーマリンク再保存とキャッシュクリアで土台を整える
- メールが届かない場合はSMTPプラグインの導入が最も効果的
- 送信元(From)は自ドメインのメールアドレスにし、Reply-Toでユーザーアドレスを設定する

