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でスコアを確認・トランザクションメールサービスへの移行を検討の手順で解決します。