Contact Form 7 でメールを送信できない原因と2つの解決方法

Contact Form 7 でメールを送信できない?

Contact Form 7 でメールを送信できない(急にできなくなった)という相談を、国内海外のお客様から連続して受けた。「WordPress サイトで Contact Form 7 の問い合わせフォームを設置しているのですが、メールを送れない原因が分かりません。」という。

今回は、Contact Form 7 のメール送信ができなくて困っている人のために、実はひっそりと増えていたメール送信エラーの「原因」および「その解決方法」についてまとめてみた。

原因. Rest API が無効に設定されていた

ここ最近、Contact Form 7 からメールを送信できない(急にできなくなった)という相談が多くなっていた『原因』はズバリこれだった。そう、何かと話題の Rest API である。

WordPress における Rest API はバージョン 4.7 より標準で有効となった機能だが、2017年に入ってすぐ「認証なしでサイトを改ざんできるバグ」が発見されたため、セキュリティ面の懸念から『無効』に設定している人が少なくない。150万件もの WordPress サイトで改ざん被害が出たニュース は記憶に新しく、無効にしようとする「理由」はよく分かる。

ところが、Rest API が無効に設定されている状態で Contact Form 7 の送信ボタンを押すと、以下の「回転矢印アイコン」がくるくると回ったまま先に進むことができない。
Contact Form 7 送信ボタン Contact Form 7 でメールを送信できないときの回転矢印アイコン

内容が「問い合わせフォーム」であれ「セミナー申し込みフォーム」であれ、メールを送信できない状態で放置していると、顧客獲得のチャンスを棒に振ってしまうことになる。

もう既にこの状況に気付いているなら、直ちに入念な確認と対策をしよう。

Javascript のエラーを確認する

実は Chrome デベロッパーツールで検証すると、以下の Javascript エラーが発生している。
Contact Form 7 failed to load resource 401 error message

これは、サーバー側で『/wp-json/contact-form-7/v1/contact-forms/30/feedback』の URL に対してアクセスを許可していないことを示している『HTTP 401 認証エラー』だ。

実は、最新の Contact Form 7(ver. 4.8)では、メールフォームが「非同期処理」でメールを送信するための処理に『Rest API』を使用している。だから、Rest API が無効の設定では  Javascript 実行エラーとなり「データを送信できない」し、問い合わせをデータベースに格納するプラグイン でさえも「データを受け取れない」ので動作しなくなる。

なお、Rest API 無効の設定次第では『HTTP 500 内部サーバーエラー』となる場合もある。しかし、こちらもやはり原因は「Contact Form 7 が Rest API を使えないこと」にある。
Contact Form 7 failed to load resource 500 error message

Rest API 無効化の設定は「どこ」か?

Rest API が無効にされている設定箇所として、僕が実際に確認したのは以下の5つである。

もしかすると別のケースもあるかもしれないが、まずは以下の箇所をひとつひとつ確認していくことをおすすめする。

WordPress 側

  1. Disable Rest API などのプラグイン
  2. functions.php による Rest API の無効化
  3. テーマ設定による Rest API の無効化
    例: Simplicity2 にて事例を確認済み

サーバー側

  1. .htaccess による Rest API の無効化
  2. サーバー運営会社による国外アクセス制限

▼ 僕が実際に確認した「5. サーバー運営会社による国外アクセス制限」の情報。

Xserver(エックスサーバー)
https://www.xserver.ne.jp/news_detail.php?view_id=3149

wpX(ダブリューピーエックス)
https://www.wpx.ne.jp/server/news_detail.php?view_id=1557

複数箇所で無効化されている可能性も

ここでひとつ特筆すべき点は、サイト運営者が気付いていない間に、複数箇所で Rest API が無効化されている可能性もあることだ(3つ以上の設定が効いている可能性もある)。

実際に、サイト管理者がセキュリティ対策として「1. Disable Rest API」のプラグインを導入していた一方で「5. サーバー運営会社側による国外アクセス制限」も掛かっていたケースをこの手で解決した。これは、僕が『海外ノマド生活』をしているおかげ もあって判明した。

国外からの問い合わせがあるサイトは、サーバー側の設定もしっかり確認しておこう。

気付いていない人も多いはず

