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のメッセージソースで認証結果確認の手順で対応します。

お気軽にご相談ください

お見積りへ お問い合わせへ