独立サイトのフォーム送信信頼性:SMTP設定、到達率、失敗時の再試行とログ

独立サイトのフォームで「送信完了」と表示されても、お客様が本当にメールを受け取ったとは限りません。WordPressは標準でPHP mail()を使って送信するため、SMTP認証もドメイン署名もなく、到達率は必然的に...

表单投递可靠性:从提交到收件箱的四段链路Form Delivery Reliability: a four-stage pipeline from submit to inbox PHP mail() 不是邮件服务 —— 不配置 SMTP 和域名认证,投递率天然低于 60%PHP mail() is not a mail service — without SMTP and auth, delivery sits below 60% 环节Stage 关键配置Key config 失败信号Failure signal 恢复动作Recovery 1 表单提交1. Submit 字段校验 + 反垃圾Field validate + anti-spam WP Forms / Fluent FormsWP Forms / Fluent Forms honeypot + reCAPTCHAhoneypot + reCAPTCHA JS 报错 / 500JS error / 500 前端不提交Frontend never posts 关闭 JS 校验兜底Server-side validate 检查 PHP 错误日志Check PHP error log 常见死法一:端口 25 被主机商封禁,SMTP 发不出去Failure 1: port 25 blocked by host, SMTP cannot connect 换 587 或 465 端口,用 TLS/SSL 加密,不要用 25Use 587 or 465 with TLS/SSL, never plain 25 常见死法二:SPF/DKIM 未配置,邮件进垃圾箱Failure 2: SPF/DKIM missing, mail lands in spam DNS 添加 SPF TXT + DKIM CNAME + DMARC 记录Add SPF TXT + DKIM CNAME + DMARC in DNS 投递率合格线:收件箱到达率 ≥ 95%,硬 bounce ≤ 2%,软 bounce ≤ 5%Healthy: inbox rate ≥ 95%, hard bounce ≤ 2%, soft bounce ≤ 5% 失败重试:指数退避,第1/5/15/60分钟各试一次,最多4次,仍失败则告警Retry: backoff at 1/5/15/60 min, max 4 attempts, then alert 日志保留 30 天:记录 from/to/subject/响应码/重试次数,每周抽查 5 封Keep logs 30 days: from/to/subject/code/retries, sample 5 weekly 不要相信”已发送”提示 —— SMTP 返回 250 只是对方服务器接收,不等于进了收件箱“Sent” is not delivered — SMTP 250 means accepted, not inbox
フォーム送信の4段階:送信、SMTPリレー、ESPリレー、受信トレイ、そしてよくある2つの失敗パターン

独立サイトのフォーム送信信頼性:SMTP設定、到達率、失敗時の再試行とログ

