Если форма Contact Form 7 отправляется без ошибок, а письма не приходят в почту, проблема обычно не в самой форме. Чаще всего ломается связка между WordPress, SMTP-плагином, заголовками письма и серверной доставкой. Ниже — рабочий порядок диагностики, который помогает не гадать, а быстро сузить причину.
Как понять, где именно ломается отправка
Сначала нужно разделить проблему на три уровня: форма не отправляется вообще, WordPress не может сформировать письмо, либо письмо уходит, но теряется по пути. Это разные сценарии, и лечатся они по-разному.
Что проверить в первую очередь
- В Contact Form 7 нет ли ошибки в поле
MailиMail (2). - Совпадает ли домен в адресе отправителя с доменом сайта или SMTP-сервера.
- Не подменяет ли хостинг функцию
mail()или не блокирует ли исходящую почту. - Есть ли в SMTP-плагине лог отправки и статус успешной передачи.
- Не попадает ли письмо в спам из-за SPF, DKIM или DMARC.
Если в админке Contact Form 7 после отправки показывается зеленое сообщение, это еще не означает, что письмо доставлено. Это только значит, что форма прошла обработку на стороне WordPress.
Диагностика: где смотреть ошибки
Самый практичный путь — включить логирование там, где оно реально помогает. Если у вас уже стоит SMTP-плагин, проверьте его журнал. Если нет, сначала поставьте нормальную отправку через SMTP, а потом уже ищите причину в логах.
Проверка через WP Mail SMTP или аналогичный SMTP-плагин
В большинстве случаев достаточно одного SMTP-плагина с журналом отправки. Важно не просто включить его, а проверить, что письмо уходит через нужный сервер, а не через mail().
Типичная ошибка — SMTP настроен, но Contact Form 7 продолжает отправлять письмо с адреса wordpress@domain.tld или с чужого домена. Такой адрес часто режется на стороне получателя.
Что смотреть в логах
- код ответа SMTP-сервера;
- адрес отправителя и получателя;
- тему письма;
- ошибку авторизации, если сервер не принимает логин и пароль;
- ошибку TLS/SSL, если шифрование не совпадает с настройками порта.
Если логов нет, временно включите отладку WordPress и проверьте, не пишет ли плагин отправки в debug.log. Но не держите отладку включенной постоянно на боевом сайте.
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);Пошаговое решение для Contact Form 7
Ниже порядок, который обычно дает результат без лишних экспериментов.
1. Исправьте адрес отправителя в форме
В настройках письма Contact Form 7 поле From должно быть привязано к домену сайта или к адресу, который разрешен вашим SMTP-сервером. Не используйте случайные внешние адреса вроде Gmail в качестве отправителя, если сервер не настроен на их отправку.
Практически безопасный вариант:
From: WordPress <no-reply@site.ru>
Reply-To: [your-email]Здесь Reply-To позволяет отвечать на письмо пользователя, а From остается техническим адресом сайта.
2. Настройте SMTP, а не отправку через PHP mail
Если хостинг поддерживает SMTP, используйте его. Это не гарантирует доставку, но резко снижает количество проблем с авторизацией и фильтрацией.
Для проверки отправьте тестовое письмо из SMTP-плагина. Если тест не проходит, не тратьте время на Contact Form 7 — сначала чините сам канал отправки.
3. Проверьте заголовки и вложения
Иногда письмо не уходит из-за некорректного вложения или слишком тяжелого файла. Contact Form 7 не должен принимать все подряд. Ограничьте типы и размер файлов в форме, если используете загрузку.
[file your-file limit:5mb filetypes:pdf|jpg|png]Если вложение не нужно, уберите поле загрузки совсем. Чем меньше сложных частей в письме, тем проще диагностика.
4. Сверьте доменную аутентификацию
Даже при рабочем SMTP письмо может не доходить, если домен не подтвержден SPF/DKIM/DMARC. Это особенно заметно, когда письма уходят в спам или отклоняются без явной ошибки в WordPress.
Проверка простая: откройте заголовки письма у получателя и найдите строки про spf=pass, dkim=pass, dmarc=pass. Если там провал, проблема уже не в Contact Form 7.
Сравнение подходов: плагин, код, настройки хостинга
| Подход | Когда подходит | Плюсы | Минусы |
|---|---|---|---|
| SMTP-плагин | Почта не уходит или попадает в спам | Быстро внедряется, есть логи | Зависимость от стороннего плагина |
Код через wp_mail | Нужна точечная доработка темы или плагина | Гибкость, контроль заголовков | Нужны навыки разработки и тестирование |
| Настройка хостинга | Проблема в серверной почте | Решает корень проблемы | Не всегда доступно на shared-хостинге |
Если нужен контроль через код
Иногда полезно принудительно задать отправителя для всех писем WordPress, чтобы Contact Form 7 не использовал случайные значения из формы. Это особенно актуально, если на сайте несколько форм и часть писем формируется сторонними плагинами.
add_filter('wp_mail_from', function ($from_email) {
return 'no-reply@site.ru';
});
add_filter('wp_mail_from_name', function ($from_name) {
return 'Site Name';
});Этот код лучше добавлять в дочернюю тему или в небольшой mu-plugin, а не в основной файл темы, который может перезаписаться при обновлении.
Если вы используете SMTP-плагин, не дублируйте его настройки этим кодом без необходимости. Иначе можно получить конфликт: плагин отправляет одно, фильтр подменяет другое.
Проверка результата после внедрения
После изменений не ограничивайтесь одной тестовой отправкой. Проверьте цепочку целиком.
- Отправьте форму с реальным адресом получателя.
- Проверьте папку входящих и спам.
- Посмотрите логи SMTP-плагина.
- Откройте заголовки письма и убедитесь, что доменная аутентификация проходит.
- Если есть вложение, проверьте, что оно дошло и открывается.
Хороший признак — письмо приходит стабильно с одного и того же адреса, а в логах нет повторных попыток отправки и ошибок авторизации.
Частые ошибки и как их исправить
Используют адрес Gmail в поле From
Это частая причина отказа или спама. Для отправителя лучше использовать адрес на своем домене, а Gmail оставить только как получателя или как адрес для ответа.
Оставляют пустой Reply-To
Тогда отвечать на письмо неудобно, а иногда теряется контекст обращения. В Contact Form 7 лучше явно подставлять email пользователя в Reply-To.
Смешивают несколько способов отправки
Если одновременно настроены SMTP-плагин, кастомный фильтр wp_mail_from и еще серверная переадресация, отладка превращается в хаос. Оставьте один основной канал и проверьте его отдельно.
Не проверяют лимиты хостинга
Некоторые хостинги ограничивают число исходящих писем в час. В таком случае форма может работать, но часть сообщений не будет уходить при всплеске обращений.
Что делать, если письма все равно не приходят
Если SMTP настроен, заголовки корректны, а письма не доходят, проверьте уже внешние факторы: фильтры почтового сервиса, черные списки IP, ограничения хостинга и правила антиспама у получателя. На этом этапе Contact Form 7 обычно уже ни при чем.
Для сайтов с высокой ценой потери заявки полезно хранить копию обращения в админке или отправлять уведомление в дополнительный канал, например на отдельный рабочий ящик. Это не заменяет почту, но снижает риск пропустить заявку из-за сбоя доставки.
Если вам нужно уменьшить количество технического мусора в WordPress, можно дополнительно убрать лишние дубли и служебные хвосты через Clearfy Pro: https://wpshop.ru/plugins/clearfy. Но это уже вспомогательная мера, а не замена нормальной настройке почты.
Главная идея простая: сначала убедитесь, что письмо формируется корректно, потом — что оно уходит через рабочий SMTP, и только после этого ищите проблемы на стороне получателя. Такой порядок экономит время и не заставляет менять настройки вслепую.