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件ずつ送信・失敗時はリトライ回数を記録の手順で解決します。