2026年5月17日

2026年5月17日

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

はじめに

WordPressからのメールが届かない・パスワードリセットや新規ユーザー登録の通知メールが来ない・お問い合わせフォーム(Contact Form 7等)のメールが迷惑メールフォルダに入る・wp_mail()を呼んでいるのにfalseが返ってくる・SMTPサーバー経由で送信したいがエラーになるといった問題は、WordPressのメール送信設定とSMTP認証の設定で解決できます。

症状・原因

  • レンタルサーバーのPHP mail()関数が制限されているためデフォルトのメール送信が失敗する
  • 送信元ドメインにSPF・DKIMレコードが設定されておらず迷惑メールと判定される
  • SMTPの認証情報(ホスト・ポート・ユーザー名・パスワード)が正しくない
  • wp_mail_failedフックのエラーログを確認していないため原因が不明なまま

解決手順

ステップ1:メール送信の状態を診断する

# wp_mail のテスト送信
wp eval "
\$result = wp_mail(
    'test@example.com',
    'WP Mail Test',
    'Test from WordPress',
    ['Content-Type: text/plain; charset=UTF-8']
);
echo \$result ? 'Mail sent' : 'Mail failed';
"

# wp_mail_failed フックでエラーを記録
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');
"

# PHP mail() 関数が使えるか確認
wp eval "echo function_exists('mail') ? 'mail() available' : 'mail() disabled';"

ステップ2:wp_mail_failedでエラーを記録する

// functions.php: メール送信エラーをログに記録
add_action('wp_mail_failed', function(WP_Error $error): void {
    $message = sprintf(
        '[%s] wp_mail failed: %s | Data: %s',
        current_time('Y-m-d H:i:s'),
        $error->get_error_message(),
        wp_json_encode($error->get_error_data())
    );
    error_log($message);
});

// メール送信前の設定を確認するフック
add_action('phpmailer_init', function(PHPMailer\PHPMailer\PHPMailer $phpmailer): void {
    // 送信元アドレスのログ
    error_log('From: ' . $phpmailer->From . ' <' . $phpmailer->FromName . '>');
    error_log('Host: ' . $phpmailer->Host);
    error_log('SMTP: ' . ($phpmailer->isSMTP() ? 'yes' : 'no'));
});

ステップ3:SMTPを設定してメールを送信する

// functions.php: SMTP 設定(プラグインなしで実装)
add_action('phpmailer_init', function(PHPMailer\PHPMailer\PHPMailer $phpmailer): void {
    $phpmailer->isSMTP();
    $phpmailer->Host       = 'smtp.gmail.com';       // SMTPホスト
    $phpmailer->SMTPAuth   = true;
    $phpmailer->Username   = 'your@gmail.com';       // SMTPユーザー名
    $phpmailer->Password   = 'app_password_here';    // アプリパスワード
    $phpmailer->SMTPSecure = PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_STARTTLS;
    $phpmailer->Port       = 587;                    // TLS=587, SSL=465

    // 送信元を固定
    $phpmailer->setFrom('noreply@example.com', 'サイト名');
});

// 送信元アドレスをサイトのドメインに設定
add_filter('wp_mail_from', fn() => 'noreply@' . parse_url(home_url(), PHP_URL_HOST));
add_filter('wp_mail_from_name', fn() => get_bloginfo('name'));

ステップ4:環境変数でSMTP認証情報を安全に管理する

// wp-config.php: 環境変数として定義(コードにパスワードを書かない)
define('SMTP_HOST',     getenv('SMTP_HOST')     ?: 'smtp.sendgrid.net');
define('SMTP_PORT',     getenv('SMTP_PORT')     ?: 587);
define('SMTP_USERNAME', getenv('SMTP_USERNAME') ?: '');
define('SMTP_PASSWORD', getenv('SMTP_PASSWORD') ?: '');
define('SMTP_FROM',     getenv('SMTP_FROM')     ?: 'noreply@example.com');

// functions.php: 定数を使ってSMTPを設定
add_action('phpmailer_init', function(PHPMailer\PHPMailer\PHPMailer $mailer): void {
    if (!defined('SMTP_HOST') || !SMTP_HOST) return;

    $mailer->isSMTP();
    $mailer->Host       = SMTP_HOST;
    $mailer->Port       = (int) SMTP_PORT;
    $mailer->SMTPAuth   = true;
    $mailer->Username   = SMTP_USERNAME;
    $mailer->Password   = SMTP_PASSWORD;
    $mailer->SMTPSecure = PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_STARTTLS;
    $mailer->setFrom(SMTP_FROM, get_bloginfo('name'));
});

ステップ5:SPF・DKIMの設定とテスト

# DNS設定の確認(SPFレコード)
dig TXT example.com | grep spf

# DNSにSPFレコードを追加(DNSプロバイダーの管理画面で設定)
# v=spf1 include:_spf.google.com ~all
# v=spf1 include:sendgrid.net ~all

# メール到達確認(mail-tester.com 等のサービス)
wp eval "
wp_mail(
    'test-xxxx@mail-tester.com',  // mail-tester.comのアドレス
    'Test Email',
    'Testing WordPress mail configuration'
);
"
// HTML メールとテキストメールの両方を送信
function send_notification_email(string $to, string $subject, string $html_body): bool {
    $text_body = wp_strip_all_tags($html_body);
    $boundary  = md5(time());

    $headers = [
        'Content-Type: multipart/alternative; boundary="' . $boundary . '"',
        'From: ' . get_bloginfo('name') . ' <noreply@' . parse_url(home_url(), PHP_URL_HOST) . '>',
    ];

    // multipart は wp_mail では難しいため PHPMailer を直接使う
    $mailer           = new PHPMailer\PHPMailer\PHPMailer(true);
    $mailer->Subject  = $subject;
    $mailer->addAddress($to);
    $mailer->isHTML(true);
    $mailer->Body     = $html_body;
    $mailer->AltBody  = $text_body;

    return $mailer->send();
}

注意事項

  • Gmailを使う場合、通常のパスワードではなく「アプリパスワード」を使う必要があります。2段階認証を有効にしてから「Googleアカウント」→「セキュリティ」→「アプリパスワード」で生成してください
  • SendGrid・Amazon SES・Mailgunなどのトランザクションメールサービスを使うと、高い到達率と詳細な送信ログが得られます

まとめ

WordPressメール送信問題の解決は①wp evalでテスト送信・wp_mail_failedフックでエラーをerror_log()に記録・PHP mail()関数の利用可否を確認、②phpmailer_initフックで送信設定をログ出力・エラーメッセージからSMTP接続失敗か認証失敗かを特定、③phpmailer_initでSMTPホスト・ポート・認証情報を設定・TLS=587かSSL=465を使用・setFrom()で送信元を固定、④SMTP認証情報はwp-config.phpの定数か環境変数で管理・コードにパスワードを直書きしない、⑤DNS管理画面でSPF・DKIMレコードを設定・mail-tester.comでスコアを確認・トランザクションメールサービスへの移行を検討の手順で解決します。

お気軽にご相談ください

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