functions.php によるメール送信エラーの安全なログ管理

WordPress で「お問い合わせメールが届かない」「メール送信に失敗しているかもしれない」という場合、functions.php にコードを追加してログを残す方法があります。
これにより、プラグインを使わずにメール送信の失敗原因を確認することができます。

1 WP Mail Logging プラグインとの違い

  • プラグインは管理画面で簡単に送信履歴やエラーを確認可能
  • functions.php にログを残す方法は、失敗したメールだけをファイルに保存し、外部から見られない安全な環境で確認可能

🔍 メール送信エラーの見方【WP Mail Logging プラグイン】

2 functions.php に追加する基本コード

エラーログを安全に公開フォルダ外に保存するセキュリティの観点から、公開ディレクトリの外に保存するのがベストです。以下の例では WordPress のルートディレクトリの1つ上に mail_error_logs フォルダを作ってエラーログを保存します。(エラーログだけ保存されます


//-------------------------------------------
// メール送信失敗時に安全な場所にログを保存(フォルダ作成&権限チェック)
//-------------------------------------------
add_action( 'wp_mail_failed', 'my_mail_failed_log', 10, 1 );

function my_mail_failed_log( $wp_error ) {
    // WordPress ルートの1つ上に mail_error_logs フォルダ
    $log_dir = dirname( ABSPATH ) . '/mail_error_logs';

    // ディレクトリがなければ作成
    if ( ! is_dir( $log_dir ) ) {
        $created = @mkdir( $log_dir, 0755, true );
        if ( ! $created ) {
            add_action( 'admin_notices', function() use ( $log_dir ) {
                echo '
'; echo 'メールエラーログフォルダの作成に失敗しました: ' . esc_html( $log_dir ); echo '
'; }); return; // フォルダ作成できなければ処理終了 } } // フォルダが書き込み可能かチェック if ( ! is_writable( $log_dir ) ) { add_action( 'admin_notices', function() use ( $log_dir ) { echo '
'; echo 'メールエラーログフォルダに書き込み権限がありません: ' . esc_html( $log_dir ); echo '
'; }); return; } // エラーログファイルのパス $log_file = $log_dir . '/mail-error.log'; // ログ内容を生成(WordPress 時間で) $message = '[' . current_time( 'Y-m-d H:i:s' ) . '] ' . print_r( $wp_error->get_error_message(), true ) . "\n"; // 書き込み error_log( $message, 3, $log_file ); }
補足:
- ブラウザから直接アクセス不可(安全)
- FTP/SFTP やサーバーパネルからのみ確認可能
- ログは失敗メールのみ記録されるので肥大化しにくい

3 ディレクトリ構造の例

  • /home/username/ ← ユーザーのホームディレクトリ
    • public_html/ ← Web公開フォルダ (https://example.com/)
      • wp-admin/
      • wp-content/
      • wp-includes/
    • mail_error_logs/ ← 公開フォルダ外
      • mail-error.log

4 ログの確認方法

  1. FTP/SFTP やサーバーパネルでホームディレクトリに接続
  2. mail_error_logs フォルダ内の mail-error.log を開く
  3. エラーメッセージと日時を確認する

例:
[2025-10-04 20:15:32] SMTP connect() failed.
[2025-10-04 20:17:08] Could not authenticate.
[2025-10-04 20:20:50] Connection refused

5 補足:テスト用にエラーログを書き込む方法

実際にメール送信が失敗しないとエラーログを確認できない場合、以下のコードを functions.php に追加することで、手動でテスト用のメールエラーをログに書き込むことができます。


// テスト用メールエラーを発生させる
add_action('init', function() {
    if (isset($_GET['test_mail_error'])) {
        $wp_error = new WP_Error('smtp_failed', 'SMTP connect() failed.');
        do_action('wp_mail_failed', $wp_error);
        echo 'テスト用メールエラーをログに書き込みました';
        exit;
    }
});

確認方法:

  1. 上記コードを functions.php に追加
  2. ブラウザで以下の URL にアクセス
    https://example.com/?test_mail_error
  3. 画面に「テスト用メールエラーをログに書き込みました」と表示されれば成功
  4. ログは mail_error_logs/mail-error.log に記録されているので、FTP やサーバーパネルから確認

※本番環境では、この URL で誰でもログを書き込めてしまうため、テストが終わったらコードを必ず削除してください。

6 まとめ

  • functions.php にコードを追加すると、プラグインなしでもメール送信エラーを安全に確認可能
  • 公開フォルダ外に保存すれば第三者から見られる心配がない
  • 失敗メールだけを記録するのでログの肥大化も防げる
  • WP Mail Logging プラグインと併用すると、管理画面での確認も可能

この方法を導入すれば、「なぜメールが届かないのか?」を安全かつ効率的に特定できるようになります。