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 やサーバーパネルからのみ確認可能
- ログは失敗メールのみ記録されるので肥大化しにくい
- ブラウザから直接アクセス不可(安全)
- FTP/SFTP やサーバーパネルからのみ確認可能
- ログは失敗メールのみ記録されるので肥大化しにくい
3 ディレクトリ構造の例
- /home/username/ ← ユーザーのホームディレクトリ
- public_html/ ← Web公開フォルダ (https://example.com/)
- wp-admin/
- wp-content/
- wp-includes/
- mail_error_logs/ ← 公開フォルダ外
- mail-error.log
- public_html/ ← Web公開フォルダ (https://example.com/)
4 ログの確認方法
- FTP/SFTP やサーバーパネルでホームディレクトリに接続
mail_error_logsフォルダ内のmail-error.logを開く- エラーメッセージと日時を確認する
例:
[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;
}
});
確認方法:
- 上記コードを
functions.phpに追加 - ブラウザで以下の URL にアクセス
https://example.com/?test_mail_error - 画面に「テスト用メールエラーをログに書き込みました」と表示されれば成功
- ログは
mail_error_logs/mail-error.logに記録されているので、FTP やサーバーパネルから確認
※本番環境では、この URL で誰でもログを書き込めてしまうため、テストが終わったらコードを必ず削除してください。
6 まとめ
- functions.php にコードを追加すると、プラグインなしでもメール送信エラーを安全に確認可能
- 公開フォルダ外に保存すれば第三者から見られる心配がない
- 失敗メールだけを記録するのでログの肥大化も防げる
- WP Mail Logging プラグインと併用すると、管理画面での確認も可能
この方法を導入すれば、「なぜメールが届かないのか?」を安全かつ効率的に特定できるようになります。