今回この件で問い合わせをしてくださった方々は、比較的 PV 数の多い WordPress サイトを運営されていた。問い合わせメールがパッタリとなくなったり、ユーザからの親切な報告があったりしたことで、Contact Form 7 の異常に気付くことができたのだ。

しかし、PV 数および問い合わせ数の少ないサイト運営者にいたっては、メールを送信できていない状況に「まだ」気付いていない可能性も高い。というのも、実は WordPress 管理者がテストをするときは問題なくメールが送信されるケースがあるからだ。
Contact Form 7 の Rest API によるメール送信

つまり、親切なユーザから「問い合わせフォームからメールを送信できないようです。」と連絡があっても、サイト運営者が念を入れて確認しなければ「弊社側の環境では送信できております」などと回答し、対策を取らずに放置してしまうかもしれない。

 警告1. 知らない間に影響が出ている

先にも挙げた『Rest API の脆弱性』が発表された2017年2月、セキュリティの確保のために世界中の WordPress サイトに様々な対策がなされた。ただし、その対策が Contact Form 7 のメール送信機能を制限することになると想像した人はいなかっただろう。

また、WordPress 本体を 4.7 以上にアップデートしたタイミング、セキュリティ対策のため Rest API を無効化したタイミング、Contact Form 7 をアップデートしたタイミングなどは、それぞれの WordPress サイトによって異なる。

どの組み合わせで影響があるかは分かりづらいので、自分の運営サイトで Contact Form 7 を利用している人は、とにかく1度状況を確認してみることをおすすめする。

警告2. 見えない形で影響が出ている

とても厄介なことに、『1. Disable Rest API』のプラグイン導入で Rest API を無効化すると「非ログインユーザ」に対してのみ Rest API が無効になる。つまり、WordPress の管理者が「ログイン済みの状態」で Contact Form 7 のテストをすると、正常にメールが送信される。ところが、サイト訪問者が送信しようとすると、フォームはまったく動作しなくなる。

脆弱性を守るセキュリティ対策としては正しいのだが、メール送信フォームの挙動としてはあるまじきことであり、しかも「WordPress 管理者」はその事実に気付くことができない。

『5. サーバー運営会社による国外アクセス制限』についても、同じことが言える。サイトの運営陣が国内でテストをする分には正常にメール送信されるので、国外からの問い合わせを想定していたとしても「海外ではメールを送信できないこと」に気付けないのだ。

Contact Form 7 の送信テストをする場合には、WordPress からログアウトしてテストすることと、できるなら念のために国外の IP からも送信してみよう。

解決方法1. Rest API の有効化

多くの場合、Rest API を有効にすれば全面解決する。以下の「手順1」「手順2」を参考にしながら、WordPress の Rest API が有効になるように設定しよう。なお、Contact Form 7 の Rest API のみを有効化することもできる。これについては「手順3」を参考にして欲しい。

手順1. WordPress を最新版にアップデート

WordPress 4.7 より古いバージョンを使っている場合は、そもそも Rest API が標準で有効になっていない。また、前述したように 4.7 や 4.7.1 には最悪急の脆弱性がある ため、いずれにしても『最新版の WordPress にアップデートすること』が推奨される。

WordPress を最新版にアップデートする重要性については、WordPress 独学者にありがちな9つの失敗 という過去記事でも書いたとおりだ。WordPress 本体だけでなく、プラグインも最新の状態を保つように心掛けよう。

なお、作業前の WordPress のバックアップには UpdraftPlus というプラグインを使うことをおすすめする。もしサイトに万が一のことがあっても、管理画面から「ワンクリック」で簡単に復元できる。

手順2. WordPress の Rest API を有効にする

手順1で「最新版の WordPress にアップデート」ができたら、上述した以下5つの箇所で Rest API が無効の設定になってしまっていないか「ひとつひとつ」確認していこう。

WordPress 側

  1. Disable Rest API などのプラグインを停止
  2. functions.php による Rest API の無効化 を削除
  3. テーマ設定による Rest API の無効化を解除
    例: Simplicity2 にて事例を確認済み

サーバー側

  1. .htaccess による Rest API の無効化 を削除
  2. サーバー運営会社による国外アクセス制限を解除

