Краткий ответ: WooCommerce не отправляет письма чаще всего из-за отключённых email-уведомлений, неправильного “From” email, проблем с wp_mail(), отсутствия SMTP, ошибок SPF/DKIM/DMARC, статуса заказа, конфликта плагинов, кеша, шаблонов писем или ограничений хостинга. Исправлять нужно по шагам: сначала проверить настройки WooCommerce, потом отправку WordPress, SMTP, DNS почты, логи и только после этого искать конфликт в коде.
Важно разделять две ситуации: WooCommerce вообще не создаёт письмо или письмо создаётся, но не доходит до получателя. В первом случае проблема часто в настройках WooCommerce, статусах заказа, хуках или конфликте плагинов. Во втором — в доставляемости почты: SMTP, DNS, спам-фильтрах, SPF, DKIM, DMARC и репутации отправителя.
WooCommerce отправляет письма через почтовую систему WordPress. Внутри WordPress используется функция wp_mail(), а дальше письмо уходит через PHP mail() на хостинге или через SMTP-плагин, если он настроен.
Если на любом этапе есть ошибка, письмо может не уйти или попасть в спам.
Если не отправляются не только письма WooCommerce, но и любые письма с сайта, сначала стоит проверить общую проблему: не отправляются письма WordPress. Если WordPress-письма работают, а WooCommerce — нет, тогда проблема уже ближе к заказам, email-шаблонам, статусам или конфликту WooCommerce.
| Письмо | Кому отправляется | Когда обычно срабатывает |
|---|---|---|
| New order | Администратору или менеджеру | Когда создан новый заказ и сработало уведомление магазина |
| Cancelled order | Администратору | Когда заказ отменён |
| Failed order | Администратору | Когда заказ не прошёл оплату или получил статус failed |
| Processing order | Клиенту | Когда заказ перешёл в обработку |
| Completed order | Клиенту | Когда заказ завершён |
| Customer invoice | Клиенту | Когда счёт отправляется вручную или автоматически |
| Refunded order | Клиенту | Когда оформлен возврат |
| Customer note | Клиенту | Когда менеджер добавил заметку для клиента |
| Reset password | Пользователю | Когда клиент запросил сброс пароля |
| New account | Пользователю | Когда создан аккаунт клиента |
Если не приходит только письмо “New order”, это не всегда значит, что почта полностью сломана. Нужно проверить именно email-шаблон “New order”, получателя, статус заказа и логи WooCommerce.
Начинать нужно не с установки нового SMTP-плагина, а с проверки цепочки отправки. Иначе можно настроить SMTP правильно, но не заметить, что само уведомление WooCommerce отключено.
| Симптом | Вероятная причина | Что проверить |
|---|---|---|
| Не приходит ни одно письмо с сайта | wp_mail(), SMTP или хостинг | SMTP, PHP mail, debug.log, DNS |
| Не приходит только письмо о новом заказе | Настройки New order | WooCommerce → Settings → Emails → New order |
| Клиенту письмо приходит, админу нет | Неверный recipient | Получатели админского уведомления |
| Админу приходит, клиенту нет | Проблема customer email или статус заказа | Email клиента, статус, спам |
| Письмо уходит, но попадает в спам | Проблемы доставляемости | SPF, DKIM, DMARC, SMTP, From email |
| После оплаты письма нет | Платёжный плагин не меняет статус | Статус заказа, gateway logs |
| Письмо было, но пропало после обновления | Конфликт плагина или шаблона | debug.log, overrides, плагины |
| Тест SMTP проходит, а WooCommerce молчит | WooCommerce не создаёт конкретное уведомление | Email template, status, hooks, logs |
Если не хотите рисковать сайтом и тратить время на эксперименты, можно оставить заявку. Я посмотрю задачу и предложу аккуратное решение.
Исправление лучше делать по слоям: WooCommerce-настройки, WordPress-почта, SMTP, DNS, статусы заказов, конфликты и шаблоны.
Откройте WooCommerce → Settings → Emails. Затем выберите проблемный шаблон, например New order, Processing order или Completed order.
В WooCommerce важно использовать нормальный адрес отправителя. Лучше, чтобы From address был на том же домене, что и сайт.
Пример:
Для магазина SMTP почти всегда надёжнее, чем стандартный PHP mail() хостинга. SMTP помогает отправлять письма через авторизованный почтовый сервер.
Если SMTP работает, но письма попадают в спам, проверьте DNS-записи домена. Почтовые сервисы всё чаще отклоняют или занижают письма без нормальной доменной авторизации.
WooCommerce письма зависят от событий и статусов. Если платёжный шлюз не меняет статус заказа после оплаты, нужное письмо может не сработать.
Если заказ не создаётся или checkout зависает, сначала нужно исправить оформление заказа. Для этого подходит отдельная диагностика: WooCommerce не оформляет заказ.
На практике письма часто ломают плагины SMTP, кеша, оптимизации, оплаты, checkout fields, email customizer и security-плагины. Если проблема появилась после обновления или установки нового плагина, нужно искать конфликт.
Безопасный порядок проверки описан отдельно в статье про конфликт плагинов WordPress.
Важно: код ниже предназначен для диагностики отправки писем. Не оставляйте расширенное логирование надолго на рабочем магазине, если в лог могут попасть email клиентов, темы заказов или персональные данные. Перед правками сделайте бэкап.
Куда вставлять: в файл wp-config.php перед строкой /* That’s all, stop editing! */.
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
Куда вставлять: в отдельный небольшой плагин или временно в functions.php дочерней темы. Лучше использовать отдельный служебный плагин, чтобы код не потерялся при смене темы.
<?php
if (!defined('ABSPATH')) {
exit;
}
add_action('wp_mail_failed', 'sc_log_wp_mail_failed');
function sc_log_wp_mail_failed($wp_error) {
if (!is_wp_error($wp_error)) {
return;
}
error_log('================ SC WP MAIL FAILED ================');
error_log('Message: ' . $wp_error->get_error_message());
$error_data = $wp_error->get_error_data();
if (!empty($error_data) && is_array($error_data)) {
if (!empty($error_data['to'])) {
error_log('To: ' . print_r($error_data['to'], true));
}
if (!empty($error_data['subject'])) {
error_log('Subject: ' . $error_data['subject']);
}
if (!empty($error_data['headers'])) {
error_log('Headers: ' . print_r($error_data['headers'], true));
}
}
error_log('====================================================');
}
Важно: этот тест отправляет письмо администратору сайта. Используйте только для диагностики и удалите после проверки.
Куда вставлять: в отдельный временный плагин или functions.php дочерней темы.
<?php
add_action('admin_init', 'sc_test_wp_mail_from_admin');
function sc_test_wp_mail_from_admin() {
if (!current_user_can('manage_options')) {
return;
}
if (empty($_GET['sc_test_wp_mail'])) {
return;
}
$admin_email = get_option('admin_email');
$sent = wp_mail(
$admin_email,
'Test wp_mail from WordPress',
'Это тестовое письмо WordPress. Если оно пришло, wp_mail работает.'
);
if ($sent) {
wp_die('Тестовое письмо отправлено на: ' . esc_html($admin_email));
}
wp_die('wp_mail вернул false. Проверьте debug.log, SMTP и хостинг.');
}
После вставки откройте в админке URL:
/wp-admin/?sc_test_wp_mail=1
Важно: код ниже не должен использоваться как постоянное решение. Он нужен только для диагностики, чтобы понять, загружаются ли email-классы WooCommerce.
<?php
add_action('admin_init', 'sc_debug_woocommerce_email_classes');
function sc_debug_woocommerce_email_classes() {
if (!current_user_can('manage_options')) {
return;
}
if (empty($_GET['sc_debug_wc_emails'])) {
return;
}
if (!class_exists('WooCommerce')) {
wp_die('WooCommerce не активен.');
}
$mailer = WC()->mailer();
$emails = $mailer->get_emails();
echo '<pre>';
foreach ($emails as $email_key => $email_object) {
echo esc_html($email_key) . "n";
echo 'Title: ' . esc_html($email_object->get_title()) . "n";
echo 'Enabled: ' . esc_html($email_object->is_enabled() ? 'yes' : 'no') . "n";
echo "-----------------------------n";
}
echo '</pre>';
exit;
}
После вставки откройте в админке URL:
/wp-admin/?sc_debug_wc_emails=1
Важно: не используйте этот код вслепую, если SMTP-плагин уже задаёт отправителя. Дублирующие настройки могут конфликтовать.
<?php
add_filter('wp_mail_from', 'sc_set_wp_mail_from');
function sc_set_wp_mail_from($email) {
return 'shop@example.com';
}
add_filter('wp_mail_from_name', 'sc_set_wp_mail_from_name');
function sc_set_wp_mail_from_name($name) {
return 'Example Shop';
}
Замените shop@example.com на email вашего домена. Если используете SMTP-плагин, лучше задавать отправителя в его настройках, а не через код.
После правильного исправления WooCommerce должен стабильно отправлять письма администратору и клиенту. Тестовое письмо WordPress должно уходить, WooCommerce email-шаблоны должны быть включены, SMTP должен проходить проверку, а DNS домена должен подтверждать право отправки писем.
Подходит для большинства магазинов. SMTP заменяет нестабильную отправку через PHP mail() на авторизованную отправку через почтовый сервер.
Плюсы: быстрое решение, тестовая отправка, часто есть email logs.
Минусы: нужно правильно настроить DNS, логин, пароль, порт и шифрование.
Подходит для магазинов, где письма критичны: заказы, оплаты, счета, доступы, восстановление пароля.
Плюсы: лучше контроль доставляемости, логи, статистика, меньше зависимость от хостинга.
Минусы: внешний сервис, тарифы, настройка домена.
Если менеджеру важно сразу видеть заказ, можно дополнительно отправлять уведомление в Telegram. Это не заменяет email, но помогает не пропустить заявку или покупку.
Для такой логики можно использовать интеграцию WordPress с Telegram.
Подходит, если нужно видеть историю: когда письмо создано, кому отправлено, какой был статус, какая ошибка вернулась от SMTP или API.
Плюсы: проще искать причины проблем.
Минусы: нужно аккуратно хранить данные, чтобы не сохранять лишнюю персональную информацию.
SMTP может быть настроен правильно, но если WooCommerce email-шаблон отключён, письмо всё равно не появится. Сначала нужно проверить WooCommerce → Settings → Emails.
Если сайт отправляет письма от имени Gmail, но сервер не авторизован как отправитель, письма могут попадать в спам или отклоняться.
Если заказ остался в “Pending payment”, часть писем может не сработать. Нужно смотреть, как платёжный шлюз меняет статус.
Нужно тестировать письма и администратору, и клиенту. Это разные шаблоны и разные сценарии.
SPF, DKIM и DMARC напрямую влияют на доверие почтовых сервисов. Без них письмо может технически отправиться, но не попасть во входящие.
Если email-шаблон ломается из-за PHP-ошибки, SMTP не решит проблему. Нужно смотреть логи.
Если тема переопределяет email templates, после обновлений WooCommerce они могут конфликтовать с новой версией.
Неправильный кеш может ломать оформление заказа, авторизацию и пользовательские сценарии. Письма часто выглядят как проблема email, хотя причина начинается раньше — в checkout или статусе заказа.
WooCommerce может не отправлять письма из-за отключённых email-уведомлений, неправильного получателя, проблем wp_mail(), отсутствия SMTP, ошибок DNS, статуса заказа, конфликта плагинов или устаревших email-шаблонов.
Сначала проверьте WooCommerce → Settings → Emails: включено ли нужное уведомление, указан ли получатель, правильный ли From email. Затем проверьте wp_mail(), SMTP и debug.log.
Это значит, что почтовый канал работает, но WooCommerce может не создавать конкретное письмо. Нужно проверить email-шаблон, статус заказа, хуки, получателя и конфликты плагинов.
Нужно настроить SMTP, использовать email на домене сайта, добавить SPF/DKIM/DMARC, проверить WooCommerce email settings, статусы заказов, debug.log и конфликты плагинов.
WooCommerce использует WordPress wp_mail(). Если SMTP-плагин не настроен, отправка обычно идёт через серверную почту хостинга. Если SMTP настроен, wp_mail() отправляет письма через SMTP.
Частые причины: отключено уведомление New order, неверный recipient, письмо попало в спам, заказ не получил нужный статус, есть конфликт плагина или ошибка в email-шаблоне.
Проверьте email клиента, статус заказа, customer email-шаблоны, SMTP logs, спам и DNS-записи домена. Если заказ не перешёл в нужный статус, письмо может не сработать.
Для интернет-магазина SMTP обычно лучше, чем стандартная отправка через PHP mail(). Он повышает надёжность отправки и даёт больше контроля над логами и ошибками.
Это DNS-настройки домена, которые помогают почтовым сервисам понять, что письмо действительно отправлено от имени вашего домена, а не подделано.
Кеш обычно не отправляет письма напрямую, но может ломать checkout, account, nonce, cart fragments и статусы заказов. В итоге письмо не появляется, потому что заказ не прошёл нормальный сценарий.
Да. Если платёжный плагин не меняет статус заказа после оплаты или возвращает ошибку callback/webhook, WooCommerce может не запустить нужное email-уведомление.
Проверьте WooCommerce → Status → Logs, файл wp-content/debug.log, SMTP logs и ошибки wp_mail_failed, если вы добавили диагностический hook.
Да, некоторые письма можно отправить повторно из админки заказа через действия заказа. Но если причина не исправлена, повторная отправка тоже может не дойти.
Настройте SMTP, используйте доменный email, проверьте SPF, DKIM, DMARC, уменьшите подозрительную HTML-разметку и проверьте репутацию домена.
Если WooCommerce не отправляет письма, не нужно исправлять всё сразу. Сначала проверьте, создаётся ли заказ, какой у него статус, включено ли нужное email-уведомление и правильно ли указан получатель. Затем проверьте wp_mail(), SMTP, DNS домена, спам, логи и конфликты плагинов.
Надёжная схема для интернет-магазина — это включённые WooCommerce email-шаблоны, SMTP-отправка, доменный From address, настроенные SPF/DKIM/DMARC, рабочие логи и тестовый заказ после любых обновлений. Тогда письма о заказах, оплатах, статусах и аккаунтах не будут зависеть только от случайной работы почты хостинга.
Об авторе