2026年8月20日

2026年8月20日

WordPressのメール送信エラーを解決する方法

はじめに

WordPressでお問い合わせフォームのメールが届かない・wp_mail()を呼び出しても送信されない・メールが送られているが迷惑メールフォルダに入ってしまう・SMTPプラグインを設定したのに認証エラーで送信できない・送信元(From)アドレスがwordpress@example.comになってしまうといった問題は、WordPressのメール送信の仕組みを正しく設定することで解決できます。

症状・原因

  • サーバーのPHP mail()関数が無効化されておりwp_mail()が機能していない
  • SPF・DKIMレコードが設定されておらず正規のメールとして認識されない
  • From アドレスのドメインと送信サーバーのドメインが一致していない
  • SMTPプラグインの認証情報(ユーザー名・パスワード・ポート)が誤っている

解決手順

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

# WP-CLI でテストメールを送信
wp eval "
\$result = wp_mail(
    'test@example.com',
    'WP Mail Test',
    'This is a test email from WordPress.'
);
echo \$result ? 'Mail sent successfully' : 'Mail failed' . PHP_EOL;
"

# PHPMailer のエラーを確認
wp eval "
add_action('wp_mail_failed', function(\$error) {
    echo 'Error: ' . \$error->get_error_message() . PHP_EOL;
});
wp_mail('test@example.com', 'Test', 'Body');
"

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

# サーバーのメール設定を確認
wp eval "
echo 'SMTP: ' . ini_get('SMTP') . PHP_EOL;
echo 'smtp_port: ' . ini_get('smtp_port') . PHP_EOL;
echo 'sendmail_path: ' . ini_get('sendmail_path') . PHP_EOL;
"
// wp_mail_failed フックでエラーをログに記録
add_action('wp_mail_failed', function(WP_Error $error): void {
    error_log('wp_mail failed: ' . $error->get_error_message());
    error_log('Error data: ' . print_r($error->get_error_data(), true));
});

ステップ2:SMTPで確実にメール送信する

// PHPMailer を SMTP で設定(プラグイン不要)
add_action('phpmailer_init', function(PHPMailer\PHPMailer\PHPMailer $phpmailer): void {
    $phpmailer->isSMTP();
    $phpmailer->Host       = 'smtp.gmail.com';        // SMTPサーバー
    $phpmailer->SMTPAuth   = true;
    $phpmailer->Port       = 587;                      // TLS: 587, SSL: 465
    $phpmailer->SMTPSecure = PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_STARTTLS;
    $phpmailer->Username   = 'yourmail@gmail.com';
    $phpmailer->Password   = 'your-app-password';      // アプリパスワードを使用

    // From アドレスを設定
    $phpmailer->From     = 'noreply@yourdomain.com';
    $phpmailer->FromName = 'サイト名';
});

// SendGrid / Mailgun / SES など外部サービスの設定例(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->Username = 'apikey';
    $phpmailer->Password = defined('SENDGRID_API_KEY') ? SENDGRID_API_KEY : '';
    $phpmailer->SMTPSecure = 'tls';
});

// 認証情報は wp-config.php に定数として保存(コードに直書きしない)
// define('SMTP_HOST', 'smtp.gmail.com');
// define('SMTP_USER', 'yourmail@gmail.com');
// define('SMTP_PASS', 'your-app-password');

ステップ3:Fromアドレスと送信者名を正しく設定する

// wp_mail の From アドレスをカスタマイズ
add_filter('wp_mail_from', function(string $from_email): string {
    // WordPress デフォルトの wordpress@example.com を変更
    return 'noreply@yourdomain.com';
});

add_filter('wp_mail_from_name', function(string $from_name): string {
    return get_bloginfo('name'); // サイト名を使用
});

// メール送信のデフォルト設定を一括変更
add_filter('wp_mail_content_type', function(): string {
    return 'text/html'; // HTML メールを有効化
});

// wp_mail() のラッパー関数(共通設定を適用)
function my_send_mail(string $to, string $subject, string $message, array $headers = []): bool {
    $default_headers = [
        'Content-Type: text/html; charset=UTF-8',
        'From: ' . get_bloginfo('name') . ' <noreply@' . parse_url(home_url(), PHP_URL_HOST) . '>',
        'Reply-To: ' . get_option('admin_email'),
    ];
    $headers = array_merge($default_headers, $headers);

    // HTML メールのテンプレート
    $wrapped_message = '<html><body style="font-family:sans-serif;max-width:600px;margin:0 auto;">'
        . '<h2 style="color:#1d2327;">' . esc_html(get_bloginfo('name')) . '</h2>'
        . '<div>' . wpautop($message) . '</div>'
        . '<hr><p style="color:#666;font-size:12px;">' . home_url() . '</p>'
        . '</body></html>';

    return wp_mail($to, $subject, $wrapped_message, $headers);
}

