2026年5月21日
2026年5月21日
メールの送信ができない時の原因調査と解決方法
はじめに
WordPressのお問い合わせフォームからメールが届かない・パスワードリセットメールが送られない・WooCommerceの注文確認メールが届かない・メールはシステムログに送信成功と出るがGmailに届かないといった問題の解決方法を解説します。
症状・原因
- PHPの
mail()関数はサーバーのSendmail/Postfixに依存するが、VPSではポート25がブロックされている - SPF/DKIMが未設定のため送信メールがスパム判定される
- WordPressの送信元メールアドレスが
wordpress@localhostになっている(ドメインがない) wp_mail()フィルターが別のプラグインに上書きされている
解決手順
ステップ1:メール送信の問題を診断する
# ✅ PHP の mail() 関数でテスト送信
php -r "var_dump(mail('test@example.com', 'Test', 'Hello'));"
# → bool(true) ← sendmailが受け付けた(実際に届くか別確認)
# → bool(false) ← 失敗(PHP設定かsendmailの問題)
# ✅ Postfix のメールキューを確認
mailq
# → Mail queue is empty ← 正常 or 送信済み
# → -Queue ID- ← キューに溜まっている = 送信詰まり
# ✅ メールログを確認
sudo tail -50 /var/log/mail.log
# → status=sent ← 成功
# → status=bounced ← バウンス(拒否された)
# → status=deferred ← 一時失敗(後で再送信)
# ✅ ポート25 が使用可能か確認
telnet smtp.gmail.com 25
# → Connection refused ← VPS でブロックされている可能性
nc -z -v smtp.gmail.com 587
# → Connection to smtp.gmail.com 587 port [tcp/submission] succeeded ← 587はOK
ステップ2:WP-CLI でメール送信をテストする
# ✅ WordPress から直接メール送信テスト
wp eval "
\$result = wp_mail(
'test@example.com',
'WordPress Mail Test',
'This is a test email from WordPress'
);
echo \$result ? 'Sent!' : 'Failed!';
" --path=/var/www/html/
# ✅ WordPress のメール送信をデバッグモードで確認
wp eval "
add_action('wp_mail_failed', function(\$error) {
echo 'Error: ' . \$error->get_error_message() . PHP_EOL;
});
wp_mail('test@example.com', 'Test', 'Test body');
" --path=/var/www/html/
# ✅ WordPress の送信元アドレスを確認
wp option get admin_email --path=/var/www/html/
# → admin@example.com ← これが送信元になる
# ✅ wp_mail のフィルターが上書きされていないか確認
wp eval "
global \$wp_filter;
if (isset(\$wp_filter['wp_mail'])) {
print_r(\$wp_filter['wp_mail']);
}
" --path=/var/www/html/
ステップ3:外部 SMTP サービスで解決する
# ✅ VPS でポート25がブロックされている場合の解決策
# → 外部SMTPサービスを使用する(推奨)
# ✅ Gmail SMTP を使用する場合
# Gmail アカウント → セキュリティ → アプリパスワードを生成
# SMTP ホスト: smtp.gmail.com
# SMTP ポート: 587 (STARTTLS) または 465 (SSL)
# ユーザー名: your-email@gmail.com
# パスワード: アプリパスワード(16文字)
// ✅ PHPMailer(WordPress 内蔵)でGmail SMTPを設定
// functions.php または wp-config.php に追加
add_action('phpmailer_init', function(PHPMailer\PHPMailer\PHPMailer $mailer): void {
$mailer->isSMTP();
$mailer->Host = 'smtp.gmail.com';
$mailer->SMTPAuth = true;
$mailer->Username = 'your-email@gmail.com';
$mailer->Password = 'your-app-password';
$mailer->SMTPSecure = PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_STARTTLS;
$mailer->Port = 587;
$mailer->From = 'noreply@example.com';
$mailer->FromName = 'My WordPress Site';
});
ステップ4:WP Mail SMTP プラグインで設定する
# ✅ WP Mail SMTP プラグインをインストール(GUI設定)
wp plugin install wp-mail-smtp --activate --path=/var/www/html/
# ✅ AWS SES を利用する場合(大量送信向け・低コスト)
# AWS コンソール → SES → 送信ドメインを確認
# SMTP ホスト: email-smtp.ap-northeast-1.amazonaws.com
# SMTP ポート: 587
# ユーザー名: AWSアクセスキーID
# パスワード: SMTP専用パスワード(AWS CLIで生成)
# ✅ SendGrid を利用する場合
# SMTP ホスト: smtp.sendgrid.net
# SMTP ポート: 587
# ユーザー名: apikey
# パスワード: SendGrid APIキー
# ✅ WP Mail SMTP CLI でSMTP設定を確認
wp eval "
\$options = get_option('wp_mail_smtp');
echo 'Mailer: ' . (\$options['mail']['mailer'] ?? 'default') . PHP_EOL;
echo 'From: ' . (\$options['mail']['from_email'] ?? '') . PHP_EOL;
" --path=/var/www/html/
ステップ5:SPF/DKIM でスパム判定を防ぐ
# ✅ 現在の SPF レコードを確認
dig TXT example.com | grep spf
# → "v=spf1 include:_spf.google.com ip4:123.456.789.0 ~all"
# ✅ SPF レコードが未設定の場合 DNS に追加
# DNSプロバイダーの管理画面でTXTレコードを追加:
# ホスト名: @(またはexample.com)
# タイプ: TXT
# 値: v=spf1 ip4:YOUR_SERVER_IP include:sendgrid.net ~all
# ✅ メールヘッダーで認証結果を確認(Gmailの場合)
# Gmail でメールを開く → 「:」メニュー → 「メッセージのソースを表示」
# Authentication-Results:
# spf=pass ← SPF OK
# dkim=pass ← DKIM OK
# dmarc=pass ← DMARC OK
# ✅ mail-tester.com でスパムスコアを測定
# 1. mail-tester.com を開いてテスト用メールアドレスを取得
# 2. wp eval "wp_mail('test-XXXXX@srv1.mail-tester.com', 'Test', 'Body');" でテスト送信
# 3. スコアを確認(10/10 が理想)
wp eval "wp_mail('test-XXXXX@srv1.mail-tester.com', 'Spam Score Test', 'Hello!');" \
--path=/var/www/html/
注意事項
- VPS(ConoHa・さくら・Linode・AWS EC2)ではポート25(SMTP)がデフォルトでブロックされています。解除申請が可能なプロバイダーもありますが、SendGrid・AWS SES・Gmail SMTPなどの外部SMTPサービスを利用するほうが確実でスパム判定も受けにくくなります
wp_mail()のFromアドレスは送信ドメインのSPFレコードに含まれるIPアドレスから送信する必要があります。サーバーのIPがSPFに含まれていない場合はソフトフェイル(~all)またはハードフェイル(-all)でスパム判定されます
まとめ
メール送信トラブルの解決は①php -r "mail()"でPHPレベルのテスト・mailqでキュー確認・/var/log/mail.logでログ確認・ポート25の疎通テスト、②wp eval "wp_mail()"でWordPressからテスト・wp_mail_failedフックでエラー詳細確認・送信元メールアドレスの確認、③ポート25ブロック時はGmail SMTP(587番ポート)・phpmailer_initフックでPHPMailer設定、④WP Mail SMTPプラグインでGUI設定・AWS SES/SendGridなどの外部SMTPサービスを利用、⑤DNS にSPFレコード追加・mail-tester.comでスパムスコア確認・Gmailのメッセージソースで認証結果確認の手順で対応します。