結論から言うと:独立サイトのフォームで「送信完了」と表示されても、お客様が本当にメールを受け取ったとは限りません。WordPressは標準でPHP mail()を使って送信するため、SMTP認証もドメイン署名もなく、到達率は必然的に60%を下回ります。正しい方法は、専用のSMTPリレーサービス(SendGrid/Mailgun/Postmark)を導入し、SPF/DKIM/DMARCの3つのDNSレコードを設定し、指数バックオフで4回の再試行を設定することです。到達率の合格ラインは、受信トレイ到達率95%以上、ハードバウンス2%以下です。

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() ではだめですか?
本番サイトなら必ず入れてください。PHP mail() には送信者認証がなく、ポート 25 もほとんどのクラウドサーバーで塞がれているため、実際の到達率は 40 から 60 パーセント程度しかなく、多くの問い合わせが気づかないうちに迷惑メールフォルダに入ります。WP Mail SMTP か FluentSMTP を入れて SendGrid/Mailgun の無料枠につなげば、30 分で設定でき、到達率は 90 パーセント以上に上がります。テストサイトなら一時的に mail() でも構いませんが、本番公開前に必ず切り替えてください。
SPF、DKIM、DMARC の 3 つはすべて設定が必要ですか。SPF だけではだめですか?
SPF だけでは足りません。SPF は送信サーバーの IP しか検証せず、DKIM はメール本文が改ざんされていないかを検証し、DMARC は受信側に認証失敗時の扱いを伝えます。3 つのうち 1 つでも欠けると、Gmail のメールセキュリティ評価が下がります。最小構成は、SPF の TXT と DKIM の CNAME(プロバイダが提供)を設定し、DMARC はまず p=none で 1 週間様子を見てから p=quarantine に切り替えます。設定後は MXToolbox で 3 項目すべてがグリーンになって完了です。
SMTP ポートは 25、587、465 のどれを選べばいいですか?
587 か 465 を選び、25 は避けてください。25 番ポートは従来の平文送信用で、Alibaba Cloud、Tencent Cloud、AWS などの主要クラウドは迷惑メール対策として送信方向の 25 番をデフォルトで塞いでいるため、設定しても接続できません。587 は STARTTLS で暗号化を強化し、465 は SSL で直接暗号化します。どちらでも構いません。現代のクライアントは STARTTLS の対応が最も良いので、587 を優先してください。ホスティング会社が 587 も塞いでいる場合は 465 に切り替えます。
到達率はどう調べますか。メールが受信トレイに入ったのか迷惑メールフォルダに入ったのかはどこで確認できますか?
3 つの経路を合わせて確認します。1 つ目は SMTP プラグインのログで応答コードを見ます。250 番台は受信成功、4xx/5xx は失敗です。2 つ目は SendGrid/Mailgun の管理画面で集計統計を見ます。ハードバウンス、ソフトバウンス、苦情率がわかります。3 つ目は自分で実測します。Gmail、Outlook、Yahoo にそれぞれテストメールを送り、どのタブに振り分けられるかを見ます。正確な受信トレイの位置は Mail-Tester などの第三者ツールのスコアでしかわかりませんが、1 サイトにつき月 1、2 回の測定で十分です。
フォーム送信後にメールが届かないとき、一番早く原因を特定する方法は?
4層に分けて切り分けます。第1層では、フロントエンドのブラウザ Console に JS エラーが出ていないか、リクエストが送信されているかを確認します。第2層では、WordPress 管理画面の SMTP プラグインのメールログに該当の記録があるか、応答コードは何かを見ます。第3層では、Nginx の access.log で POST リクエストがサーバーに到達しているかを確認します。第4層では、SMTP サービスの管理画面でこのメールの配信イベントを調べます。どこで途切れているかを見つけ、その層だけを直してください。あちこち飛ばして調べるのは禁物です。よくある原因はポートのブロックか SPF の未設定です。
無料の SMTP 枠で足りるのか、いつ有料に切り替えるべきか?
SendGrid の無料枠は1日100通、Mailgun の無料枠は月5000通、Postmark に無料枠はありませんが100通のトライアルがあります。B2B の自社サイトでは月のフォーム送信数が100〜500通程度で、自動返信や通知メールを加えても月の利用量は通常2000通以内に収まるため、無料枠で足ります。月の送信量が5000通を超えたとき、または無料枠で速度制限がかかり始めたときに有料へアップグレードしてください。有料枠の開始価格は SendGrid が月約19.95ドル、Mailgun が月約35ドルです。

最後に

フォームの配信は、自社サイトで最も見落とされやすい取りこぼしポイントです。多くのサイト運営者はアクセス数やコンバージョン率ばかりを見ていて、「送信成功」の裏でメールが本当にお客様の手元に届いているかを確かめたことがありません。SMTP の設定と3つの DNS レコードの追加を一度行い、2時間かけるだけで、毎月の取りこぼしを半分以上減らせます。

実行は3ステップです。まず今週中に SMTP プラグインを導入し、無料枠の SendGrid か Mailgun を接続します。次に DNS パネルで SPF、DKIM、DMARC の3レコードを追加し、MXToolbox で全てグリーンになることを確認します。最後に4回の指数バックオフ再試行を設定し、毎週5通を抜き取って配信状況をチェックします。この3つを終えれば、フォーム配信の信頼性は最低限確保できます。

覚えておきたい一言。フォームの緑のチェックマークは「サーバーが受け取った」という意味でしかなく、「お客様が見た」という意味ではありません。その間には SMTP、DNS、迷惑メールフォルダという3つの関門があります。

环形山
环形山 クレーター専門家

公式アカウント · 環形山 Crater

環形山(Crater)は、WordPress独立サイト開発+Google SEO+GEO全域成長に特化した海外展開支援会社で、スマートハードウェア、産業機器、SaaS、新エネルギーなどの分野を手がけています。

プロダクト能力方法論ホワイトペーパー業界レポート
965件のシェア
78件のナレッジベース