WooCommerce не отправляет письма о заказе — как исправить
wp_mail(), а тот без SMTP работать отказывается. Но есть и специфичные для WooCommerce причины.
Почему письма WooCommerce не доходят
Причин обычно четыре, и они наслаиваются:
- Нет SMTP. WooCommerce отправляет письма через
wp_mail()-> PHPmail(). Как и Contact Form 7. Если SMTP не настроен — письма либо не уходят, либо попадают в спам. - Action Scheduler не работает. Начиная с WooCommerce 4.0, письма отправляются через фоновую очередь. Если cron сайта не выполняется — письма зависают в статусе pending и никогда не доходят.
- Шаблон письма пустой или битый. Если в WooCommerce → Настройки → Письма шаблон не заполнен или сломан HTML-код, письмо уходит пустым и попадает в спам.
- Кэш чекаута. Если страница оформления заказа закэширована (LiteSpeed, WP Rocket, Cloudflare), WooCommerce может не выполнить отправку письма после заказа.
woocommerce_run_on_woocommerce_order_status_*. Если у этих задач статус pending — проблема в cron. Если complete — проблема в SMTP или шаблонах.
Как исправить
1. Настроить SMTP
Первое и главное. WooCommerce без SMTP — как курьер без адреса. Инструкция та же, что для WordPress, но с двумя нюансами:
- Плагин WP Mail SMTP. Установите, укажите SMTP-сервер и пароль приложения. Бесплатной версии хватает.
- Укажите «От кого». В настройках плагина задайте Force From Email:
shop@вашдомен.ru. WooCommerce использует адрес из настроек плагина, и если он не совпадает с доменом — Gmail/Mail.ru отклонят письмо.
SMTP-серверы, проверенные на практике:
- Яндекс 360: smtp.yandex.ru, порт 465 (SSL)
- Mail.ru для бизнеса: smtp.mail.ru, порт 465 (SSL)
- Beget: smtp.beget.com, порт 465
После настройки: WP Mail SMTP → Инструменты → Тест письма. Если ушло — SMTP работает.
2. Проверить Action Scheduler
Если SMTP настроен, а письма всё равно не доходят — проверьте очередь задач. WooCommerce ставит отправку писем в очередь через Action Scheduler. Если cron не работает, очередь копится и письма не уходят.
Диагностика:
WooCommerce → Статус → Запланированные задачи
Ищем задачи с "woocommerce" в имени
Смотрим статус: Complete или Pending
Если много задач в статусе Pending — запустите их вручную:
WooCommerce → Статус → Инструменты → «Запустить действие по расписанию»
Для стабильной работы замените встроенный WP-Cron на системный:
# В wp-config.php:
define('DISABLE_WP_CRON', true);
# В crontab (каждые 5 минут):
*/5 * * * * wget -q -O - https://вашсайт.ru/wp-cron.php?doing_wp_cron > /dev/null 2>&1
php /путь/к/сайту/wp-cron.php. Быстрее и не зависит от сети. На Beget и Timeweb — только wget (консольного PHP нет).
3. Проверить шаблоны писем
WooCommerce → Настройки → Письма. Откройте каждое письмо (Новый заказ, Завершённый заказ, Счёт) и проверьте три вещи:
- Тема письма — не пустая, содержит хотя бы название магазина.
- Заголовок — заполнен, без битого HTML. Если там
<div>без закрытия — письмо попадёт в спам. - Адрес получателя — на письмах типа «Новый заказ» должен быть ваш email (админа), а не клиента.
woocommerce_email_header в functions.php темы. Правки в plugins/woocommerce/templates/emails/ слетят при обновлении.
4. Отключить кэш на странице чекаута
Если используется LiteSpeed Cache или WP Rocket — страница оформления заказа не должна кэшироваться. Кэшированная страница может отдать старый nonce, и WooCommerce пропустит событие отправки письма.
# LiteSpeed Cache → Кэш → Исключения → Не кэшировать URL:
/checkout/
/cart/
/my-account/
# WP Rocket → Настройки → Не кэшировать страницы:
/checkout/
/cart/
/my-account/
Для Cloudflare: создайте Page Rule для *вашсайт.ru/checkout* → Cache Level: Bypass.
Проверка результата
После исправлений сделайте тестовый заказ. Письма должны прийти в течение 1-2 минут:
- Клиенту — подтверждение заказа (тема по умолчанию: «Ваш заказ принят»).
- Админу — уведомление о новом заказе (тема: «Новый заказ #123»).
wp_mail(): адрес получателя, тему, статус отправки. После тестового заказа проверьте лог — если письмо есть в логе со статусом «sent», проблема на стороне получателя (спам). Если письма нет в логе — проблема в WooCommerce или cron.
Дополнительно: WooCommerce → Статус → Логи. Найдите файл с woocommerce-*. Если там есть ошибки с mail или email — это подсказка.
Когда способ не сработает
- Хостинг блокирует исходящие порты. Некоторые shared-хостинги закрывают порты 465 и 587 для исходящих соединений. Проверьте у техподдержки. Если закрыты — используйте транзакционный сервис (Mailgun, Brevo) с API-отправкой через порт 443.
- WooCommerce Subscriptions. Для автоматических продлений нужен продвинутый cron (systemd timer или WP-Cron с высокой частотой). Action Scheduler может не справляться с нагрузкой. Решение: активируйте Action Scheduler CLI через
wp action-scheduler run. - Кастомная тема ломает хуки. Если тема удаляет или переопределяет стандартные хуки WooCommerce — письма не отправятся. Проверьте, отключив тему на Storefront.
- Плагин управления заказами. Некоторые плагины (YITH, Order Status Manager) перехватывают статусы заказов и могут блокировать триггеры отправки писем.
- Письма уходят, но в спаме. Значит SMTP работает, но нет SPF/DKIM/DMARC-записей. Добавьте их в DNS-зону домена. WP Mail SMTP покажет инструкцию в разделе «Проверка домена».
Частые вопросы
{admin_email} — email из Настройки → Общие. Убедитесь, что он правильный.mail-tester.com — он покажет рейтинг доставляемости и конкретные ошибки.fatal-errors. Часто помогает пересохранить настройки каждого письма (даже без изменений) — это сбрасывает кэш опций.mail() не авторизуется на почтовом сервере, и крупные почтовики (Gmail, Mail.ru, Яндекс) с высокой вероятностью отклонят такое письмо. Даже если письмо уходит сейчас, при смене хостинга или IP-адреса проблема вернётся. SMTP с авторизацией — единственный стабильный способ.Письма не доходят, нет времени разбираться?
Настрою SMTP, проверю очередь задач, починю шаблоны писем. Обычно хватает часа.