お問い合わせフォームが送信できない(mail_failed)ときの切り分け手順|Contact Form 7・WordPress

飯田市でホームページ制作をしている牧内です。

長く更新されていなかったWordPressサイトを更新したところ、お問い合わせフォームだけが送信できなくなりました。フォームは表示され、入力もできます。送信すると、「メッセージの送信に失敗しました。後でまたお試しください。」と表示されます。

この記事では、このときの原因の切り分け手順を中心に、更新作業で起きた他のトラブルも整理します。Contact Form 7で送信に失敗する場合に、どこまでが正常でどこから失敗しているかを、自分で確認できるようにすることが目的です。飯田市・南信州でホームページ制作会社をお探しの方、フォームの不具合でお困りの方の参考になれば幸いです。

サーバーの契約プランやPHPの実行方式によって、対処は変わります。この事例が、すべての環境に当てはまるわけではありません。

この記事の要点

  • Chromeの開発者ツールで、フォーム送信時の通信(feedback)のResponseを確認する
  • status が mail_failed、invalid_fields が空なら、入力の問題ではなく、メール送信処理で失敗している
  • WP Mail SMTPのテストメールで、WordPressのメール送信自体が動いているかを確認できる
  • フォームの設定変更を繰り返す前に、「どこまで動いていて、どこで失敗しているか」を先に確認する
  • 会社の通常のメール送受信と、WordPressからのメール送信は、別の仕組み

背景:更新作業で、複数の問題が連続して出た

今回のサイトは、WordPress本体、テーマ、プラグインが長く更新されておらず、PHPも古いバージョンでした。保守のために、WordPressの更新とサーバー環境の見直しを行いました。作業の中で起きたのは、次の問題です。

発生した問題対応・確認内容
PHP変更後のHTTP 500いったん旧PHPに戻して復旧し、順に更新
WordPress更新時のcURL error 60CA証明書バンドルを確認・更新
古いテーマ・プラグインバックアップ後に更新
管理画面からの設定保存エラーサーバーのWAFの影響を検証
フォームの送信失敗本記事の中心

PHP 8.4の環境で、サイトが動作するところまでは進みました。PHPの500エラー、cURL error 60、更新の順序については、別の記事で詳しく書いています。ここでは、更新で気をつけた点だけを簡単にまとめます。

更新時に気をつけた点

表示できない状態のまま、設定を重ねて変更しない。 PHPを変更して500エラーが出た場合は、いったん元のバージョンに戻して表示を回復させ、その状態から順に更新します。そうすると、問題を切り分けやすくなります。

ファイルとデータベースは、セットでバックアップする。 FTPで取得したファイル、データベースのSQL、WordPressのエクスポート、更新前のテーマファイルを保存しました。画像やテーマのファイルだけでは、投稿内容や設定を復元できないためです。

ブラウザからのHTTPS表示と、サーバーから外部へのHTTPS通信は別。 SSL証明書を設定してHTTPSで表示できても、WordPressの更新時に、サーバーから外部への通信が失敗することがあります。今回のcURL error 60は、WordPress内部の wp-includes/certificates/ca-bundle.crt を、公式の正規のファイルに置き換えて解消しました。証明書の検証を無効にする方法は使っていません。コアファイルを手動で変更する場合は、事前のバックアップが必要です。

管理画面の設定保存エラーは、WAFを疑う。 テーマの設定を保存するときにエラーが出ました。サーバー側のWAF(Web Application Firewall)が、管理画面からの保存を妨げている可能性を確認し、作業の間だけWAFを停止しました。作業のあとは、有効に戻しています。WAFはセキュリティ対策のため、無効のまま運用しないでください。

現象:サイトは正常、フォームだけ送信できない

更新が進み、サイトの表示、HTTPS、本体・テーマ・プラグインの更新は問題なく終わりました。ところが、お客様の確認で、お問い合わせフォームの送信エラーが見つかりました。

使っていたのは、Contact Form 7です。送信すると、次のメッセージが表示されました。

text

メッセージの送信に失敗しました。
後でまたお試しください。

仮説:フォームの設定か、メール送信処理か

最初は、フォーム側の設定を疑い、次の確認と変更をしました。

  • メールの送信先アドレスの変更
  • メール設定の確認
  • 自動返信メール(メール2)の無効化
  • 関連する追加プラグインの影響の確認
  • Contact Form 7のバージョンの変更

いずれも、エラーは解消しませんでした。設定を変えながら試す方法には、限界があります。そこで、実際の送信処理がどこまで進んでいるかを確認することにしました。

検証1:Chromeの開発者ツールで、送信結果を見る

Contact Form 7は、WordPressのREST APIで送信処理を行います。送信時の通信を、Chromeの開発者ツールで確認できます。

手順

  1. お問い合わせフォームのページを開く
  2. F12キーなどで、開発者ツールを開く
  3. 「Network」タブを選ぶ
  4. フォームをテスト送信する
  5. 通信の一覧から、feedback を探して選ぶ
  6. 「Response」(または「プレビュー」)を開く

通信先のURLは、次のような形式です(数字はフォームのIDで、サイトによって異なります)。

text

/wp-json/contact-form-7/v1/contact-forms/123/feedback

HTTPステータスは、200 OK でした。これだけを見ると、送信が成功したように見えます。ただ、200は、サーバーがリクエストに応答したことを示すだけです。メールの送信が成功したことを、意味しません。

Responseの内容

Responseには、次の内容が入っていました。

json

{
  "status": "mail_failed",
  "message": "メッセージの送信に失敗しました。後でまたお試しください。",
  "invalid_fields": []
}

