На практике проблема выглядит так: SMTP-плагин подключён, тестовое письмо уходит, а часть системных уведомлений всё равно отправляется «как получится» — через wp_mail(), хостинговый mail() или вообще не доходит до получателя. Для маркетингового сайта это быстро превращается в потерянные заявки, неотправленные письма о заказах и жалобы на спам.
Ниже разберём, как диагностировать источник отправки, как принудительно направить письма через SMTP там, где это действительно нужно, и как не сломать WooCommerce, формы и уведомления админов.
Когда проблема действительно в SMTP, а не в почте получателя
Сначала стоит отделить сбой отправки от проблем доставки. Если письмо уходит из WordPress, но не приходит на Gmail или Яндекс, причина может быть в SPF, DKIM, DMARC или репутации домена. Если же письмо не уходит вообще, тогда уже смотрим на WordPress, плагин SMTP и фильтры wp_mail.
Что проверить в первую очередь
- отправляется ли тестовое письмо из SMTP-плагина;
- есть ли записи в логах плагина отправки почты;
- не переопределяет ли тема или другой плагин функцию
wp_mail(); - не отключён ли
PHPMailerили не меняются ли его настройки через хук; - не отправляет ли WooCommerce письма через отдельные фильтры и шаблоны.
Если тест из плагина проходит, а реальные письма нет, значит проблема обычно в том, что часть кода вызывает wp_mail() напрямую с нестандартными заголовками, либо письмо блокируется до отправки фильтром.
Диагностика: где WordPress теряет письмо
Самый полезный способ — временно включить логирование и посмотреть, что именно уходит в wp_mail(). Если у вас уже стоит SMTP-плагин с журналом, этого часто достаточно. Если нет, можно добавить небольшой отладочный сниппет в mu-plugin или в functions.php дочерней темы.
add_action('wp_mail_failed', function ($wp_error) {
if (is_wp_error($wp_error)) {
error_log('wp_mail_failed: ' . $wp_error->get_error_message());
error_log(print_r($wp_error->get_error_data(), true));
}
});
add_filter('wp_mail', function ($args) {
error_log('wp_mail to: ' . print_r($args['to'], true));
error_log('wp_mail subject: ' . $args['subject']);
return $args;
});Этот код не решает проблему сам по себе, но показывает, доходит ли письмо до этапа отправки. Если в логах есть вызов wp_mail, но нет wp_mail_failed, значит WordPress считает отправку успешной, и дальше нужно проверять SMTP-сервер, доменную аутентификацию и спам-фильтры.
Как ограничить отправку писем через SMTP только для нужных сценариев
Иногда задача не в том, чтобы «всё отправлять через SMTP», а наоборот — ограничить отправку только определёнными типами писем. Например, оставить системные уведомления сайта и админки, но отправлять через SMTP только письма из формы заявки или WooCommerce-уведомления клиенту.
Для этого удобнее не ломать wp_mail() целиком, а фильтровать отправителя, заголовки и при необходимости перенаправлять адресата в зависимости от контекста.
Вариант 1: задать единый отправитель для всех писем
Это базовая настройка, которая часто решает проблемы с доставляемостью. Она не ограничивает отправку, но делает письма более предсказуемыми для почтовых серверов.
add_filter('wp_mail_from', function ($email) {
return 'no-reply@example.com';
});
add_filter('wp_mail_from_name', function ($name) {
return 'Example Site';
});Если SMTP-плагин уже подставляет корректный From, этот код может быть лишним. Но на сайтах, где разные плагины спорят за заголовки письма, фиксированный отправитель часто убирает хаос.
Вариант 2: отправлять через SMTP только письма WooCommerce
Если у вас проблема именно с заказами, логичнее сначала проверить настройки WooCommerce и SMTP-плагина, а уже потом вмешиваться кодом. Но если нужно принудительно пометить письма магазина, можно использовать фильтр woocommerce_email_headers и добавить понятные заголовки.
add_filter('woocommerce_email_headers', function ($headers, $email_id, $order) {
if (in_array($email_id, array('customer_processing_order', 'customer_completed_order'), true)) {
$headers .= "Reply-To: support@example.com\r\n";
}
return $headers;
}, 10, 3);Это не «включает SMTP» магически, но помогает отделить магазинные письма от остальных и упростить диагностику. Если письма WooCommerce не доходят, проверяйте именно шаблоны уведомлений, адрес отправителя и логи SMTP.
Вариант 3: блокировать отправку отдельных писем
Иногда нужно не отправлять технические письма вообще, например массовые уведомления о смене роли пользователя или лишние письма от плагина. Это уже не про SMTP, а про ограничение wp_mail() на уровне фильтра.
add_filter('pre_wp_mail', function ($pre, $atts) {
$subject = isset($atts['subject']) ? (string) $atts['subject'] : '';
if (str_contains($subject, 'Тестовое письмо')) {
return true; // имитируем успешную отправку и блокируем реальную
}
return null;
}, 10, 2);Такой подход полезен только точечно. Если использовать его без списка исключений, можно случайно отключить важные уведомления. Перед внедрением обязательно проверьте, какие письма реально проходят через этот фильтр.
Сравнение подходов: плагин, код или настройка сервера
| Подход | Когда подходит | Минус |
|---|---|---|
| SMTP-плагин | Нужно быстро включить отправку и видеть лог | Иногда конфликтует с другими плагинами почты |
Код через фильтры wp_mail | Нужно точечно менять отправителя или блокировать отдельные письма | Требует аккуратной проверки сценариев |
| Настройка DNS и почтового сервера | Письма уходят, но попадают в спам или отклоняются | Не решает ошибки в самом WordPress |
Если задача — просто стабилизировать отправку, начните с SMTP-плагина. Если нужно управлять отдельными типами писем, подключайте код. Если письма приходят, но плохо доставляются, без SPF/DKIM/DMARC далеко не уедете.
Пошаговое решение без лишнего риска
- Проверьте тестовое письмо в SMTP-плагине и убедитесь, что лог показывает успешную отправку.
- Сравните адрес
Fromв тестовом и реальном письме. - Посмотрите, какие плагины ещё используют
wp_mail()или свои почтовые хуки. - Если письмо не уходит, включите логирование через
wp_mail_failed. - Если письмо уходит, но не доставляется, проверьте DNS-записи домена и репутацию отправителя.
- Только после этого добавляйте фильтры для ограничения отдельных писем.
Как проверить, что всё сработало
Проверка должна быть не одна, а минимум в трёх местах: в WordPress, в SMTP-логе и в почтовом ящике получателя.
- отправьте письмо из формы на сайте и из WooCommerce-заказа;
- посмотрите, есть ли запись в журнале SMTP-плагина;
- убедитесь, что заголовок
Fromсовпадает с доменом, который вы реально используете для отправки; - проверьте, не попало ли письмо в «Спам» или «Промоакции»;
- если письмо блокировалось фильтром, временно уберите фильтр и повторите тест.
Для технической проверки удобно отправить письмо на отдельный ящик и сравнить заголовки. Если в заголовках видно, что письмо прошло через ваш SMTP-сервер, а не через локальный mail(), значит маршрут настроен правильно.
Частые ошибки и как их исправить
SMTP-плагин установлен, но письма всё равно уходят через хостинг
Обычно это значит, что другой плагин или тема вызывает wp_mail() с собственными настройками, либо SMTP-плагин не перехватывает отправку на уровне транспорта. Проверьте, нет ли второго плагина для почты, и отключите дублирующие решения.
Письма отправляются, но получатель видит «от имени сайта» без домена
Причина часто в некорректном From или в том, что хостинг подменяет отправителя. Укажите реальный адрес на вашем домене и проверьте SPF-запись.
WooCommerce перестал отправлять уведомления после фильтра
Скорее всего, фильтр слишком широкий и задевает все письма подряд. Ограничьте его по $email_id и протестируйте только нужные сценарии: новый заказ, завершённый заказ, возврат денег.
Тестовое письмо уходит, а форма обратной связи молчит
Это типичный случай, когда форма использует собственный обработчик или отдельный SMTP-аддон. Смотрите не только WordPress, но и настройки конкретного плагина формы: Contact Form 7, Fluent Forms, WPForms и другие могут иметь свои параметры отправки.
Что важно для безопасности и производительности
Не храните SMTP-пароль в открытом виде в репозитории. Если проект ведётся через Git, лучше вынести чувствительные данные в переменные окружения или хотя бы ограничить доступ к файлу конфигурации. И не ставьте несколько почтовых плагинов одновременно: они часто конфликтуют на уровне фильтров wp_mail и усложняют диагностику.
Если сайт отправляет много уведомлений, не делайте тяжёлую логику внутри фильтра wp_mail. Этот код вызывается часто, и лишние запросы к базе или внешним API будут тормозить весь сайт. Для сложных сценариев лучше сначала записывать событие в очередь, а уже потом отправлять письмо отдельной задачей.
Если вам нужно не только отправлять письма, но и чистить сайт от лишних дублей и следов старых настроек, имеет смысл проверить Clearfy Pro: https://wpshop.ru/plugins/clearfy. Но для почты он не заменяет SMTP-настройку — это именно вспомогательный инструмент для гигиены сайта.