お問い合わせフォームのメール送信でハマった話。原因はXserverのsendmail制限でした

お問い合わせフォームのメール送信でハマった話。原因はXserverのsendmail制限でした

お問い合わせフォームを本番のエックスサーバーに移行したところ、送信テストで原因不明のエラーが出ました。結論から言うと、Xserverのサーバー仕様が原因だったのですが、原因を突き止めるまでにけっこう回り道をしたので、記録として残しておきます。

起きた現象

Contact Form 7(CF7)のフォームは正常に受け付けているのに、実際のメール送信だけが失敗する状態でした。CF7側のエラーメッセージは「メッセージの送信中にエラーが発生しました。後ほど再度お試しください。」という、原因がまったく分からない一般的な文言だけでした。

最初に疑ったこと(外れ)

最初は、CF7のメール設定にある「差出人」欄が原因だと思いました。差出人が個人のGmailアドレスになっていたので、サイトのドメインと一致しない差出人だと送信元の正当性を疑われて弾かれるのでは、と考えたのです。実際、これは一般的によくある原因のひとつではあるのですが、差出人をサイトの独自ドメインのアドレスに変更しても、症状は変わりませんでした。

CF7のエラーメッセージだけでは分からなかった

今回一番苦労したのは、CF7の管理画面やフロント側のエラー表示が、あまりに一般的すぎて何も教えてくれない点でした。「エラーが発生しました」という文言だけでは、フォームのバリデーションの問題なのか、メール設定の問題なのか、サーバー側の問題なのか、まったく切り分けができません。実際、CF7のREST APIが返すレスポンスをブラウザの開発者ツールのネットワークタブで直接確認してみると、status: mail_failedという値が返ってきていて、少なくとも「フォームの入力内容自体は正しく受理されている」ことは分かりました。ここでようやく、疑うべきは入力内容ではなく送信処理そのものだと絞り込めました。

本当の原因

WP-CLI経由でサーバーに直接SSH接続し、wp_mail()を直接呼び出してエラー内容を詳しく取得してみたところ、ようやく本当のエラーメッセージにたどり着きました。

sendmail: fatal: User xxxxx is not allowed to submit mail

これは、PHPのmail()関数が内部的に呼び出しているsendmailコマンドが、そのサーバーアカウントのユーザーによるメール送信を拒否している、という意味です。CF7の一般的なエラーメッセージからはまったく想像がつかない、サーバー環境固有の制限でした。Xserverでは、独自ドメインでメールを送るには通常サーバーパネルでそのドメイン用のメールアカウントを作成しておく必要があるのですが、契約が試用期間中でメール機能自体が使えない状態だったため、この制限に引っかかっていたのだと分かりました。

解決策: SMTP経由の送信に切り替える

ローカルのsendmail経由の送信をあきらめ、SMTP認証を使って外部のメールサーバー経由で送信する方式に切り替えました。具体的には「WP Mail SMTP」というプラグインを導入し、既に持っていたGmailアカウントをSMTPサーバーとして使う設定にしました。

  • SMTPホスト: smtp.gmail.com
  • ポート: 587(TLS)
  • 認証: Gmailのアプリパスワードを使用

Gmailの「送信」機能を使う形になるので、サーバー側のsendmail制限を完全に迂回できます。設定変更後、送信テストは無事成功しました。

アプリパスワードの発行が必要な理由

GmailアカウントのSMTPをそのまま使う場合、通常のログインパスワードでは認証できません。2段階認証を有効にした上で、Googleアカウントの設定から「アプリパスワード」という、特定のアプリ・用途専用の16桁のパスワードを別途発行する必要があります。これはセキュリティ上、通常のログインパスワードをそのまま外部サービスに渡さないための仕組みです。パスワード自体はGoogleの管理画面上でしか発行・確認できないため、この作業はサイト所有者本人にしかできません。

あわせて確認したこと

SMTP切り替え後、念のためreCAPTCHA導入後も正常に送信できるか、フォーム送信後にサンクスページへ正しくリダイレクトされるかも合わせて再テストしました。メール送信の仕組みを変えると、他の関連機能まで一緒に壊れていないかを確認する癖をつけておいた方が安全です。

もし試用期間でなくても起きうる話

今回はたまたまサーバーが試用期間中でメール機能が未設定だったことが直接の原因でしたが、SMTP経由での送信に切り替えたこと自体は、契約が本格稼働してからも継続して使うつもりです。共有レンタルサーバーのsendmail経由の送信は、スパム対策の都合で他のユーザーの利用状況次第では届きにくくなることもあると聞きます。最初からSMTP認証で送る構成にしておけば、そうした環境要因に左右されにくくなるので、結果的に安定運用という意味でも良い選択だったと思っています。

もし同じようにお問い合わせフォームのメール送信で詰まっている方がいたら、CF7の設定画面だけを見直すのではなく、一度WP-CLIなどでサーバー側のエラーログを直接確認してみることをおすすめします。管理画面のエラーメッセージは、あくまで「ユーザー向けに丸められた」情報でしかないので、本当の原因はもっと下のレイヤーに隠れていることが多いです。

まとめ

レンタルサーバーでの「原因不明のメール送信エラー」は、CF7側の設定ミスだと決めつけずに、まずサーバー側の制限を疑ってみることをおすすめします。特に契約したてで試用期間中のサーバーは、メール機能が制限されていることがあるので要注意です。SMTP経由に切り替える方法は、サーバー側の制限を気にせず安定して送信できるので、原因調査に時間をかけるよりも先にこちらを試してしまうのも一つの手だと思います。

この記事が参考になったら、応援クリックをお願いします

タイトルとURLをコピーしました