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設定で届かないメール問題のほとんどは解決できます。

お気軽にご相談ください

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