どれかひとつでも無効になっている箇所があるなら、設定を解除して Rest API を「有効」にしよう。これで、どんな場合でも Contact Form 7 が正しく動作するようになるはずだ。

手順3. Rest API の有効/無効を個別設定にする

最後に、Rest API を有効にすることに対してセキュリティ面での不安がある場合は、個別の API ごとに『有効/無効』を設定しておこう。今後は、Contact Form 7 以外でも Rest API を使った「便利な機能」がどんどん実装されていくはずだ。

個別設定の方法としては「3. functions.php による Rest API の無効化」をおすすめする。

functions.php の具体的な記述方法は、Contact Form 7 の Rest API のみ個別に有効化している実際の例 を参考にすると良い。ただし、そのうちもっと簡単に設定できるプラグインが登場するだろう。

解決方法2. 通常のフォーム送信に切り替える

どうしても Rest API は有効にしたくない、もしくは『解決方法1』の設定作業は難しいので自分にはできそうにない、という場合は「Contact Form 7」プラグインのアドオンに当たる「Contact Form 7 Controls」のプラグインを導入し、Rest API による非同期のフォーム送信ではなく『通常のフォーム送信』に切り替える解決方法を取ると良いだろう。

こちらの方法ではページの再読み込みが発生するので、『矢印回転アイコン』を表示させて Rest API でメールを送信する場合と比べて「表示速度」が遅い。ただ、メール送信完了時に『別のページ』に誘導させ、より多くの情報を表示させたいケースでは便利にもなる。

手順1. Contact Form 7 Controls をインストール

まず、WordPress 管理画面の[プラグイン » 新規追加]から「Contact Form 7 Controls」をインストールして有効化しよう。なお、プラグインのインストール方法は割愛する。

Contact Form 7 Controls プラグインをインストールして有効化

手順2. コンタクトフォームの設定を変更

「Contact Form 7 Controls」をインストールして有効化すると、Contact Form 7 のフォーム編集画面に『Customize』のタブが追加される。あとは、参考画像の赤枠で示しているように『AJAX Submissions » Disable AJAX for this form』にチェックを入れて保存しよう。

また、もうひとつの赤枠で囲っている部分では、送信完了時にリダイレクトさせるページの URL が指定可能だ。何も設定しなければフォームのあるページが再表示されるが、もし別のページにジャンプさせたい場合は、そのページの URL をここへ入力して保存しよう。

コンタクトフォームからのメール送信で Ajax を利用しない設定にする

なお、上記設定はコンタクトフォームごとにそれぞれ変更する必要がある。同一サイト上に複数のコンタクトフォームを設置している場合は、忘れずにひとつずつ設定変更しよう。

取りこぼしの予防策もついでに!

メールの取りこぼしや、せっかくの見込み客の離脱を防ぐための対策としては、フォームの近くに『別の連絡窓口』を掲載しておくことが有効である。電話番号や、メールアドレス、SNS アカウントの情報などを記しておくと良いだろう。

また、コンタクトフォームの送信後にサイトから「自動返信メール」が届くことを明記しておくのも有効である。自動返信メールを受け取れないと「おかしいな」と気付けるため、『別の連絡窓口』から親切に教えてくれる人があらわれやすくなる。

さらに「送信エラーにお気付きの際には、大変お手数ではございますが、以下の連絡先までご連絡ください。」とメッセージまで添えておけば、親切なユーザが教えてくれる可能性は一段と高くなるだろう。

今回の件について

今回の問題が発生している Contact Form 7 は、WordPress 利用者のコミュニティの中では、長年利用され愛され続けてきたプラグインだ。しかし、2017年6月のアップデートによって、多くのコンタクトフォームが「知らない間に」動作しなくなっていたと思われる。

おそらく、設置済みフォームからメールを送信できない状態になっていると気付けていない人も多いだろう。「ここ最近、サイトからお問い合わせがないなぁ」と思っている人は、Contact Form 7 が『Rest API』を使用できずメールを送信できていないのかもしれない。

WordPress サイト(ホームページやブログ)に「Contact Form 7」でコンタクトフォームを設置している人は、知らない間にメールを送信できない状態になっていないか、この記事を参考にしながら再テストしてみることをおすすめする。