見るべきは、次の2つです。

項目今回の値意味
invalid_fields空入力欄の検証エラーはない
statusmail_failedメール送信の処理で失敗している

入力の不備が原因なら、invalid_fields に該当する項目が入り、status は validation_failed になります。今回は、ブラウザからContact Form 7への送信までは成功し、その先のメール送信処理で失敗していることが分かりました。フォームのJavaScriptやREST APIの通信は、優先して調べる必要がなくなりました。

検証2:WP Mail SMTPで、WordPressのメール送信をテストする

次に、WordPressのメール送信そのものが動いているかを確認しました。WP Mail SMTPプラグインのテストメール機能を使いました。ここでの目的は、SMTPに切り替えることではありません。WordPressから直接メールを送れるかを、確認することです。

手順

  1. WP Mail SMTPをインストールして、有効化する
  2. 設定画面の「メールテスト」を開く
  3. 送信先を入力して、テストメールを送る
  4. 結果と、診断のログを確認する

結果は、失敗でした。診断ログには、次の内容が出ました。

text

Mailer: mail
PHP.mail(): Yes

Error:
Could not instantiate mail function.

PHPの標準のメール送信機能(mail())を、正常に使えなかったことを示しています。Contact Form 7に固有の問題ではなく、WordPressからメールを送る、サーバー側の仕組みに問題がある可能性が高いと判断しました。

真因:WordPressからのメール送信処理の失敗

切り分けた結果は、次のとおりです。

確認した層結果
フォームの表示・入力正常
ブラウザからContact Form 7への送信正常(HTTP 200)
入力値の検証問題なし(invalid_fields が空)
Contact Form 7のメール送信失敗(mail_failed)
WordPress自体のメール送信(テスト)失敗(Could not instantiate mail function)

今回の調査だけでは、PHPのバージョン変更が直接の原因だったとは、断定できません。メール送信の設定、PHPの実行環境、サーバー側の制限など、複数の要因が考えられます。サーバー側の原因を突き止めるには、サーバー会社への確認が必要になる場合があります。

会社のメール全体が使えないわけではない

このサイトでは、会社の通常のメールの送受信は、問題なくできていました。ホームページからのメール送信と、メールソフトによる送受信は、別の仕組みです。お問い合わせフォームが送信できなくても、会社のメール全体が止まっているとは限りません。お客様に説明するときは、この違いを先に伝えます。

対処の選択肢:SMTPか、別の受付方法か

フォームのメール送信を復旧する方法として、SMTP認証による送信を検討しました。WP Mail SMTPなどを使うと、PHPの標準のメール送信機能を使わずに、SMTPサーバー経由で送れます。

ただ、「その他のSMTP」を使う一般的な設定では、メールアカウントの認証情報を、WordPress側に保存します。お客様が日常の業務で使っているメールアカウントのパスワードを、WordPressに登録すると、サイトが侵害されたときのリスクが増えます。

SMTPそのものが危険という意味ではありません。送信専用のアカウントを用意する方法や、OAuthなどの認証方式を使う方法もあります。今回は、お問い合わせの復旧のために、業務用アカウントの認証情報を追加で管理する必要があるのかを、慎重に検討しました。

今回の結論:Googleフォームへ切り替え

お客様と相談して、お問い合わせの受付を、Googleフォームに切り替えました。

  • WordPressの既存のお問い合わせページに、Googleフォームを埋め込む
  • 回答は、Google側で受け付ける
  • Google Apps Scriptで、会社のメールアドレスに通知する

この方法には、次の利点があります。

  • WordPressの標準のメール送信機能を使わない
  • 業務用メールアカウントのパスワードを、WordPressに登録しない
  • 既存のページに、フォームを表示できる
  • Googleスプレッドシートに、回答の履歴が残る

注意点もあります。Googleフォームの管理、スクリプトの権限設定、個人情報の取り扱いは、運用の中で管理が必要です。また、今回見つかったサーバー側のメール送信の失敗そのものは、修復していません。問題のあるメール送信の経路を使わずに運用する方法を、選んだということです。

Googleフォームの埋め込みと、Apps Scriptの設定の具体的な手順は、別の記事に書いています。

運用の教訓:どの層で失敗しているかを切り分ける

「メールが送れない」という一つの現象でも、原因は、フォーム、WordPress、PHP、メールサーバーなど、複数の層にあります。画面に出るエラーメッセージだけでは、原因を特定できません。次の順に、どこまで動いていて、どこから失敗しているかを確認します。

  1. フォームが表示され、入力・送信できるか(画面)
  2. 開発者ツールのNetworkで、feedback のResponseを確認する(status と invalid_fields)
  3. WordPress自体のメール送信を、テストメールで確認する
  4. サーバー側の設定や制限を確認する(必要に応じてサーバー会社へ)

原因を調べることと、運用としてもっとも適切な解決方法を選ぶことは、同じではありません。今回は、原因の切り分けまで行ったうえで、セキュリティと、今後の保守のしやすさを見て、対応を選びました。

まとめ

古いWordPressを更新したときに、お問い合わせフォームだけが送信できなくなりました。Chromeの開発者ツールで mail_failed を確認し、WP Mail SMTPのテストで、WordPressからのメール送信自体が失敗していることを突き止めました。最終的には、受付をGoogleフォームに切り替えています。

フォームの設定を変更し続ける前に、通信のResponseとメール送信のテストで、失敗している場所を絞ります。そうすると、必要な対応が見えやすくなります。

Home
サービス
制作実績
お客様の声
デザイナー紹介
問合せ