Как ограничить отправку писем с сайта WordPress через SMTP и wp_mail

На практике проблема выглядит так: 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 далеко не уедете.

Пошаговое решение без лишнего риска

  1. Проверьте тестовое письмо в SMTP-плагине и убедитесь, что лог показывает успешную отправку.
  2. Сравните адрес From в тестовом и реальном письме.
  3. Посмотрите, какие плагины ещё используют wp_mail() или свои почтовые хуки.
  4. Если письмо не уходит, включите логирование через wp_mail_failed.
  5. Если письмо уходит, но не доставляется, проверьте DNS-записи домена и репутацию отправителя.
  6. Только после этого добавляйте фильтры для ограничения отдельных писем.

Как проверить, что всё сработало

Проверка должна быть не одна, а минимум в трёх местах: в 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-настройку — это именно вспомогательный инструмент для гигиены сайта.

Как автоматически удалять незавершённые заказы WooCommerce по cron
17.06.2026
Как автоматизировать управление решением технических проблем на сайте WordPress
23.03.2026
Как установить отложенную загрузку изображений в WordPress для ускорения сайта
19.03.2026
Как добавить поля для выбора даты и времени в оформление заказа WooCommerce
25.06.2026
Оптимизация WordPress для маркетинговых сайтов: уменьшение времени загрузки
07.02.2026