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フックで送受信ログを記録します。