2026年9月7日
2026年9月7日
WordPressのメールが届かない問題を解決する方法【SMTP設定・SPF・DKIM】
はじめに
WordPressのメール送信機能(wp_mail())がうまく動作せず、お問い合わせや会員登録メールが届かないケースは非常に多いです。多くの場合、SMTPサーバーの設定不足やSPF/DKIMレコードの未設定が原因です。
症状・原因
- お問い合わせフォームの送信確認メールが届かない
- WordPressの管理画面から送ったパスワードリセットメールが届かない
- メールが迷惑メールフォルダに入ってしまう
wp_mail()がfalseを返している
解決手順
ステップ1:メール送信をデバッグする
// 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('[wp_mail failed] Data: ' . print_r($error->get_error_data(), true));
});
// テストメールを送信(管理者のみ実行)
add_action('admin_init', function(): void {
if (!isset($_GET['test_mail']) || !current_user_can('manage_options')) return;
$result = wp_mail(
get_option('admin_email'),
'WordPressメールテスト',
'このメールが届いていればwp_mailは正常に動作しています。',
['Content-Type: text/plain; charset=UTF-8']
);
wp_die($result ? 'メール送信成功!' : 'メール送信失敗。debug.logを確認してください。');
});
// wp_mailの詳細ログ
add_filter('wp_mail', function(array $args): array {
error_log('[wp_mail] To: ' . (is_array($args['to']) ? implode(',', $args['to']) : $args['to']));
error_log('[wp_mail] Subject: ' . $args['subject']);
return $args;
});
ステップ2:SMTPを設定する(Gmail/SendGrid/AWS SES)
// PHPMailerでSMTPを設定
add_action('phpmailer_init', function(PHPMailer\PHPMailer\PHPMailer $phpmailer): void {
$phpmailer->isSMTP();
$phpmailer->Host = defined('SMTP_HOST') ? SMTP_HOST : 'smtp.gmail.com';
$phpmailer->SMTPAuth = true;
$phpmailer->Port = defined('SMTP_PORT') ? SMTP_PORT : 587;
$phpmailer->SMTPSecure = PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_STARTTLS;
$phpmailer->Username = defined('SMTP_USER') ? SMTP_USER : '';
$phpmailer->Password = defined('SMTP_PASS') ? SMTP_PASS : '';
// 送信元をSMTPアカウントに統一
$phpmailer->setFrom(SMTP_USER, get_bloginfo('name'));
});
// wp-config.php にSMTP設定を定義(セキュアな方法)
// define('SMTP_HOST', 'smtp.gmail.com');
// define('SMTP_PORT', 587);
// define('SMTP_USER', 'your@gmail.com');
// define('SMTP_PASS', 'your-app-password'); // Googleアプリパスワードを使用
# SendGrid APIキーを使う場合(wp-config.php)
# define('SMTP_HOST', 'smtp.sendgrid.net');
# define('SMTP_PORT', 587);
# define('SMTP_USER', 'apikey');
# define('SMTP_PASS', 'SG.xxxxxxxxxxxxx');
# AWS SES SMTPエンドポイント
# define('SMTP_HOST', 'email-smtp.ap-northeast-1.amazonaws.com');
# define('SMTP_PORT', 587);
ステップ3:SPF・DKIMレコードを設定する
# DNSレコードを確認
dig TXT example.com +short | grep -i spf
dig TXT _dmarc.example.com +short
dig TXT default._domainkey.example.com +short
# SPFレコードの追加(DNSプロバイダーで設定)
# type: TXT
# name: @
# value: v=spf1 include:_spf.google.com include:sendgrid.net ~all
# DKIMレコード(SendGrid等のダッシュボードで生成)
# type: CNAME
# name: s1._domainkey
# value: s1.domainkey.u12345.wl.sendgrid.net
# DMARCレコードの設定
# type: TXT
# name: _dmarc
# value: v=DMARC1; p=quarantine; pct=100; rua=mailto:dmarc@example.com
# SPFレコードのテスト
dig TXT example.com | grep "v=spf1"
# DKIMの確認ツール(コマンドライン)
echo "From: test@example.com
To: check@dkimvalidator.com
Subject: DKIM test
This is a test." | sendmail -t
ステップ4:送信者情報を最適化する
// wp_mailのFrom名とアドレスを設定
add_filter('wp_mail_from', function(string $from_email): string {
return defined('SMTP_USER') ? SMTP_USER : get_option('admin_email');
});
add_filter('wp_mail_from_name', function(string $from_name): string {
return get_bloginfo('name');
});
// HTMLメールを設定
add_filter('wp_mail_content_type', function(): string {
return 'text/html';
});
// HTMLメール用のラッパー
add_filter('wp_mail', function(array $args): array {
// テキストメールの場合はHTMLラッパーなし
if (strpos($args['message'], '<html>') !== false) return $args;
$args['message'] = sprintf(
'<html><body>
<div style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;">
<div style="background: #1d2327; padding: 20px; text-align: center;">
<img src="%s" alt="%s" style="max-height: 60px;">
</div>
<div style="padding: 30px; background: #ffffff;">
%s
</div>
<div style="padding: 15px; background: #f0f0f1; text-align: center; font-size: 12px; color: #666;">
<p>%s | <a href="%s">配信停止</a></p>
</div>
</div>
</body></html>',
esc_url(get_site_icon_url(60)),
esc_attr(get_bloginfo('name')),
$args['message'],
esc_html(get_bloginfo('name')),
esc_url(home_url('/unsubscribe/'))
);
return $args;
});
ステップ5:メール送信を監視する
// 送信ログを記録
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'],
'status' => 'pending',
];
$logs = get_option('wp_mail_log', []);
$logs = array_slice($logs, -99); // 最新100件のみ保持
$logs[] = $log;
update_option('wp_mail_log', $logs);
}, 1);
// 送信後にステータスを更新
add_action('wp_mail_succeeded', function(array $mail_data): void {
// 成功ログの更新(簡易実装)
error_log('[wp_mail] Succeeded: ' . $mail_data['subject']);
});
// 管理画面にメール送信ログページを追加
add_action('admin_menu', function(): void {
add_management_page('メール送信ログ', 'メールログ', 'manage_options', 'mail-log', function(): void {
$logs = get_option('wp_mail_log', []);
echo '<div class="wrap"><h1>メール送信ログ</h1><table class="wp-list-table widefat">';
echo '<thead><tr><th>日時</th><th>宛先</th><th>件名</th></tr></thead><tbody>';
foreach (array_reverse($logs) as $log) {
printf('<tr><td>%s</td><td>%s</td><td>%s</td></tr>',
esc_html($log['time']),
esc_html($log['to']),
esc_html($log['subject'])
);
}
echo '</tbody></table></div>';
});
});
注意事項
- Gmailアプリパスワード: GmailをSMTPとして使う場合は通常のパスワードではなく「アプリパスワード」を発行してください(2段階認証が必要)
- 送信制限: Gmailは1日500通、多くのSMTPサービスには送信数制限があります。大量メール送信にはSendGridやAWS SESを使用してください
- wp-config.phpの保護: SMTP認証情報は環境変数か
wp-config.phpに保存し、テーマファイルには書かないでください
まとめ
WordPressのメール問題の解決手順は「wp_mail_failedフックでエラーを確認→phpmailer_initでSMTP設定→DNS(SPF/DKIM/DMARC)設定→From設定の最適化→送信ログの実装」です。SMTPと正しいDNS設定で届かないメール問題のほとんどは解決できます。