Сценарий типичный: форма на сайте отправляется без ошибок, но письмо не приходит ни на почту, ни в спам. В WordPress это почти всегда не проблема самой формы, а вопрос доставки: wp_mail(), настройки сервера, SPF/DKIM/DMARC, конфликт плагинов или неправильный адрес получателя. Ниже — рабочий порядок проверки, который помогает не гадать, а быстро сузить причину.
С чего начать диагностику
Если форма «успешно отправлена», это ещё не значит, что письмо реально ушло. Сначала проверьте, где именно ломается цепочка: на уровне формы, WordPress или почтового сервера. Это экономит время, потому что в разных местах нужны разные действия.
Что проверить в первую очередь
- правильность адреса получателя в настройках формы;
- используется ли
wp_mail()или внешний SMTP; - не уходит ли письмо в спам из-за доменной политики;
- нет ли конфликта с кэшем, security-плагином или плагином SMTP;
- совпадает ли
From-адрес с доменом сайта.
Если у вас форма на Contact Form 7, WPForms, Fluent Forms или аналогичном плагине, логика одна и та же: форма формирует письмо, а дальше WordPress передаёт его в почтовую систему сервера. На дешёвом хостинге эта часть часто работает нестабильно.
Пошаговое решение: от проверки формы до SMTP
1. Убедитесь, что форма отправляет данные вообще
Откройте настройки формы и проверьте, что в шаблоне письма указан реальный email администратора или отдела продаж. Частая ошибка — оставить плейсхолдер вроде [your-email] в поле получателя, хотя он должен стоять только в поле отправителя или в теле письма.
Если форма показывает сообщение об успехе, но письма нет, временно замените получателя на личный ящик, который точно принимает почту, и проверьте ещё раз.
2. Проверьте, что WordPress вообще умеет отправлять почту
Самый простой тест — отправить письмо через 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 = 'Если это письмо пришло, значит wp_mail() работает.';
$headers = array('Content-Type: text/plain; charset=UTF-8');
$result = wp_mail($to, $subject, $message, $headers);
wp_die($result ? 'Письмо отправлено' : 'Ошибка отправки');
}
});После добавления кода откройте страницу сайта с параметром ?test_wp_mail=1 под учётной записью администратора. Если WordPress сообщает об успехе, но письма всё равно нет, проблема почти наверняка на стороне доставки.
3. Настройте SMTP вместо стандартной отправки
Для боевого сайта лучше не полагаться на отправку через PHP mail. Надёжнее использовать SMTP-сервис почтового провайдера или транзакционный сервис. Это особенно важно для интернет-магазинов и сайтов с заявками.
Если используете плагин WP Mail SMTP или аналогичный, проверьте три вещи:
- в качестве отправителя указан доменный адрес, а не личная почта на бесплатном сервисе;
- включена аутентификация SMTP;
- в логах нет ошибок авторизации, TLS или блокировки порта.
Если нужен контроль на уровне кода, можно задать заголовки письма так, чтобы From совпадал с доменом сайта:
$to = 'sales@example.com';
$subject = 'Новая заявка с сайта';
$message = 'Пользователь оставил сообщение через форму.';
$headers = array(
'Content-Type: text/plain; charset=UTF-8',
'From: Site Mail <no-reply@example.com>',
'Reply-To: manager@example.com',
);
wp_mail($to, $subject, $message, $headers);Важно: From лучше делать адресом на вашем домене, который реально существует или хотя бы проходит проверку у почтового сервера. Иначе письма часто попадают в спам или отклоняются.
4. Включите логирование отправки
Когда письмо не доходит, без логов вы видите только симптом. Если у вас уже стоит SMTP-плагин с журналом отправки, откройте последнюю попытку и посмотрите код ошибки. Если логов нет, временно добавьте фильтр для отладки:
add_action('wp_mail_failed', function ($wp_error) {
error_log('WP Mail failed: ' . print_r($wp_error, true));
});После этого повторите отправку формы и проверьте debug.log. Если там ошибка авторизации, значит проблема в SMTP-данных. Если ошибка доставки отсутствует, а письма нет, смотрите спам-фильтры и доменную аутентификацию.
Когда проблема не в WordPress, а в почте
Иногда WordPress отправляет письмо корректно, но сервер получателя его отклоняет. Это видно по логам SMTP или по ответам почтового сервиса. В таком случае нужно проверить DNS-записи домена: SPF, DKIM и DMARC. Без них письма с сайта часто выглядят для почтовиков подозрительно.
Если форма отправляет письма с адреса вида wordpress@site.ru, а домен не настроен, это почти гарантированная причина проблем. Лучше использовать ящик, который обслуживается вашим доменом и совпадает с политикой отправки.
| Подход | Что даёт | Ограничение |
|---|---|---|
Стандартный wp_mail() | Не требует внешней настройки | Зависит от хостинга, часто нестабилен |
| SMTP через плагин | Нормальная авторизация и логи | Нужно настроить почтовый сервис |
Код с wp_mail() и логированием | Быстрая диагностика | Не решает доставку сам по себе |
Проверка результата после внедрения
После настройки SMTP и исправления адресов проверьте не только сам факт отправки, но и путь письма до ящика. Делайте это в таком порядке:
- отправьте тестовое письмо из WordPress;
- проверьте, что оно пришло в основной ящик;
- посмотрите папку «Спам»;
- откройте заголовки письма и убедитесь, что домен проходит SPF/DKIM;
- сделайте реальную отправку через форму на сайте.
Если письмо приходит только на один ящик, а на другой нет, проблема может быть не в WordPress, а в правилах фильтрации конкретного почтового сервиса. Это особенно заметно при отправке на корпоративные домены.
Частые ошибки и как их исправить
Неправильный адрес отправителя
Ошибка выглядит так: в форме указан From: user@gmail.com, а сайт находится на домене example.com. Многие почтовые серверы такое письмо режут или помечают как подозрительное. Решение — использовать адрес на своём домене и при необходимости добавить Reply-To с email пользователя.
Форма отправляет на несуществующий ящик
Иногда в настройках формы остаётся старый адрес после редизайна или переноса сайта. Проверяйте не только шаблон письма, но и отдельные поля получателя в настройках плагина.
SMTP настроен, но письма всё равно не уходят
Обычно причина в неверном пароле, неправильном порте, отключённом TLS или блокировке исходящих соединений на хостинге. В логах это видно сразу. Если логов нет, включите их — без этого вы будете только угадывать.
Конфликт с плагином безопасности или кэшем
Некоторые security-плагины режут AJAX-запросы формы или блокируют отправку по подозрительным шаблонам. Кэш-плагины обычно не ломают почту напрямую, но могут мешать тестам, если форма или страница с ней отдаются из кэша в старом состоянии. Для проверки временно отключите кэширование на странице формы и повторите отправку.
Практические советы по безопасности и производительности
Не храните SMTP-пароль в открытом виде в репозитории, если сайт разворачивается через Git. Для production лучше держать чувствительные данные вне публичного кода или хотя бы ограничить доступ к файлам конфигурации. Если используете отдельный почтовый ящик для сайта, задайте минимально необходимые права и включите двухфакторную аутентификацию там, где это поддерживается.
Для сайтов с большим потоком заявок полезно включить журнал отправки и периодически его просматривать. Это помогает заметить повторяющиеся ошибки до того, как пользователи начнут жаловаться. Если нужен более широкий контроль над чистотой сайта и дублями, в экосистеме WPShop есть Clearfy Pro: https://wpshop.ru/plugins/clearfy. Но для почты он не заменяет SMTP-настройку — это разные задачи.
Мини-чек-лист перед публикацией формы
- адрес получателя указан вручную и проверен;
Fromсовпадает с доменом сайта;- SMTP работает и есть лог последней отправки;
- тестовое письмо приходит в основной ящик;
- страница формы не ломается после очистки кэша;
- в заголовках письма нет подмены домена.
Если после всех проверок письма всё ещё не доходят, следующий шаг — смотреть не в WordPress, а в почтовый сервис, DNS-записи и серверные ограничения хостинга. В большинстве реальных случаев проблема находится именно там, а не в самой форме.