Отслеживание отправленных писем в WordPress — важная задача для любого сайта, который активно взаимодействует с пользователями через электронную почту. Особенно это актуально для интернет-магазинов, сайтов с подписками и сервисов, где критично контролировать доставку уведомлений. В этой статье мы подробно рассмотрим, как создать автоматический файл логов писем в WordPress с помощью кода и плагинов, а также как удобно просматривать и анализировать эти логи.
Зачем нужен файл логов писем в WordPress
Логирование писем позволяет:
- Отслеживать, какие сообщения и когда были отправлены;
- Диагностировать проблемы с отправкой и доставкой;
- Вести учет для отчетности и аудита;
- Понимать реакцию пользователей на разные типы уведомлений.
Без логов вы рискуете упустить критическую информацию о сбоях в работе почтовой системы сайта, а значит потерять клиентов или нарушить бизнес-процессы.
Как работает отправка писем в WordPress и где можно подключить логирование
По умолчанию WordPress отправляет почту через функцию wp_mail(), которая использует стандартную PHP-функцию mail() или сторонние SMTP сервисы при наличии соответствующих плагинов. Чтобы добавить логирование, нужно перехватить вызов wp_mail и сохранить информацию о письме в отдельный файл или базу данных.
Рассмотрим пример простой функции логирования, которая сохраняет данные о письме в файл wp-mail-log.txt в корне темы или плагина:
function wpmail_log_mail($args) {
$log_file = WP_CONTENT_DIR . '/wp-mail-log.txt';
$log_entry = sprintf(
"%s | To: %s | Subject: %s | Headers: %s | Body length: %d\n",
date('Y-m-d H:i:s'),
is_array($args['to']) ? implode(',', $args['to']) : $args['to'],
$args['subject'],
is_array($args['headers']) ? implode(',', $args['headers']) : $args['headers'],
strlen($args['message'])
);
file_put_contents($log_file, $log_entry, FILE_APPEND);
return $args;
}
add_filter('wp_mail', 'wpmail_log_mail');Эта функция подключается через фильтр wp_mail, который срабатывает перед отправкой письма. Она сохраняет дату, адрес получателя, тему, заголовки и длину тела письма.
Улучшаем логирование: детальный контроль и JSON-формат
Для удобства обработки логи можно сохранять в формате JSON, а также добавлять статус отправки письма, IP пользователя и другие параметры.
function wpmail_log_mail_detailed($args) {
$log_file = WP_CONTENT_DIR . '/wp-mail-log.json';
$log_data = [
'time' => current_time('mysql'),
'to' => $args['to'],
'subject' => $args['subject'],
'headers' => $args['headers'],
'body' => mb_substr(strip_tags($args['message']), 0, 200), // первые 200 символов
'user_ip' => $_SERVER['REMOTE_ADDR'] ?? 'unknown',
'sent' => false,
];
// Пытаемся отправить письмо
$sent = wp_mail($args['to'], $args['subject'], $args['message'], $args['headers'], $args['attachments'] ?? []);
$log_data['sent'] = $sent;
file_put_contents($log_file, json_encode($log_data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) . ",\n", FILE_APPEND);
return $args;
}
remove_filter('wp_mail', 'wpmail_log_mail');
add_filter('wp_mail', 'wpmail_log_mail_detailed');Обратите внимание, что вызов wp_mail внутри фильтра требует аккуратности, чтобы избежать рекурсии. В реальных проектах лучше использовать хуки phpmailer_init или обрабатывать отправку вне фильтра.
Использование плагинов для логирования почты в WordPress
Если вы не хотите писать код, можно воспользоваться готовыми плагинами с расширенным функционалом:
- WP Mail Logging — простой и функциональный плагин для записи всех исходящих писем с возможностью просмотра логов в админке.
- Mail Logging — еще один популярный плагин, который сохраняет подробные данные писем, включая статус отправки.
- Clearfy Pro — комплексный плагин оптимизации, который среди прочего помогает управлять логами и уведомлениями.
Плагины позволяют быстро начать логирование без риска ошибок в коде, а также предлагают удобный интерфейс для анализа и экспорта логов.
Как организовать ротацию и очистку файлов логов писем
Если вы используете файл для логов, очень важно контролировать его размер, чтобы он не рос бесконтрольно и не занимал весь диск.
Для этого можно настроить автоматическую ротацию — например, создавать новый файл раз в неделю или при достижении определенного размера, а старые архивировать или удалять.
Пример функции для ротации файла логов по размеру:
function wpmail_rotate_log_file($file_path, $max_size_mb = 5) {
if (!file_exists($file_path)) return;
$max_size = $max_size_mb * 1024 * 1024;
if (filesize($file_path) >= $max_size) {
$new_name = $file_path . '.' . date('YmdHis');
rename($file_path, $new_name);
// Можно добавить код архивации или удаления старых логов
}
}
add_action('shutdown', function() {
wpmail_rotate_log_file(WP_CONTENT_DIR . '/wp-mail-log.txt');
});Это простой способ контролировать размер лога без дополнительного программного обеспечения.
Как просматривать и анализировать логи писем
Для удобного анализа логов стоит:
- Использовать плагины с графическим интерфейсом, чтобы фильтровать письма по дате, статусу, получателю.
- Импортировать JSON или текстовые логи в Excel или специализированные аналитические инструменты.
- Настроить автоматические уведомления при ошибках отправки.
Если у вас большой сайт, можно рассмотреть хранение логов в базе данных — так проще делать выборки и интегрировать с CRM или системами поддержки.
Вот пример создания таблицы и записи лога в базу данных:
function wpmail_create_log_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'wpmail_logs';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
time DATETIME NOT NULL,
recipient TEXT NOT NULL,
subject TEXT NOT NULL,
headers TEXT NULL,
body TEXT NULL,
sent TINYINT(1) DEFAULT 0,
PRIMARY KEY (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
add_action('after_setup_theme', 'wpmail_create_log_table');
function wpmail_save_log_db($to, $subject, $message, $headers, $sent) {
global $wpdb;
$table_name = $wpdb->prefix . 'wpmail_logs';
$wpdb->insert($table_name, [
'time' => current_time('mysql'),
'recipient' => maybe_serialize($to),
'subject' => $subject,
'headers' => maybe_serialize($headers),
'body' => mb_substr(strip_tags($message), 0, 1000),
'sent' => $sent ? 1 : 0
]);
}
add_filter('wp_mail', function($args) {
$sent = wp_mail($args['to'], $args['subject'], $args['message'], $args['headers'] ?? '', $args['attachments'] ?? []);
wpmail_save_log_db($args['to'], $args['subject'], $args['message'], $args['headers'] ?? '', $sent);
return $args;
});Такой подход требует аккуратного контроля, чтобы не создавать рекурсию и не ухудшать производительность сайта.
Выводы и рекомендации
Автоматическое логирование писем в WordPress — ключевой инструмент поддержки стабильной работы сайта и контроля коммуникации с пользователями. Для большинства проектов подойдет простой файл логов с ротацией, но для крупных сайтов лучше использовать базы данных и готовые плагины. При реализации через код обязательно тестируйте на тестовом стенде, чтобы избежать багов и бесконечных циклов отправки.
Для расширенных возможностей рекомендуем обратить внимание на Clearfy Pro — он помогает оптимизировать и контролировать множество процессов в WordPress, в том числе и почтовые уведомления.