ステップ4:メールの到達率を改善する

// SPF・DKIM・DMARC 設定(DNS レコードに追加)
// SPF:  v=spf1 include:sendgrid.net ~all
// DKIM: sendgrid._domainkey.yourdomain.com  → SendGrid の DKIM 値
// DMARC: v=DMARC1; p=quarantine; rua=mailto:dmarc@yourdomain.com

// メール送信ログを記録
add_action('wp_mail', function(array $args): void {
    $log = [
        'time'    => current_time('mysql'),
        'to'      => is_array($args['to']) ? implode(', ', $args['to']) : $args['to'],
        'subject' => $args['subject'],
    ];
    $logs   = get_option('my_mail_log', []);
    $logs[] = $log;
    // 最新 100 件のみ保持
    update_option('my_mail_log', array_slice($logs, -100), false);
});

// 送信失敗を管理者に通知
add_action('wp_mail_failed', function(WP_Error $error): void {
    $admin_email = get_option('admin_email');
    // ループを防ぐために直接 PHPMailer を使用
    $mail = new PHPMailer\PHPMailer\PHPMailer();
    $mail->addAddress($admin_email);
    $mail->Subject = '[緊急] メール送信に失敗しました';
    $mail->Body    = 'エラー: ' . $error->get_error_message();
    @$mail->send();
});

ステップ5:メール送信をキューで管理する

// メール送信をキューに入れて非同期送信
function queue_email(string $to, string $subject, string $body): void {
    $queue   = get_option('my_email_queue', []);
    $queue[] = [
        'to'      => $to,
        'subject' => $subject,
        'body'    => $body,
        'queued'  => time(),
        'retries' => 0,
    ];
    update_option('my_email_queue', $queue, false);
}

// Cron でキューを処理
add_action('my_process_email_queue', function(): void {
    $queue = get_option('my_email_queue', []);
    if (empty($queue)) {
        return;
    }

    $remaining = [];
    foreach (array_slice($queue, 0, 10) as $item) { // 1回に最大10件
        $sent = wp_mail($item['to'], $item['subject'], $item['body']);
        if (!$sent && $item['retries'] < 3) {
            $item['retries']++;
            $remaining[] = $item; // リトライキューに戻す
        }
    }
    // 処理済みを除いた残りを保存
    update_option('my_email_queue', array_merge($remaining, array_slice($queue, 10)), false);
});

// Cron スケジュールに登録
if (!wp_next_scheduled('my_process_email_queue')) {
    wp_schedule_event(time(), 'hourly', 'my_process_email_queue');
}

注意事項

  • Gmailを送信サーバーとして使う場合、通常のパスワードは使用できません。Googleアカウントの「2段階認証」を有効にし、「アプリパスワード」を生成して使用してください。通常のパスワードはセキュリティポリシーにより拒否されます
  • phpmailer_initフックでSMTP設定をした場合、SMTP認証情報(パスワード)がソースコードに含まれます。必ずwp-config.phpに定数として定義し、バージョン管理(Git)のリポジトリにコミットしないようにしてください

まとめ

WordPressメール送信エラーの解決は①wp evalでテストメール送信・wp_mail_failedフックでエラーをログ出力・PHPのmail()関数が有効か確認・SMTPサーバー設定をini_getで確認、②phpmailer_initフックでSMTP設定(Host/Port/SMTPAuth/Username/Password)・Gmail使用時はアプリパスワードを使用・認証情報はwp-config.phpに定数で保存、③wp_mail_fromフィルターでFromアドレスをドメイン一致に変更・wp_mail_from_nameでサイト名を設定・wp_mail_content_typeでHTMLメールを有効化、④DNS にSPF/DKIM/DMARCレコードを追加して迷惑メール対策・wp_mailフックで送信ログを記録・wp_mail_failedで失敗を管理者に通知、⑤メール送信をオプションにキューとして保存・Cronで定期的に最大10件ずつ送信・失敗時はリトライ回数を記録の手順で解決します。

お気軽にご相談ください

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