独立サイトのフォーム送信信頼性:SMTP設定、到達率、失敗時の再試行とログ
1. PHP mail()が信頼できない理由
多くのサイト運営者は、フォームで「送信」をクリックして確認ページが表示されれば完了だと思っています。しかし実際には、WordPress標準のwp_mail()はPHP内蔵のmail()関数を使用しており、送信者認証もTLS暗号化も専用IPプールもないため、送信したメールはGmailやOutlookで迷惑メールと判定される可能性が高いです。
これはプラグインの問題ではなく、プロトコル層の問題です。mail()はメールをローカルMTA(メール転送エージェント)に渡し、MTAは相手のMXサーバーのポート25に直接接続しますが、ほとんどのクラウドホスト(Alibaba Cloud、Tencent Cloud、AWS)は迷惑メール対策として送信ポート25をデフォルトでブロックしています。結果として、フォームは成功と表示されるのに、メールはまったく送信されていません。
直感に反する判断:「手軽な」送信方法ほど、受注を逃すリスクが大きくなります。SMTPプラグインを使わないと設定の30分は節約できるように見えますが、実際には毎月問い合わせの20%から40%を失っている可能性があります。しかも、送信ページに緑のチェックマークが表示されるため、それに気づくことはありません。コンバージョンとフィルタリングを両立するフォーム項目の設計については、こちらをご覧ください問い合わせフォームの項目設計と転換率。
| 送信方法 | 平均到達率 | 設定の複雑さ | 適した用途 |
|---|---|---|---|
| PHP mail()(デフォルト) | 40% から 60% | 設定不要 | 正式サイトには非推奨 |
| ホストのローカルSMTP | 60% から 75% | 低 | テスト環境向け |
| サードパーティSMTPリレー(無料枠) | 85%から92% | 中 | 月間送信5000通以内 |
| 専用トランザクションメールサービス | 95%以上 | 中~高 | 月間送信5000通以上 |
2. SMTP設定:プラグインの選択とパラメータ
WordPressでSMTPを設定するのにコード変更は不要で、プラグインを1つインストールするだけです。主な選択肢は3つあります。WP Mail SMTP(最も普及しており、インターフェースが明確)、FluentSMTP(オープンソースで無料、複数プロバイダーのフェイルオーバーに対応)、Post SMTP(ログ機能が最も強力)。どれか1つを選べばよく、2つ同時にインストールすると競合します。
重要な設定項目は7つです。SMTPホスト名、ポート(587または465、25は使わない)、暗号化方式(TLSまたはSSL)、ユーザー名、パスワード/APIキー、送信元メールアドレス、送信元名です。送信元メールアドレスは独自ドメインと一致させる必要があります。たとえば noreply@yourdomain.com のように設定し、GmailやQQメールは使えません。SPFレコードが一致せず、迷惑メールフォルダに振り分けられてしまいます。
設定例:SendGridをSMTPリレーとして使う場合、ホストに smtp.sendgrid.net、ポートに587、暗号化にTLSを選び、ユーザー名は apikey 固定、パスワードにはSendGrid管理画面で発行したAPIキーを入力します。送信元は noreply@yourdomain.com とし、その後DNSパネルで3件のレコードを追加します。詳しくは次のセクションで説明します。
| パラメータ | 正しい値 | よくある誤り |
|---|---|---|
| SMTPホスト | smtp.sendgrid.net / smtp.mailgun.org | localhost や自サーバーのIPを入力 |
| ポート | 587(TLS)または465(SSL) | 25を使うとホスティング業者にブロックされる |
| 暗号化 | TLS(587)またはSSL(465) | 「暗号化なし」を選ぶと平文で送信される |
| ユーザー名 | SendGridは apikey 固定、Mailgunは postmaster@mg.xxx を入力 | 自分のメールアドレスを入力 |
| 送信元 | noreply@yourdomain.com | Gmail/QQの個人メールを使う |
| From名 | 会社の英文名+部署名 | 空欄のまま、または文字化けする日本語を入力 |
3. ドメイン認証:SPF、DKIM、DMARCの3レコード
SMTPプラグインの設定はあくまで第一歩です。相手のメールサーバーは、このメールが本当にあなたから送られたものだと、何を根拠に信じるのでしょうか。鍵となるのが3つのDNSレコードです。SPF(どのサーバーがあなたのメールを送信する権限を持つかを宣言)、DKIM(メールにデジタル署名を付けて改ざんを防ぐ)、DMARC(ルールに合わないメールを受け取ったときの処理方法を相手に伝える)。どれか1つでも欠けると、到達率は上がりません。
SPFはTXTレコードで、内容はおおむね v=spf1 include:sendgrid.net ~all です。これは「SendGridのサーバーだけが私のドメインで送信でき、それ以外はすべてソフトフェイルとする」という意味です。DKIMはCNAMEレコードで、SMTPサービス事業者が公開鍵を提供し、受信側がその公開鍵で署名を検証します。DMARCもTXTレコードで、先頭は v=DMARC1 です。まず p=none で1週間様子を見てから、p=quarantine に切り替えます。
判定基準:MXToolboxまたはGoogle Admin ToolboxのCheckupツールにあなたのドメインを入力し、3項目すべてがグリーンなら合格です。SPFが「not found」、DKIMが「no key」と表示された場合は、DNSパネルでレコードを追加し、15分ほど反映を待ってから再テストしてください。ドメインのコンプライアンスをGDPRと一緒に進める方法は、こちらをご覧ください。海外展開サイトのコンプライアンス基盤。
| レコード種別 | 役割 | 最小構成 | 検証ツール |
|---|---|---|---|
| SPF(TXT) | 正規の送信サーバーを宣言 | v=spf1 include:事業者 ~all | MXToolbox SPF検索 |
| DKIM(CNAME/TXT) | メールのデジタル署名で改ざん防止 | 事業者が提供するselectorレコード | DKIM Core キーチェック |
| DMARC(TXT) | ポリシーとレポートの収集 | v=DMARC1; p=none; rua=メールアドレス | Google Admin Toolbox |
| MTA-STS(TXT) | TLS暗号化通信を強制 | v=STSv1; id=20260921 | MXToolbox MTA-STS |
4. 到達率の指標と失敗時の再試行
SMTP と DNS を設定して終わりではありません。指標を監視する必要があります。核心となる数字は三つです。受信トレイ到達率(迷惑メールフォルダではなく受信トレイに入る割合)、ハードバウンス率(メールアドレスが存在しない、ドメインが存在しないなど恒久的な失敗)、ソフトバウンス率(メールボックス満杯、サーバー混雑など一時的な失敗)です。健全なラインは到達率 95% 以上、ハードバウンス 2% 以下、ソフトバウンス 5% 以下です。
失敗時の再試行をプラグインのデフォルトに任せてはいけません。WordPress のフォームプラグインはデフォルトで「一度送って終わり」で、失敗してもページにエラーが出ません。正しい方法は再試行のレイヤーを追加することです。最初の失敗後 1 分で再試行、二回目は 5 分、三回目は 15 分、四回目は 60 分です。四回とも失敗したらアラートを発報し(予備のメールアドレスや企業向けチャットに送信)、同時にこの問い合わせをデータベースに保存して手動での再送を待ちます。
シナリオ例:ある顧客がドイツの夜 11 時(あなたの北京時間の朝 6 時)にフォームを送信し、ちょうど SendGrid がメンテナンス中で SMTP が一時的なエラーを返しました。再試行がなければ、この問い合わせは失われます。指数バックオフの仕組みがあれば、60 分後の四回目の再試行が成功し、顧客は翌朝目覚めたときにあなたの自動返信を受け取ります。初回応答の速度をどう決めるかは、次を参照してください。問い合わせ初回返信のSLAとコンバージョン率。
| 指標 | 健全ライン | アラートライン | 対応アクション |
|---|---|---|---|
| 受信トレイ到達率 | 95% 以上 | 90%未満 | SPF/DKIM ログを確認 |
| ハードバウンス率 | 2% 以下 | 5% 超 | 無効なメールアドレスリストを整理 |
| ソフトバウンス率 | 5% 以下 | 10% 超 | SMTP プロバイダーのステータスを確認 |
| 再試行成功率 | 80% 以上 | 50% 未満 | 予備の SMTP チャネルに切り替え |
| 1 日あたりの平均送信量 | ベースライン ±20% | 50% 以上の急落 | フロントエンドの JS がエラーを出していないか確認 |
五、ログ記録と週次セルフチェック
ログがなければ調査の根拠がありません。Post SMTP プラグインにはメールログテーブルが付属しており、各メールの from、to、subject、送信時刻、SMTP 応答コード、再試行回数を記録します。FluentSMTP にも同様の機能があります。ログは少なくとも 30 日間保持し、それを超えたら自動削除してデータベースを圧迫しないようにします。
週に一度セルフチェックを行います。最近送信したメールを 5 通抽出し、SMTP 応答コードが 250 番台かどうかを確認します(250=成功、4xx=一時的な失敗、5xx=恒久的な失敗)。同時に Gmail で自分宛にテストメールを送り、「元のメールを表示」をクリックして SPF=pass、DKIM=pass、DMARC=pass の三項目がすべてグリーンかどうかを確認します。いずれかが fail なら、すぐに DNS を確認してください。
もう一つ見落としがちな点:フォームプラグイン自体もログを記録する必要があります。ユーザーが送信した後、JS エラーでリクエストがそもそも送信されなかった場合、SMTP ログには記録が残りません。そのためサーバー層で Nginx のアクセスログ監視を追加し、/wp-admin/admin-ajax.php(または REST API エンドポイント)への POST リクエスト数を集計します。ある日 50% 以上急減したら、フロントエンドに問題がある証拠です。サイト監視の設定方法は、次を参照してください。サイト監視とアラート。
| ログ層 | 記録内容 | 保持期間 | 確認方法 |
|---|---|---|---|
| フォーム送信ログ | フィールド値、IP、UA、タイムスタンプ | 90日 | プラグイン管理画面 / データベーステーブル |
| SMTP 送信ログ | 応答コード、再試行回数、エラーメッセージ | 30日 | SMTP プラグインのログ画面 |
| ESP 配信ログ | 開封、クリック、苦情、バウンス | プロバイダ管理画面で永久 | SendGrid/Mailgun のダッシュボード |
| Nginx アクセスログ | POST リクエスト数、ステータスコードの分布 | 14日間 | サーバーで grep access.log |
FAQ よくある質問
WordPress のフォームに SMTP プラグインは必ず必要ですか。PHP mail() ではだめですか?
SPF、DKIM、DMARC の 3 つはすべて設定が必要ですか。SPF だけではだめですか?
SMTP ポートは 25、587、465 のどれを選べばいいですか?
到達率はどう調べますか。メールが受信トレイに入ったのか迷惑メールフォルダに入ったのかはどこで確認できますか?
フォーム送信後にメールが届かないとき、一番早く原因を特定する方法は?
無料の SMTP 枠で足りるのか、いつ有料に切り替えるべきか?
最後に
フォームの配信は、自社サイトで最も見落とされやすい取りこぼしポイントです。多くのサイト運営者はアクセス数やコンバージョン率ばかりを見ていて、「送信成功」の裏でメールが本当にお客様の手元に届いているかを確かめたことがありません。SMTP の設定と3つの DNS レコードの追加を一度行い、2時間かけるだけで、毎月の取りこぼしを半分以上減らせます。
実行は3ステップです。まず今週中に SMTP プラグインを導入し、無料枠の SendGrid か Mailgun を接続します。次に DNS パネルで SPF、DKIM、DMARC の3レコードを追加し、MXToolbox で全てグリーンになることを確認します。最後に4回の指数バックオフ再試行を設定し、毎週5通を抜き取って配信状況をチェックします。この3つを終えれば、フォーム配信の信頼性は最低限確保できます。
覚えておきたい一言。フォームの緑のチェックマークは「サーバーが受け取った」という意味でしかなく、「お客様が見た」という意味ではありません。その間には SMTP、DNS、迷惑メールフォルダという3つの関門があります。
