Когда форма на сайте отправляется, а письмо не доходит, проблема не всегда в самой форме. Часто запрос уходит, но wp_mail() отправляет через серверный mail(), который хостинг режет, помечает как спам или вообще не принимает. В бизнес-проектах это обычно проявляется так: заявки есть в админке плагина формы, но на почте тишина.
Ниже разберём рабочую схему: как понять, где ломается цепочка, как перевести отправку на SMTP, как проверить результат и что чаще всего мешает доставке.
Диагностика: где именно теряются письма
Сначала важно не лечить вслепую. Если форма использует wp_mail(), письмо может не дойти по трём основным причинам: неверный адрес получателя, проблемы на стороне хостинга, либо плохая репутация домена отправителя. Проверять нужно по порядку.
Что смотреть в первую очередь
- правильный ли адрес указан в настройках формы;
- не подменяется ли
From:на адрес, который не существует на вашем домене; - есть ли в логах плагина формы или почтового плагина сообщение об ошибке;
- отправляются ли письма вообще, если вызвать тестовую отправку из админки;
- не блокирует ли хостинг исходящую почту по
mail().
Если у вас есть доступ к серверным логам или к плагину логирования почты, это лучший способ понять, на каком этапе письмо исчезает. Без этого легко перепутать проблему формы с проблемой доставки.
Что менять: SMTP вместо стандартной отправки
Самый надёжный вариант для WordPress — отправлять письма через SMTP-сервер почтового провайдера. Это не гарантирует идеальную доставку, но резко снижает число случаев, когда письма не уходят из-за ограничений хостинга.
Если форма уже использует wp_mail(), переписывать обработчик обычно не нужно. Достаточно настроить SMTP на уровне WordPress, и все письма, которые идут через wp_mail(), начнут использовать новый транспорт.
Сравнение подходов
| Подход | Когда подходит | Минусы |
|---|---|---|
Стандартный mail() | Тестовые сайты, простые сценарии | Нестабильная доставка, слабая диагностика |
| SMTP через плагин | Почти все рабочие сайты | Нужно хранить доступы к почте |
Кастомный код через phpmailer_init | Если нужен контроль без лишнего плагина | Нужна аккуратная настройка и тестирование |
Пошаговая настройка SMTP в WordPress
Проще всего использовать плагин для SMTP, если у вас нет жёсткого требования обходиться без него. Но даже в этом случае полезно понимать, что именно он меняет: он подключается к отправке писем WordPress и подменяет транспорт на SMTP.
Шаг 1. Выберите рабочий почтовый ящик
Нужен реальный ящик на домене или у почтового провайдера, который разрешает SMTP-доступ. Не используйте случайный адрес noreply@, если он не создан и не обслуживается. Для отправки формы лучше отдельный ящик, например forms@domain.ru.
Шаг 2. Укажите корректные SMTP-параметры
В настройках SMTP обычно нужны:
- SMTP host;
- порт;
- шифрование
tlsилиssl; - логин;
- пароль или пароль приложения;
- адрес отправителя.
Если почтовый сервис поддерживает отдельные пароли приложений, используйте именно их. Обычный пароль от ящика лучше не хранить в админке, если есть альтернатива.
Шаг 3. Зафиксируйте отправителя
Критичная ошибка — отправлять письмо с адреса, который не совпадает с доменом или не подтверждён у почтового сервиса. Например, если SMTP-аккаунт forms@domain.ru, то и From: лучше ставить такой же, а не адрес посетителя формы.
Для формы это обычно выглядит так: письмо приходит на ваш рабочий ящик, а в поле Reply-To ставится email клиента. Так вы не ломаете SPF/DKIM и при этом можете ответить на заявку.
Пример кода: принудительно задать отправителя для писем WordPress
Если нужно без лишних плагинов задать единый адрес отправителя для всех писем сайта, можно использовать фильтры WordPress. Этот вариант полезен, когда форма уже работает через wp_mail(), но письма уходят с неподходящим From.
<?php
add_filter( 'wp_mail_from', function( $from_email ) {
return 'forms@domain.ru';
} );
add_filter( 'wp_mail_from_name', function( $from_name ) {
return 'Сайт компании';
} );
Этот код не включает SMTP сам по себе. Он только приводит отправителя к предсказуемому виду. Если транспорт всё ещё mail(), этого может быть недостаточно для доставки, но уже помогает убрать часть проблем с заголовками.
Пример кода: отправка формы через wp_mail с Reply-To
Если вы пишете собственную обработку формы, важно не подставлять email посетителя в From. Правильнее отправлять письмо от имени сайта и добавить Reply-To.
<?php
$name = sanitize_text_field( $_POST['name'] ?? '' );
$email = sanitize_email( $_POST['email'] ?? '' );
$message = sanitize_textarea_field( $_POST['message'] ?? '' );
$to = 'forms@domain.ru';
$subject = 'Новая заявка с сайта';
$body = "Имя: {$name}\nEmail: {$email}\n\nСообщение:\n{$message}";
$headers = array(
'Content-Type: text/plain; charset=UTF-8',
'From: Сайт компании <forms@domain.ru>',
);
if ( is_email( $email ) ) {
$headers[] = 'Reply-To: ' . $name . ' <' . $email . '>';
}
wp_mail( $to, $subject, $body, $headers );
Здесь важны две вещи: sanitize_email() и Reply-To. Первая защищает от мусора в поле email, вторая позволяет отвечать на заявку, не ломая доставку.
Проверка результата после внедрения
После настройки не ограничивайтесь тестовой отправкой из админки плагина. Проверьте всю цепочку: форма, WordPress, SMTP, входящая почта.
- отправьте тестовое письмо из настроек SMTP;
- отправьте реальную заявку через форму на сайте;
- проверьте, что письмо пришло в основной ящик и не попало в спам;
- посмотрите, совпадает ли адрес отправителя с тем, который вы задали;
- ответьте на письмо через
Reply-Toи убедитесь, что ответ уходит на email клиента.
Если есть логирование SMTP-плагина, откройте последние записи. Там обычно видно, дошёл ли запрос до сервера, принял ли его SMTP-хост и не вернул ли ошибку авторизации.
Мини-чек-лист перед запуском в продакшн
- указан реальный ящик отправителя;
- SMTP-логин и пароль проверены;
Fromне подставляет адрес посетителя;Reply-Toдобавлен только после валидации email;- тестовая заявка пришла на рабочую почту;
- письмо не попадает в спам.
Частые ошибки и как их исправить
Письмо уходит, но не приходит
Чаще всего причина в том, что домен отправителя не настроен для почты: нет SPF/DKIM, либо адрес From не совпадает с реальным ящиком. Исправление простое: используйте подтверждённый адрес и проверьте настройки домена у почтового провайдера.
SMTP авторизация не проходит
Проверьте порт и тип шифрования. Для 587 обычно нужен tls, для 465 — ssl. Ещё одна частая причина — нужен пароль приложения, а не основной пароль от почты.
Форма отправляет письмо с адреса пользователя
Так делать не стоит. Многие SMTP-сервисы и антиспам-системы режут такие письма. Пользовательский email должен быть только в Reply-To, а не в From.
Письма дублируются
Иногда это не SMTP, а сама форма: один и тот же обработчик вызывается дважды, либо включены два канала уведомлений. Проверьте настройки плагина формы и убедитесь, что письмо не отправляется и через встроенную интеграцию, и через кастомный код одновременно.
Безопасность и производительность
SMTP-настройки — это не место для экспериментов. Не храните пароль от почты в открытом виде в репозитории, если сайт разворачивается через Git. Для таких случаев лучше использовать переменные окружения или хотя бы ограничить доступ к файлу конфигурации.
Если на сайте много форм и уведомлений, не отправляйте тяжёлые письма синхронно в момент сабмита, если это можно отложить. Для простых заявок это обычно не проблема, но при массовых уведомлениях лучше не перегружать запрос пользователя лишней работой.
Если вам нужно ещё и уменьшить шум в админке, можно сочетать SMTP с чисткой дублей и лишних служебных элементов через инструменты вроде Clearfy Pro, но только если это действительно закрывает вашу задачу и не мешает отладке.
Главный критерий, что всё настроено правильно, — не просто факт отправки тестового письма, а стабильная доставка реальных заявок с понятным отправителем, рабочим Reply-To и без ручных правок после каждой отправки.