Надёжность доставки форм на сайте: настройка SMTP, доставляемость, повторные попытки и логи
1. Почему PHP mail() не заслуживает доверия
Многие владельцы сайтов думают: нажал «Отправить», увидел страницу подтверждения — и всё в порядке. На самом деле стандартный wp_mail() в WordPress использует встроенную функцию PHP mail(): без аутентификации отправителя, без TLS-шифрования, без отдельного пула IP. Такие письма с большой вероятностью попадут в спам в Gmail и Outlook.
Проблема не в плагине, а на уровне протокола. mail() передаёт письмо локальному MTA (агенту передачи почты), а тот подключается к MX-серверу получателя напрямую через порт 25. Но большинство облачных хостингов (Aliyun, Tencent Cloud, AWS) по умолчанию блокируют исходящий порт 25 для борьбы со спамом. В итоге форма показывает успех, а письмо вообще не уходит.
Контринтуитивный вывод:Чем «проще» способ отправки, тем больше теряете заказов. Без SMTP-плагина вы как будто экономите полчаса на настройке, но на деле можете терять от 20% до 40% заявок в месяц — и даже не узнаете об этом, потому что на странице отправки горит зелёная галочка. О том, как спроектировать поля формы, чтобы совместить конверсию и фильтрацию, читайте в Проектирование полей формы заявки и конверсия.
| Способ отправки | Средняя доставляемость | Сложность настройки | Для чего подходит |
|---|---|---|---|
| PHP mail() (по умолчанию) | от 40% до 60% | Без настройки | Не подходит для рабочего сайта |
| Локальный SMTP хостинга | 60–75% | Низкая | Для тестовой среды |
| Сторонний SMTP-ретранслятор (бесплатный тариф) | 85%–92% | Средний | До 5000 писем в месяц |
| Специализированный сервис транзакционной почты | Более 95% | Средний и выше | Свыше 5000 писем в месяц |
2. Настройка SMTP: выбор плагина и параметры
Для настройки SMTP в WordPress не нужно править код — достаточно установить плагин. Основных вариантов три: WP Mail SMTP (самый популярный, понятный интерфейс), FluentSMTP (открытый и бесплатный, поддерживает переключение между провайдерами при сбое), Post SMTP (самые мощные логи). Выберите один — не ставьте два сразу, они конфликтуют.
Семь ключевых параметров: SMTP-хост, порт (587 или 465, не 25), шифрование (TLS или SSL), имя пользователя, пароль или API-ключ, адрес отправителя и имя отправителя. Адрес отправителя должен совпадать с вашим доменом, например noreply@yourdomain.com. Отправлять с Gmail или QQ-почты нельзя: записи SPF не совпадут, и письма сразу уйдут в спам.
Пример: вы используете SendGrid как SMTP-релей. В поле хоста укажите smtp.sendgrid.net, порт 587, шифрование TLS, имя пользователя всегда apikey, а в поле пароля вставьте API-ключ, сгенерированный в панели SendGrid. В адресе отправителя укажите noreply@yourdomain.com, затем добавьте три записи в панели DNS — об этом в следующем разделе.
| Параметр | Правильное значение | Частая ошибка |
|---|---|---|
| SMTP-хост | smtp.sendgrid.net / smtp.mailgun.org | localhost или IP локальной машины |
| Порт | 587 (TLS) или 465 (SSL) | 25 — его блокируют хостинг-провайдеры |
| Шифрование | TLS (587) или SSL (465) | «Без шифрования» — данные идут открытым текстом |
| Имя пользователя | В SendGrid всегда apikey, в Mailgun — postmaster@mg.xxx | Свой адрес электронной почты |
| Отправитель | noreply@yourdomain.com | Личная почта Gmail или QQ |
| Имя отправителя | Английское название компании и отдел | Пустое поле или кракозябры вместо кириллицы |
3. Аутентификация домена: три записи SPF, DKIM и DMARC
Настроить SMTP-плагин — только первый шаг. Почему почтовый сервер получателя должен верить, что письмо отправили именно вы? Ответ — три записи DNS: SPF (какие серверы вправе отправлять письма от вашего имени), DKIM (цифровая подпись письма от подмены) и DMARC (что делать с письмами, не прошедшими проверку). Без любой из них доставляемость не вырастет.
SPF — это запись TXT примерно такого вида: v=spf1 include:sendgrid.net ~all. Она означает: «отправлять письма от моего домена вправе только серверы SendGrid, все остальные получают soft fail». DKIM — запись CNAME: SMTP-провайдер публикует открытый ключ, а получатель проверяет с его помощью подпись. DMARC — тоже запись TXT, начинается с v=DMARC1. Сначала поставьте p=none и понаблюдайте неделю, затем переключитесь на p=quarantine.
Как проверить: введите свой домен в MXToolbox или в Checkup из Google Admin Toolbox. Проверка пройдена, только если все три пункта зелёные. Если SPF показывает «not found», а DKIM — «no key», добавьте записи в панели DNS, подождите 15 минут и проверьте снова. Как совместить соответствие требованиям к домену с GDPR, читайте в Комплаенс-основа для выхода на зарубежные рынки.
| Тип записи | Что даёт | Минимальная настройка | Инструмент проверки |
|---|---|---|---|
| SPF (TXT) | Какие серверы вправе отправлять письма | v=spf1 include:провайдер ~all | Проверка SPF в MXToolbox |
| DKIM (CNAME/TXT) | Цифровая подпись письма от подмены | Запись selector от провайдера | Проверка ключа DKIM Core |
| DMARC (TXT) | Политика и сбор отчётов | v=DMARC1; p=none; rua=почта | Google Admin Toolbox |
| MTA-STS (TXT) | Принудительное шифрование TLS | v=STSv1; id=20260921 | MXToolbox MTA-STS |
4. Метрики доставляемости и повторные попытки при сбоях
Настроить SMTP и DNS — это только начало, дальше нужно следить за метриками. Три ключевых показателя: доля доставки во входящие (процент писем, попавших в inbox, а не в спам), hard bounce rate (адрес не существует, домен не существует — постоянная ошибка) и soft bounce rate (ящик переполнен, сервер занят — временная ошибка). Здоровые значения: доставка ≥ 95%, hard bounce ≤ 2%, soft bounce ≤ 5%.
Повторные попытки при сбое нельзя оставлять на настройки плагина по умолчанию. Плагины форм WordPress по умолчанию «отправил и забыл», и при сбое страница даже не покажет ошибку. Правильный подход — добавить слой повторных попыток: после первой неудачи ждём 1 минуту, после второй — 5 минут, после третьей — 15 минут, после четвёртой — 60 минут. Если все четыре попытки провалились, срабатывает оповещение (на резервную почту или в корпоративный мессенджер), а заявка сохраняется в базе для ручной досылки.
Пример из практики: клиент отправляет форму в Германии в 23:00 (у вас в Пекине 6 утра), а SendGrid как раз проводит обслуживание, и SMTP возвращает временную ошибку. Без повторных попыток заявка потерялась бы. Благодаря экспоненциальной задержке четвёртая попытка через 60 минут проходит успешно, и клиент, проснувшись утром, получает ваше автоответное письмо. Как определить скорость первого ответа, см.SLA первого ответа на запрос и конверсия.
| Показатель | Норма | Порог оповещения | Действие |
|---|---|---|---|
| Доля доставки во входящие | ≥ 95% | ниже 90% | Проверить логи SPF/DKIM |
| Hard bounce rate | ≤ 2% | Выше 5% | Очистить список недействительных адресов |
| Soft bounce rate | ≤ 5% | Выше 10% | Проверить статус SMTP-провайдера |
| Успешность повторных попыток | ≥ 80% | Ниже 50% | Переключиться на резервный SMTP-канал |
| Среднесуточное число отправок | Базовая линия ±20% | Падение более чем на 50% | Проверить, нет ли ошибок JS на фронтенде |
V. Логирование и еженедельная самопроверка
Без логов не будет основы для диагностики. Плагин Post SMTP ведёт таблицу логов писем, где фиксируются from, to, subject, время отправки, код ответа SMTP и число повторных попыток. У FluentSMTP есть аналогичная функция. Логи нужно хранить минимум 30 дней, затем автоматически удалять, чтобы не раздувать базу данных.
Раз в неделю проводите самопроверку: возьмите 5 последних отправленных писем и посмотрите, относятся ли коды ответа SMTP к серии 250 (250 — успех, 4xx — временная ошибка, 5xx — постоянная ошибка). Заодно отправьте тестовое письмо себе на Gmail, нажмите «Показать оригинал» и проверьте, все ли три пункта SPF=pass, DKIM=pass, DMARC=pass зелёные. Если хотя бы один fail — сразу проверяйте DNS.
Ещё один момент, который легко упустить: сам плагин форм тоже должен вести логи. Если после отправки пользователем JS выдал ошибку и запрос вообще не ушёл, в логах SMTP записи не будет. Поэтому нужно на уровне сервера добавить мониторинг Nginx access log и считать количество POST-запросов к /wp-admin/admin-ajax.php (или к эндпоинту REST API). Если в какой-то день оно резко падает более чем на 50%, значит, проблема на фронтенде. Как настроить мониторинг сайта, см.Мониторинг сайта и оповещения.
| Уровень логирования | Что фиксируем | Срок хранения | Способ просмотра |
|---|---|---|---|
| Лог отправки форм | Значения полей, IP, UA, метка времени | 90 дней | Панель плагина / таблица в базе данных |
| Лог отправки SMTP | Коды ответа, число повторов, текст ошибки | 30 дней | Страница логов SMTP-плагина |
| Логи доставки ESP | Открытия, клики, жалобы, отказы | Навсегда в панели провайдера | Панель SendGrid/Mailgun |
| Логи доступа Nginx | Число POST-запросов, распределение кодов ответа | 14 дней | grep access.log на сервере |
FAQ: частые вопросы
Обязательно ли ставить SMTP-плагин для форм WordPress, нельзя ли обойтись PHP mail()?
Нужно ли настраивать все три записи — SPF, DKIM и DMARC, или хватит только SPF?
Какой SMTP-порт выбрать — 25, 587 или 465?
Как проверить доставляемость и где посмотреть, попало письмо во входящие или в спам?
Письмо после отправки формы не пришло — как быстрее всего найти причину?
Хватит ли бесплатного лимита SMTP и когда пора платить?
В заключение
Доставка писем с форм — самый незаметный источник потерь на сайте с самостоятельной продажей. Большинство владельцев следят за трафиком и конверсией, но ни разу не проверяли, доходит ли письмо до клиента после “успешной отправки”. Один раз настроить SMTP и три записи DNS — два часа работы, а потери заказов в месяц сокращаются больше чем вдвое.
Три шага к результату. Первый: на этой неделе поставьте SMTP-плагин и подключите бесплатный тариф SendGrid или Mailgun. Второй: добавьте в панели DNS записи SPF, DKIM и DMARC и проверьте через MXToolbox, чтобы все были зелёными. Третий: настройте 4 повтора с экспоненциальной задержкой и раз в неделю проверяйте статус доставки у 5 случайных писем. После этих трёх дел у надёжности доставки форм появится минимальная гарантия.
Запомните одну фразу: зелёная галочка на форме означает лишь “сервер получил”, а не “клиент увидел” — между ними три преграды: SMTP, DNS и папка спама.
