2026年9月6日

2026年9月6日

WordPressのメールが送信されない問題を解決する方法

はじめに

WordPressからの通知メール(お問い合わせ・パスワードリセット・コメント通知など)が届かない場合、サーバーのPHP mail()関数がブロックされているか、送信元IPがスパムリストに登録されていることがほとんどです。SMTPを使った送信に切り替えることで確実に解決できます。

症状・原因

  • お問い合わせフォームの返信メールが届かない
  • パスワードリセットメールが来ない
  • コメント承認通知が管理者に届かない
  • 共有ホスティングでPHP mail()が無効化されている
  • サーバーのIPアドレスがスパムブラックリストに登録されている

解決手順

ステップ1:wp_mail の動作を確認する

# WP-CLI でテストメールを送信
wp eval 'var_dump(wp_mail("your@email.com", "Test", "WP Mail Test"));'

# PHP mail() が使えるか確認
wp eval 'var_dump(function_exists("mail"));'

# phpmailer の設定を確認
wp eval '
global $phpmailer;
if (!is_a($phpmailer, "PHPMailer\PHPMailer\PHPMailer")) {
    require_once ABSPATH . WPINC . "/PHPMailer/PHPMailer.php";
    $phpmailer = new PHPMailer\PHPMailer\PHPMailer(true);
}
echo $phpmailer->Mailer . "\n";
echo $phpmailer->Host . "\n";
'
// functions.php: wp_mail の詳細ログを取る
add_action('wp_mail_failed', function(WP_Error $error): void {
    error_log('[wp_mail failed] ' . $error->get_error_message());
    error_log(print_r($error->get_error_data(), true));
});

ステップ2:SMTP 認証を phpmailer_init フックで設定する

// functions.php: Gmail SMTP を使う例(アプリパスワード必須)
add_action('phpmailer_init', function(PHPMailer\PHPMailer\PHPMailer $phpmailer): void {
    $phpmailer->isSMTP();
    $phpmailer->Host       = 'smtp.gmail.com';
    $phpmailer->SMTPAuth   = true;
    $phpmailer->Port       = 587;
    $phpmailer->SMTPSecure = PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_STARTTLS;
    $phpmailer->Username   = 'your@gmail.com';
    $phpmailer->Password   = 'your-app-password'; // Googleアプリパスワード
    $phpmailer->From       = 'your@gmail.com';
    $phpmailer->FromName   = get_bloginfo('name');
});
// functions.php: SendGrid を使う例
add_action('phpmailer_init', function(PHPMailer\PHPMailer\PHPMailer $phpmailer): void {
    $phpmailer->isSMTP();
    $phpmailer->Host       = 'smtp.sendgrid.net';
    $phpmailer->SMTPAuth   = true;
    $phpmailer->Port       = 587;
    $phpmailer->SMTPSecure = PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_STARTTLS;
    $phpmailer->Username   = 'apikey';           // SendGrid は常に 'apikey'
    $phpmailer->Password   = 'SG.xxxxxxxxxxxx'; // SendGrid API キー
    $phpmailer->From       = 'no-reply@example.com';
    $phpmailer->FromName   = get_bloginfo('name');
});

ステップ3:送信元アドレスを正しく設定する

// functions.php: From アドレスをドメインに合わせる
// ❌ gmail.com から example.com として送ると SPF/DKIM で弾かれる
// ✅ 送信元ドメインと SMTP サーバーのドメインを一致させる

add_filter('wp_mail_from', function(string $email): string {
    return 'no-reply@example.com'; // 自ドメインのアドレス
});

add_filter('wp_mail_from_name', function(string $name): string {
    return get_bloginfo('name');
});
# SPF レコードの確認(DNS設定が正しいか)
dig TXT example.com | grep spf

# DKIM の確認
dig TXT default._domainkey.example.com

# MX レコードの確認
dig MX example.com

ステップ4:WP Mail SMTP プラグインを使う

WP Mail SMTP プラグインの設定手順:

1. プラグイン → 新規追加 → 「WP Mail SMTP」をインストール・有効化

2. WP Mail SMTP → 設定 → メーラー を選択:
   - Gmail / G Suite
   - SendGrid
   - Mailgun
   - Amazon SES
   - その他の SMTP

3. SMTP 設定:
   ホスト: smtp.gmail.com
   暗号化: TLS
   ポート: 587
   認証: オン
   ユーザー名: your@gmail.com
   パスワード: アプリパスワード

4. WP Mail SMTP → ツール → メールテスト でテスト送信

5. メールが届いたら設定完了

ステップ5:メール送信のログを記録する

// functions.php: 送信メールをログに記録
add_action('wp_mail', function(array $args): array {
    error_log(sprintf(
        '[wp_mail] To: %s | Subject: %s | %s',
        is_array($args['to']) ? implode(',', $args['to']) : $args['to'],
        $args['subject'],
        current_time('mysql')
    ));
    return $args;
});

add_action('wp_mail_failed', function(WP_Error $error): void {
    error_log('[wp_mail FAILED] ' . wp_json_encode([
        'message' => $error->get_error_message(),
        'data'    => $error->get_error_data(),
        'time'    => current_time('mysql'),
    ]));
});

注意事項

  • Gmailを使う場合は通常のパスワードではなく「アプリパスワード」が必要です。Googleアカウントの2段階認証を有効にしてから、アカウント設定→セキュリティ→アプリパスワードで発行してください
  • phpmailer_initにSMTP認証情報をハードコードするのは避け、wp-config.phpの定数や環境変数から読み込むようにしてください。コードをGitにコミットする際に認証情報が漏洩するリスクがあります
  • 月間送信数が多い場合はSendGridやMailgunなどのトランザクションメールサービスを使うことを推奨します。Gmailの無料枠は1日500通が上限です

まとめ

wp_mailメール未送信の解決は①wp eval 'var_dump(wp_mail(...))'でテスト送信しwp_mail_failedフックで詳細エラーを確認、②phpmailer_initフックでGmail/SendGrid SMTPの認証設定(Host・SMTPAuth・Port・ENCRYPTION_STARTTLS・Username・Password)を追加、③wp_mail_fromフィルターで送信元ドメインをSPF/DKIM設定済みの自ドメインに統一、④WP Mail SMTPプラグインのメールテスト機能で送信確認、⑤wp_mailフックとwp_mail_failedフックで送受信ログを記録します。

お気軽にご相談ください

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