Способы перехвата писем локально
1. MailHog / Mailpit (самый удобный для разработки)
Это локальные SMTP-серверы с веб-интерфейсом. Все письма попадают в него и отображаются в браузере, реальная отправка не идёт.
- Mailpit:
docker run -p 1025:1025 -p 8025:8025 axllent/mailpit
- Письма видны на
http://localhost:8025
Затем перехватываете wp_mail через плагин или в functions.php:
add_filter('wp_mail_from', function () {
return 'noreply@localhost';
});
// Через PHPMailer — направить в локальный SMTP
add_action('phpmailer_init', function ($phpmailer) {
$phpmailer->isSMTP();
$phpmailer->Host = '127.0.0.1';
$phpmailer->Port = 1025;
$phpmailer->SMTPAuth = false;
$phpmailer->SMTPSecure = false;
});
Письмо придёт в Mailpit, где вы увидите тему, тело, заголовки, вложения — всё как в реальном письме.
2. Перехват без внешних программ — запись в файл
Если не хотите поднимать контейнер:
add_filter('wp_mail', function ($args) {
$log = sprintf(
"[%s]\nКому: %s\nТема: %s\nТело:\n%s\n%s\n",
current_time('mysql'),
implode(', ', (array) $args['to']),
$args['subject'],
strip_tags($args['message']),
str_repeat('-', 60)
);
file_put_contents(WP_CONTENT_DIR . '/mail-log.txt', $log, FILE_APPEND);
return $args; // письмо всё равно уйдёт — см. ниже
});
Чтобы письмо не отправлялось вообще, добавьте ранний return с подменой получателя:
add_filter('wp_mail', function ($args) {
$args['to'] = 'test@localhost'; // подмена получателя
file_put_contents(
WP_CONTENT_DIR . '/mail-log.txt',
print_r($args, true),
FILE_APPEND
);
return $args;
});
3. Плагины-логгеры
- WP Mail Logging — записывает все исходящие письма в БД, показывает в админке, статус отправки.
- Email Log — то же самое, плюс возможность повторной отправки.
Чтобы письма не уходили реальным людям, комбинируйте с подменой получателя через фильтр wp_mail, как выше.
4. Отладка на уровне PHP
Если письма уходят через wp_mail(), а не напрямую через mail(), можно временно заменить функцию:
// mu-plugin: wp-content/mu-plugins/test-mail.php
add_filter('pre_wp_mail', function ($null, $atts) {
if (defined('TEST_MAIL') && TEST_MAIL) {
error_log(print_r($atts, true));
return true; // «успех», но ничего не отправлено
}
return $null;
}, 10, 2);
В wp-config.php поставьте define('TEST_MAIL', true);. Фильтр pre_wp_mail, возвращающий не-null, полностью отменяет реальную отправку — письмо только логируется.
Что выбрать
- Разработка локально (Docker/Local) — Mailpit, видно всё как есть.
- Нужно проверить на живом сайте без отправки —
pre_wp_mail с подменой или плагин WP Mail Logging + фильтр wp_mail для подмены получателя.
- Быстрая проверка шаблона письма — запись в файл через
wp_mail.
Ответить на вопрос