はじめに
「問い合わせフォームの通知が届かない」「会員登録やパスワード再設定のメールが迷惑メールフォルダに入る」「注文確認メールがお客様に届かないと言われた」——WordPressサイトで非常に多いトラブルです。
原因の多くは1つに集約されます。WordPressが既定でメールを"認証されていない方法"で送っているため、受信側に弾かれているのです。この記事では、なぜ届かないのかを仕組みから説明し、認証済みSMTPでの送信とドメインのSPF/DKIM/DMARC設定という2段構えで、コピペ中心に直していきます。対象は、WordPressサイトを運用・制作している方です。
メール送信まわりの設定ミスは「正規メールが届かない」事故に直結します。本番反映前にテスト送信で確認し、DNS変更は反映に時間がかかる点も踏まえて作業してください。
まず結論(直し方の全体像)
急ぎの方向けに先に要点です。詳細は以降で順に解説します。
-
送信を「認証済みSMTP」に切り替える(WordPress既定の直接送信をやめる)。SMTP送信プラグイン、または
phpmailer_initフックで、メール送信サービス(Google Workspace / Microsoft 365 / Amazon SES / SendGrid / Brevo など)経由にする。 -
差出人(From)を自分のドメインのアドレスに揃える(例:
noreply@example.com)。 - そのドメインに SPF・DKIM・DMARC を設定し、送信サービスを認証済みにする。
この3つで、「自分のドメインから、認証された経路で送られたメール」になり、受信側に正規メールと判定されやすくなります。
なぜ届かない・迷惑メールになるのか
WordPressの wp_mail()(問い合わせフォーム系プラグインも内部でこれを使います)は、既定でPHPの mail() 関数を使い、Webサーバから直接メールを送信します。ここに問題があります。
- そのWebサーバのIPは、あなたのドメインの SPFに登録されていないことがほとんど。→ SPF認証に通らない。
- 直接送信では DKIM署名が付かない。→ DKIM認証もない。
- 結果、受信側(Gmail等)から見ると「
example.comを名乗っているのに、example.comが許可した経路でも署名でもない」メールになり、迷惑メール送り、最悪は受信拒否になります。 - 共有サーバの場合、同居する他サイトの送信でIPの評価(レピュテーション)が落ちていることもあります。
そして近年、これはさらに厳しくなっています。Gmail・Yahoo は2024年から、Microsoft(outlook.com / hotmail.com / live.com)も2025年から、認証(SPF/DKIM/DMARC)を満たさないメールの扱いを強化しており、未認証のメールは届かない前提で考えるべき状況です。「昔は届いていた」は通用しなくなりつつあります。
つまり直し方は「認証された経路で送る」ことに尽きます。
直し方1:認証済みSMTPで送る(本命)
WordPressの直接送信をやめ、SPF/DKIMを設定済みのメールサービスのSMTPを経由させます。これが最も確実です。
方法A:SMTP送信プラグイン(おすすめ・簡単)
「WP Mail SMTP」などのSMTP送信プラグインを使うと、管理画面から設定できます。手順の要点は共通です。
- 送信サービス(Google Workspace / Microsoft 365 / Amazon SES / SendGrid / Brevo 等)のSMTP情報またはAPIキーを入力。
-
差出人(From)を、認証するドメインのアドレス(例:
noreply@example.com)に設定。 - 送信サービス側でドメインを認証し、後述のSPF/DKIMレコードをDNSに登録。
問い合わせフォーム(Contact Form 7、WPForms など)も内部で wp_mail() を使うため、SMTPに切り替えればフォーム通知もまとめて改善します。
方法B:プラグインなし(phpmailer_init フック)
コードで管理したい場合は、認証情報を wp-config.php の定数に置いたうえで、mu-plugin等から設定します。
// wp-config.php(認証情報はコードに直書きしない)
define('MY_SMTP_HOST', 'smtp.provider.example');
define('MY_SMTP_USER', 'apikey-or-username');
define('MY_SMTP_PASS', '************');
// wp-content/mu-plugins/smtp.php など
add_action('phpmailer_init', function ($phpmailer) {
$phpmailer->isSMTP();
$phpmailer->Host = MY_SMTP_HOST;
$phpmailer->SMTPAuth = true;
$phpmailer->Port = 587; // STARTTLS。465を使う場合は SMTPSecure を 'ssl' に
$phpmailer->SMTPSecure = 'tls';
$phpmailer->Username = MY_SMTP_USER;
$phpmailer->Password = MY_SMTP_PASS;
});
// 差出人を自分のドメインに揃える(DMARCのアライメント対策)
add_filter('wp_mail_from', fn() => 'noreply@example.com');
add_filter('wp_mail_from_name', fn() => 'Example Site');
-
注意: 認証情報をテーマの
functions.phpに直書きしたり、Gitに含めたりしないでください。wp-config.phpの定数や環境変数で管理します。 - 注意: Fromアドレスだけを変えても、送信経路が未認証のままでは通りません。SMTP化(経路の認証)とセットで初めて効果が出ます。
直し方2:ドメインのSPF・DKIM・DMARCを整える
SMTPで送る送信サービスを、あなたのドメインの正規送信元としてDNSに宣言します。ここがないと、SMTP化しても認証に通りません。
SPF(送信を許可するサービスを宣言。1ドメインに1レコードだけ):
; 例:Google Workspace + SendGrid を併用する場合
example.com. IN TXT "v=spf1 include:_spf.google.com include:sendgrid.net ~all"
- 送信サービスを追加するたびに、既存の1行に
include:を足します(レコードを2つに分けない)。 - SPFのDNSルックアップは合計10回まで。
includeの入れ過ぎはPermErrorの原因になります。
DKIM(送信サービスが発行する公開鍵をDNSに登録):
; 送信サービスの管理画面で指示された selector・値を設定する
selector1._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3..."
- Google / Microsoft 365 / SendGrid / SES 等は管理画面で鍵を発行し、指定のTXTまたはCNAMEを登録するだけです。
DMARC(認証の整合性の方針。必ず監視から段階導入):
; ステップ1:まずは監視のみ
_dmarc.example.com. IN TXT "v=DMARC1; p=none; rua=mailto:dmarc@example.com"
- いきなり
p=rejectにすると、設定漏れの正規メールまで拒否されます。p=noneでレポート(rua)を見て、正規送信元がすべて通っていることを確認してからquarantine→rejectへ。 - SPF/DKIM/DMARCの仕組みや各タグの詳細は、別記事で掘り下げています(※SPF/DKIM/DMARC解説記事のURLに差し替え)。
メールが転送されるとSPFは壊れますが、DKIMは保たれます。SPFとDKIMの両方を設定しておくと、DMARCが通りやすく堅牢です。
確認方法
設定後は、思い込みで終わらせず実際に確かめます。
- テスト送信:WordPressのパスワード再設定メールを自分宛に送る、またはSMTPプラグインのテスト送信機能を使う。
-
受信側で認証結果を確認:Gmailで受信したメールの「メッセージのソースを表示」を開き、
SPF/DKIM/DMARCがPASSになっているかを見る。 -
DNSの確認:
dig +short TXT example.com(SPF)、dig +short TXT _dmarc.example.com(DMARC)。 -
無料ツール(評価軸が異なるので併用が有効):
- mail-tester.com:テスト送信して総合スコアと指摘を確認。
- MXToolbox / Google Admin Toolbox:SPF/DKIM/DMARCレコードの構文チェック。
- dmarcian など:DMARCの集計レポートを可視化して、どの送信元が失敗しているか把握。
- サイトドック(sitedock.jp):URLを入れると登録不要で、SPF/DMARCやヘッダ・Cookie属性などをパッシブに健診してスコア化する無料サービス。Webサイト側の設定とあわせて、ドメインの認証設定の有無をまとめて確認したいときの手段の一つとして。
最終的には、実際に送ったメールが受信側でPASSしているかと、rua レポートの内容で判断するのが確実です。
よくあるハマりどころ
- SMTP化したのにSPF/DKIMを設定していない → 認証に通らず、結局スパム判定。経路とDNSは必ずセット。
-
FromアドレスがドメインとズレているのにDMARCを
rejectにした → 正規メールが拒否される。アライメントを確認してから締める。 -
送信サービスを新しく追加したのにSPFに
includeを足し忘れた → そのサービスからのメールだけ不達。 -
SPFレコードを2つ書いた /
include過多で10ルックアップ超過 →PermErrorでSPFが無効化。 - 共有サーバの直接送信のまま → IPレピュテーション任せで不安定。SMTP化で解消することが多い。
まとめ
- WordPressの既定送信は未認証の直接送信なので、近年の受信側基準では迷惑メール送り・不達になりやすい。
- 直し方は (1)認証済みSMTPで送る、(2)Fromを自ドメインに揃える、(3)ドメインのSPF/DKIM/DMARCを整える の3点セット。
- 問い合わせフォームの通知も内部は
wp_mail()なので、SMTP化でまとめて改善する。 - 認証情報は
wp-config.phpの定数・環境変数で管理し、コードに直書きしない。 - DMARCは必ず
p=none(監視)から段階導入。SPFとDKIMの両方を設定すると堅牢。 - 設定後はテスト送信+Gmailの認証結果、mail-tester / MXToolbox / dmarcian などで必ず確認する。
関連記事
- WordPressセキュリティ 最低限やることチェックリスト10(※公開済み記事のURLに差し替え)
- Webサイトに最低限入れるべきHTTPセキュリティヘッダ7種と設定例(※同上)
- SPF / DKIM / DMARC の仕組みと設定の詳細解説(※同上)
想定タグ: WordPress メール SMTP SPF DMARC
想定読了時間: 約9〜11分
難易度: 初〜中級
関連記事
- 兵庫県の企業サイト307件を外形調査したら、DMARC未設定55%… — メール認証の普及状況の実データ
- WordPressセキュリティ 最低限やることチェックリスト10
- Webサイトに最低限入れるべきHTTPセキュリティヘッダ7種と設定例
お知らせ — バーチャルセキュリティコンシェルジュ「一ノ瀬あかり」がデビューしました🎉
JIISセキュリティラボから、セキュリティ用語をやさしく動画で解説する案内役「一ノ瀬あかり」が登場しました。よければデビューのご挨拶もご覧ください。