Contact Form 7 не отправляет письма с WordPress — как исправить
wp_mail(). Проблема в том, что wp_mail() полагается на PHP-функцию mail(), а ей на большинстве хостингов доверять нельзя. Решение: SMTP с авторизацией. 15 минут — и письма уходят.
Почему Contact Form 7 не отправляет письма
Contact Form 7 — самый популярный плагин форм для WordPress, но и самый частый источник жалоб «письма не приходят». Каждый день вижу одно и то же: форма показывает зелёное уведомление «Ваше сообщение отправлено», а в почтовом ящике пусто. Клиент звонит через два дня и говорит «у вас не работает сайт».
CF7 тут ни при чём. Он исправно передаёт данные. Письмо теряется уже после того, как WordPress пытается его доставить.
PHP mail() отправляет письмо напрямую, без аутентификации. Почтовые серверы Gmail, Mail.ru, Яндекса видят анонимную отправку и либо отклоняют письмо, либо кидают в спам. На Beget и Timeweb mail() часто отключена вообще. На Reg.ru — работает, но письма гарантированно уходят в спам, потому что IP-пул shared-хостинга почти всегда в чёрных списках.
Отдельная боль — кодировка. Если на сайте UTF-8, а PHP mail() шлёт в KOI-8R, получатель видит кракозябры. С SMTP этой проблемы нет: почтовый сервер сам определяет кодировку.
Вывод: mail() — анахронизм. SMTP с авторизацией — единственный надёжный способ. И точка.
Пошаговая настройка SMTP для Contact Form 7
1. Установите WP Mail SMTP
Берите бесплатную версию WP Mail SMTP — её достаточно. Не тратьте время на ручную настройку phpmailer_init в functions.php: плагин делает то же самое, но с логами и тестом отправки. При обновлении темы код не потеряется.
Плагины -> Добавить -> "WP Mail SMTP" -> Установить -> Активировать
Другие варианты: Post SMTP (логи подробнее, интерфейс сложнее), Easy WP SMTP (проще некуда — три поля), FluentSMTP (современный, с интеграцией API Яндекс.Почты). Все работают одинаково: перехватывают wp_mail() и отправляют через SMTP.
2. Настройте SMTP-соединение
В настройках WP Mail SMTP выберите «Other SMTP». Заполните:
- SMTP Host — smtp.yandex.ru, smtp.mail.ru или smtp.beget.com
- Encryption — SSL (не TLS, порт 465 работает надёжнее)
- SMTP Port — 465
- Auto TLS — Нет (SSL сам шифрует)
- SMTP Username — полный email (например, robot@ваш-домен.ru)
- SMTP Password — пароль приложения (не пароль от почты!)
Пароль приложения — отдельная тема. Яндекс 360 (бывший Яндекс.Почта для домена) и Mail.ru для бизнеса требуют пароль приложения, его создают в настройках аккаунта. Обычный пароль от почты не подходит, будет ошибка authentication failed.
На Beget можно сделать проще: использовать smtp.beget.com с логином и паролем от хостинга. Письма уходят, но есть нюанс: Beget-релеи иногда задерживают отправку на 10-30 минут в часы пик.
Яндекс 360 — 7000 писем/день, бесплатно для своего домена. Mail.ru — 5000 писем/день. Gmail — 500 писем/день. Для интернет-магазина хватит любого, для рассылок — нет, нужен SendPulse или UniSender.
3. Тест отправки
WP Mail SMTP -> Инструменты -> Тест письма. Введите свой email и нажмите «Отправить». Если письмо пришло — дело сделано. Если нет — плагин покажет точную ошибку.
Самые частые ошибки при тесте:- Could not connect to SMTP host — хостинг блокирует порт 465. Проверьте в панели хостинга: на Beet нужно включить «Исходящие соединения» в настройках тарифа. На Timeweb порт 465 открыт по умолчанию. На Reg.ru бывает заблокирован — пишите в поддержку.
- Authentication failed — неправильный пароль или введён основной пароль от почты, а не пароль приложения.
- Connection timed out — слишком долгий ответ SMTP-сервера. Попробуйте порт 587 (TLS) вместо 465. На некоторых хостингах 587 работает быстрее.
4. SPF и DKIM — чтобы письма не уходили в спам
SMTP решил проблему доставки, но не проблему репутации. Если у домена нет SPF-записи, письма выглядят как подделка. Добавьте TXT-запись в DNS вашего домена:
v=spf1 include:_spf.yandex.net ~all
Для Mail.ru: v=spf1 redirect=_spf.mail.ru. Для Beget: v=spf1 include:_spf.beget.com ~all.
DKIM-подпись — опционально, но с ней письма ещё реже попадают в спам. Яндекс 360 даёт DKIM-ключ в панели управления почтой. Добавляете TXT-запись с ключом и всё. После SPF и DKIM можно добавить DMARC-политику — это защита от подделки вашего домена.
Проверить настройки: mail-tester.com. Отправьте письмо на адрес, который покажет сайт. Оценка 8-10 — всё хорошо. Ниже 6 — что-то не настроено.
5. Проверка Contact Form 7
После настройки SMTP зайдите в CF7 и отправьте тестовое сообщение через форму на сайте. Проверьте:
- Письмо пришло на тот email, который указан в настройках CF7
- Тема письма не пустая и не содержит кракозябр
- Тело письма отображается корректно (не экранированные HTML-теги)
- From Email совпадает с доменом SMTP (если отправляете через Яндекс, From: должен быть @ваш-домен.ru, не @gmail.com)
Если письмо не приходит — проверьте лог WP Mail SMTP. Там написано, на каком этапе обрыв.
Дополнительные причины, почему CF7 не отправляет
Если SMTP настроен, а письма всё равно не приходят — проверьте:
- Конфликт с плагинами кэширования — WP Rocket, LiteSpeed Cache, W3 Total Cache могут блокировать AJAX-отправку CF7. Добавьте страницу с формой в исключения кэша.
- Cloudflare проксирует форму — если включено «Проксировать через Cloudflare» для корня сайта, AJAX-запросы CF7 могут редиректиться на HTTPS с ошибкой. Включите правило Page Rule:
/wp-json/*— DNS only (серое облако). - JS-ошибка на странице — другой плагин или скрипт темы ломает JavaScript CF7. Проверьте консоль браузера (F12) на ошибки при отправке формы.
- Спам-фильтры внутри CF7 — если включена reCAPTCHA или Akismet, они могут блокировать отправку. Отключите временно и проверьте.
Установите плагин Check & Log Email. Он перехватывает все
wp_mail() вызовы и показывает, какое письмо пытался отправить WordPress, кому и с каким содержимым. Если Check & Log Email показывает письмо, а в почтовом ящике пусто — проблема на стороне SMTP или почтового сервера. Если Check & Log Email пуст — CF7 не вызывает wp_mail() вообще, значит конфликт с другим плагином или темой.Что часто упускают
- From Email должен совпадать с доменом SMTP. Настройка From Email в CF7 — не просто формальность. Почтовый сервер Яндекса не пропустит письмо, если отправитель @gmail.com, а SMTP-сервер yandex.ru. RFC жёстко требует совпадения.
- Порт 465 (SSL) надёжнее чем 587 (TLS). На Beget и Timeweb порт 465 стабильнее — меньше проблем с блокировками на уровне хостинга. 587 иногда режется файрволом.
- Cloudflare не должен проксировать почтовый трафик. Для поддомена почты DNS-запись должна быть серой (DNS only), а не оранжевой (Proxied). Если проксировать — Cloudflare будет пытаться обработать SMTP-трафик как HTTP, что сломает отправку.
- На общих хостингах лимиты на отправку. Beget — 500 писем/час, Timeweb — 300 писем/час, Reg.ru — 200 писем/час. Если превысить — хостинг временно блокирует отправку. Решение: настроить очередь через WP SMTP Queue или использовать внешний SMTP-сервис.
Частые вопросы
functions.php занимает 15 минут и легко ломается при обновлении WordPress. Плагин — 2 минуты и логи в комплекте.Не получается настроить?
Проверю сайт, найду причину и исправлю. Обычно такие проблемы решаются за час-два.