「問い合わせフォームからのメールが届かない」という相談は、WordPress案件で最も多い依頼の1つです。
そして最もやってはいけないのが、いきなりWordPressのプラグインを入れて設定を変えることです。原因が分からないまま設定を変えると、直ったのか偶然なのか判別できなくなります。
先に切り分けます。
結論:この順で切り分ける
- WordPressの外でSMTPが通るか確認する(PHPもWPも使わない)
- 通るなら、WordPress側の送信設定を見る
- 通らないなら、サーバー・DNS・受信側のどれかを特定する
「1」を飛ばすのが最大の遠回りです。
なぜ最小テストが要るか
メール不達の原因は、大きく4層に分かれます。
| 層 | 例 |
|---|---|
| WordPress | プラグインの設定ミス、フォームの送信先が空 |
| PHP / サーバー | mail() が無効、送信制限、SMTPポート閉鎖 |
| DNS認証 | SPF/DKIM/DMARC の不備 |
| 受信側 | Gmailの迷惑メール判定、受信拒否設定 |
層が違えば直し方が全く違います。 WordPressのプラグイン設定をいくら変えても、DNS認証が原因なら永久に直りません。
そして厄介なのは、WordPressから送ると4層すべてを一度に通ることです。どこで落ちたか分からない。だから、層を1つずつ潰します。
STEP 1: WordPressを使わずにSMTPを試す
WordPressもPHPも介さず、SMTPサーバーに直接話しかけて送信できるか確認します。
SSHが使えるなら、swaks が最も手軽です。
swaks \
--to test@gmail.com \
--from info@example.com \
--server smtp.example.com \
--port 587 \
--auth LOGIN \
--auth-user info@example.com \
--auth-password 'パスワード' \
--tls
swaks が無い環境なら、Pythonでも同じことができます。
import smtplib
from email.mime.text import MIMEText
msg = MIMEText('最小SMTPテスト')
msg['Subject'] = 'SMTP test'
msg['From'] = 'info@example.com'
msg['To'] = 'test@gmail.com'
s = smtplib.SMTP('smtp.example.com', 587)
s.starttls()
s.login('info@example.com', 'パスワード')
s.send_message(msg)
s.quit()
print('送信完了')
このテストの意味
- 送信が成功し、Gmailに届く → SMTPは生きている。原因はWordPress側
- 送信は成功するが届かない → DNS認証か受信側の問題
- 送信自体がエラー → サーバー・認証情報・ポートの問題
この1回で、調査範囲が4分の1になります。
STEP 2: 接続エラーの読み方
STEP 1でエラーが出た場合、メッセージで原因が分かります。
Connection refused / タイムアウト
ポートが閉じています。レンタルサーバーは587や465を外向きに閉じていることがあります。サーバー会社のマニュアルで、外部SMTPの利用可否を確認してください。
535 Authentication failed
認証情報が違います。ユーザー名がメールアドレス全体か、@より前だけかはサーバーによって異なります。
550 relay not permitted
そのサーバーから、その差出人アドレスで送る権限がありません。差出人のドメインとSMTPサーバーの所有者が食い違っているケースです。
STEP 3: 送信は通るのに届かない場合
STEP 1で送信は成功したのにGmailに届かない。このパターンが最も多く、そして最も誤診されます。
原因はほぼDNS認証です。
何が起きているか
Gmailは、届いたメールが「本当にそのドメインから送られたか」を検証します。検証の仕組みが3つあります。
SPF — 「このドメインのメールは、このIPアドレスから送られる」という宣言。DNSのTXTレコードに書きます。
v=spf1 include:_spf.example-server.jp ~all
送信元サーバーがこのリストにないと、なりすまし扱いされます。
DKIM — メールに電子署名を付け、公開鍵をDNSに置く仕組み。署名が検証できれば改竄されていないと分かります。
DMARC — SPFとDKIMが失敗したときにどう扱うかの指示。
v=DMARC1; p=none; rua=mailto:dmarc@example.com
p=none は「失敗しても受け取ってよい、ただし報告はして」という意味です。
確認方法
コマンドで現状を見られます。
# SPF
dig +short TXT example.com | grep spf
# DMARC
dig +short TXT _dmarc.example.com
# DKIM(セレクタ名はサーバーによる)
dig +short TXT default._domainkey.example.com
最も確実な確認方法は、Gmailに届いたメールのヘッダを見ることです。Gmailで該当メールを開き、「メッセージのソースを表示」を選ぶと、以下が出ます。
Authentication-Results: mx.google.com;
spf=pass (google.com: domain of info@example.com ...)
dkim=pass header.i=@example.com
dmarc=pass (p=NONE ...)
pass が並んでいれば認証は通っています。fail や softfail があれば、そこが原因です。
迷惑メールフォルダに入っている場合も、必ずヘッダを確認してください。 「届いていない」と「迷惑メールに入っている」は原因が違います。
STEP 4: WordPress側の設定
STEP 1が通り、DNS認証も通っているなら、原因はWordPress側です。
WordPressの標準送信(wp_mail)は、PHPの mail() 関数を使います。これはサーバーのローカル送信なので、SPF/DKIMの設定と食い違いやすいという構造的な弱点があります。
対策は、WordPressからも認証付きSMTPで送るようにすることです。SMTPプラグインを入れ、STEP 1で通った設定と同じ値を入れます。
- SMTPホスト
- ポート(587 / TLS が一般的)
- 認証あり
- ユーザー名・パスワード
- 差出人アドレスをSPFに含まれるドメインにする
最後の項目が重要です。差出人を noreply@gmail.com のような他社ドメインにすると、SPFが必ず失敗します。
STEP 5: フォームプラグイン側
ここまで通っているのにフォームからだけ届かない場合、フォームの設定です。
- 送信先アドレスが空になっていないか
- 差出人アドレスに、フォームの入力値(客のアドレス)を使っていないか
2つ目は頻出です。差出人を客のアドレスにすると、客のドメインのSPFで検証されるため、ほぼ確実に失敗します。
正しくは、差出人は自社ドメインの固定アドレスにし、客のアドレスは返信先(Reply-To)に入れます。
やってはいけないこと
プラグインを入れて設定を変え、届いたら終わりにする
なぜ直ったか分からないままだと、数か月後に再発したときに同じ調査を最初からやることになります。
「サーバー会社に問い合わせてください」で終わらせる
STEP 1をやっておけば、サーバー会社に何を聞けばいいかが具体的になります。「メールが届きません」ではなく「587番ポートへの外部接続が拒否されます」と聞けます。
送信テストを自分のアドレスだけで済ませる
同一ドメイン宛や同一サーバー内は、DNS認証を経由せずに届いてしまうことがあります。必ずGmailなどの外部アドレスで確認してください。
まとめ
メール不達の調査は、層を分けて上から潰すだけです。
最小SMTPテストを最初にやるかどうかで、調査時間が数時間変わります。WordPressを触る前に、まず1回送ってみてください。
メールが届かなくて困っている方へ
原因の特定から修正まで承っています。フォームメールの不達、Gmailでの迷惑メール判定、DNS認証(SPF/DKIM/DMARC)の設定など。
販売実績58件・評価5.0・出品者ランク プラチナ(2026-09時点)