Сценарий типичный: сайт уже отправлял письма через стандартный wp_mail(), вы подключили SMTP-плагин, тестовое письмо вроде бы уходит, а уведомления о новом заказе, смене статуса или восстановлении пароля внезапно перестают доходить. Проблема почти всегда не в WooCommerce как таковом, а в связке wp_mail(), SMTP-плагина, настроек домена и шаблонов уведомлений.
Что обычно ломается после перехода на SMTP
После подключения SMTP WordPress начинает отправлять письма через внешний сервер, а не через локальную функцию хостинга. Это полезно, но добавляет новые точки отказа. Чаще всего ломается одно из трёх:
- неверный
From EmailилиFrom Name; - SMTP-сервер не принимает авторизацию или режет отправку по лимитам;
- WooCommerce использует шаблон письма, который отключён в настройках уведомлений.
Если письмо о заказе не приходит только администратору, а покупателю приходит, проблема обычно в адресе получателя или в фильтрах спама. Если не приходит вообще ничего, сначала проверяйте отправку на уровне WordPress, а уже потом WooCommerce.
Диагностика: где именно пропадает письмо
1. Проверьте, отправляет ли WordPress любое письмо
Сначала нужно отделить проблему WooCommerce от проблемы почтовой доставки. Самый простой тест — отправить письмо через wp_mail() вручную. Добавьте временно такой код в мини-плагин или в functions.php дочерней темы:
add_action('init', function () {
if (!is_user_logged_in() || !current_user_can('manage_options')) {
return;
}
if (isset($_GET['test_wp_mail'])) {
$to = get_option('admin_email');
$subject = 'Тест отправки WordPress';
$message = 'Если это письмо пришло, базовая отправка работает.';
$headers = array('Content-Type: text/plain; charset=UTF-8');
$result = wp_mail($to, $subject, $message, $headers);
wp_die($result ? 'wp_mail() отправил письмо' : 'wp_mail() не смог отправить письмо');
}
});Откройте страницу сайта с параметром ?test_wp_mail=1 под администратором. Если письмо не приходит, проблема не в WooCommerce.
2. Сверьте настройки WooCommerce
Перейдите в WooCommerce → Настройки → Письма и проверьте:
- включено ли уведомление Новый заказ;
- указан ли правильный адрес получателя;
- не переопределён ли шаблон письма в теме;
- не отключено ли письмо плагином для фильтрации уведомлений.
Если письмо покупателю не приходит, проверьте уведомления Заказ в обработке и Заказ завершён. На некоторых магазинах админ ждёт письмо о новом заказе, а клиент — письмо о подтверждении, и отключён оказывается именно клиентский шаблон.
3. Посмотрите логи SMTP-плагина
Большинство SMTP-плагинов умеют писать журнал отправки. Это важнее, чем просто кнопка «Send Test Email». В логе ищите:
- ошибки авторизации;
- ответы сервера 4xx/5xx;
- отклонение письма из-за
FromилиReturn-Path; - лимиты отправки за минуту или за день.
Если в логе письмо отмечено как отправленное, но его нет во входящих, это уже вопрос репутации домена, SPF/DKIM/DMARC и спам-фильтров.
Пошаговое решение без лишних экспериментов
Шаг 1. Зафиксируйте один адрес отправителя
Не используйте случайный адрес из настроек хостинга. Для магазина нужен стабильный адрес на вашем домене, например shop@domain.ru. Он должен совпадать с доменом, который вы реально контролируете, и быть разрешён в SMTP-сервисе.
Если SMTP-плагин позволяет задать From Email и Force From Email, включите принудительную подстановку. Иначе WooCommerce или тема могут подменять отправителя на другой адрес, и сервер начнёт отклонять письмо.
Шаг 2. Проверьте DNS-записи домена
Для нормальной доставляемости нужны SPF и DKIM, а в некоторых случаях ещё и DMARC. Без них письмо может уходить, но попадать в спам или отклоняться на стороне получателя. Проверять нужно не «на глаз», а через инструменты DNS-проверки или отчёты SMTP-сервиса.
Если используете внешний SMTP, убедитесь, что его домен или ваш домен разрешены в SPF. Если сервис выдаёт DKIM-подпись, добавьте её в DNS без сокращений и ручных правок.
Шаг 3. Не ломайте заголовки письма фильтрами темы
Некоторые темы и плагины меняют заголовки писем через фильтры. Это полезно для брендинга, но иногда ломает отправку. Если вы уже добавляли код для кастомизации писем, временно отключите его и проверьте повторно.
Для точечной проверки можно принудительно задать заголовки через фильтр WooCommerce:
add_filter('woocommerce_email_headers', function ($headers, $email_id, $order) {
if ($email_id !== 'new_order') {
return $headers;
}
$headers[] = 'Content-Type: text/html; charset=UTF-8';
return $headers;
}, 10, 3);Этот пример не чинит доставку сам по себе, но помогает исключить проблему с некорректной кодировкой или типом письма.
Шаг 4. Проверьте, не блокирует ли сервер исходящую почту
На части хостингов SMTP-плагин настроен правильно, но сам сервер ограничивает исходящие соединения. Тогда тест может проходить через внешний сервис, а боевые письма — нет. Особенно это заметно, если магазин отправляет много уведомлений подряд.
Если есть доступ к логам сервера, ищите ошибки соединения с SMTP-портом, таймауты и отказ в TLS. На shared-хостинге иногда проще перейти на SMTP-сервис с нормальной репутацией, чем пытаться лечить ограничения провайдера.
Сравнение подходов: плагин, код, хостинг
| Подход | Когда подходит | Минус |
|---|---|---|
| SMTP-плагин | Нужна быстрая настройка без разработки | Зависимость от стороннего сервиса и его лимитов |
Код через wp_mail и фильтры WooCommerce | Нужно точечно проверить или изменить отправку | Требует аккуратной отладки и доступа к коду |
| Почта хостинга | Небольшой сайт без критичных уведомлений | Часто хуже доставляемость и меньше контроля |
Как проверить, что решение сработало
После правок не ограничивайтесь одной тестовой отправкой. Проверьте цепочку целиком:
- отправьте тест через
wp_mail(); - создайте тестовый заказ в WooCommerce;
- проверьте письмо админу и письмо покупателю;
- посмотрите лог SMTP-плагина;
- сравните заголовки письма в почтовом клиенте.
Если письмо приходит в папку «Спам», откройте его заголовки и проверьте, есть ли SPF/DKIM pass. Если письмо не доходит вообще, но лог SMTP показывает успех, проблема уже не в WordPress, а в доставляемости домена или политике почтового сервиса получателя.
Частые ошибки и как их исправить
Письмо отправляется, но не приходит админу
Обычно это неправильный адрес получателя в настройках WooCommerce или фильтр на стороне почтового сервиса. Проверьте, не стоит ли в поле уведомления старый адрес, и не блокирует ли корпоративная почта внешние домены.
Тестовое письмо приходит, а WooCommerce — нет
Значит, SMTP работает, а проблема в шаблоне или событии WooCommerce. Проверьте, включено ли нужное письмо, не переопределён ли шаблон в теме и не отключает ли его код в functions.php.
После смены SMTP письма стали попадать в спам
Чаще всего виноваты несоответствие From Email и домена отправки, отсутствие DKIM или слишком «чужой» SMTP-сервис без прогрева домена. Исправляйте сначала DNS, потом заголовки, а не наоборот.
Письма перестали уходить после обновления плагина
Проверьте журнал ошибок PHP и лог SMTP. Иногда обновление меняет способ авторизации, формат пароля приложения или совместимость с TLS. Если плагин начал падать после обновления, откатите его только после сохранения логов.
Практические советы по безопасности и производительности
Не храните SMTP-пароль в открытом виде в репозитории. Если конфигурация вынесена в wp-config.php, ограничьте доступ к файлу и не коммитьте его в публичный Git. Для сервисов с поддержкой паролей приложений используйте именно их, а не основной пароль почты.
Если магазин отправляет много уведомлений, не запускайте массовую отправку на каждом запросе страницы. Для фоновой отправки используйте штатный WP-Cron только для небольших объёмов; при высокой нагрузке лучше вынести рассылку в очередь или внешний сервис. Иначе вы получите задержки на checkout и нестабильную отправку.
Когда нужно быстро убрать лишние источники проблем в админке и на фронтенде, полезно проверить, не мешают ли почтовой логике лишние оптимизации, дубли и старые настройки темы. В таких случаях помогает аккуратная чистка конфигурации и отключение лишнего функционала, но без удаления рабочих уведомлений и без «магических» правок в ядре.