Когда контактная форма говорит «Спасибо», но почта не приходит
Контактная форма может сломаться без видимых ошибок: посетитель получает дружелюбное подтверждение, а Вы — ничего. Почему это происходит и как вовремя заметить.
Представьте небольшую физиотерапевтическую практику. На её сайте есть контактная форма, и она работает — или по крайней мере так кажется. Посетители заполняют её, нажимают «Отправить» и видят дружелюбное «Спасибо, мы скоро свяжемся с Вами». Чего никто не видит: сообщения уже некоторое время не доходят во входящие практики. Нет ошибки, нет возврата письма в чьём-либо ящике, нигде нет красного сигнала. Форма отказывает молча.
Почему никто не замечает
Страница «Спасибо» формы обычно означает лишь одно: сайт передал сообщение дальше. Примет ли его почтовый сервер, поместит в спам или отклонит по пути — происходит позже, вне поля зрения формы. Например, функция PHP mail() сообщает об успехе, как только локальная система приняла сообщение к доставке, а не когда оно кому-то дошло. Посетитель получает подтверждение и идёт дальше. Владелец тем временем видит пустые входящие и считает месяц просто тихим. Само по себе уменьшение обращений редко тревожит: праздники, погода, экономика — всегда находится объяснение правдоподобнее, чем «форма сломалась».
- День 0Ночью выполняется обычное обновление плагина. Сайт выглядит как прежде.
- День 1Приходит последнее сообщение. Никто не знает, что оно последнее.
- Дни 2–13Посетители продолжают отправлять форму и видеть «Спасибо». Во входящие ничего не поступает.
- День 14Кто-то звонит и слегка раздражённо спрашивает, почему на его обращение никто так и не ответил.
- День 15Причину находят за час. Сообщения за две недели потеряны — если только форма не сохраняла копию.
Обычные причины
- Изменились пароль SMTP или почтовый провайдер. Форма продолжает входить со старыми данными, а почтовый сервер отказывает — для посетителя молча.
- PHP mail() без аутентификации. Веб-сервер отправляет почту напрямую, без входа на надлежащий почтовый сервер. Многие принимающие серверы считают такую почту подозрительной: она попадает в спам или сразу отклоняется.
- SPF, DKIM и DMARC не согласуются. Многие формы помещают адрес посетителя в поле From. Тогда письмо утверждает, что пришло, скажем, с адреса gmail.com, но отправлено Вашим веб-сервером — именно это DMARC и призван останавливать.
- Обновление плагина или смена темы ломает форму или её CAPTCHA. Изменённый шаблон убирает поле, скрипт перестаёт загружаться или виджет CAPTCHA появляется без скрипта — и каждая отправка не проходит валидацию.
- Принимающий почтовый ящик переполнен. Сервер отказывает новым сообщениям, а возврат приходит на адрес, которого никто не читает.
- Баннер cookie блокирует скрипт формы. Если инструмент согласия относит CAPTCHA или скрипт формы к «маркетингу», отказавшиеся от cookie посетители могут получить форму, которую нельзя отправить, либо отправки которой отклоняются из-за отсутствующего токена.
- Истёкший сертификат TLS или домен. Посетители видят предупреждение браузера и уходят, либо к почтовому серверу больше нельзя безопасно подключиться. Если истекает домен принимающего ящика, почта на него просто прекращается.
- Слой кеширования выдаёт устаревшие страницы. Полностраничный кеш может отдать форму с истёкшим токеном безопасности (nonce или CSRF). Сервер отклоняет отправку, а в зависимости от настройки посетитель не видит ясной ошибки.
Ловушка адреса From
Третья причина заслуживает внимания, поскольку во многих формах заложена по умолчанию. DMARC проверяет совпадение домена видимого адреса From с доменом, подтверждённым SPF или DKIM. Если форма отправляет письмо «от» адреса посетителя, Ваш сервер не уполномочен отправлять для этого домена, и проверка не проходит. В зависимости от политики DMARC домена посетителя и Вашего почтового провайдера письмо попадает в спам или отклоняется. Исправление простое: отправляйте с адреса собственного домена, а адрес посетителя ставьте в Reply-To. Нажатие «Ответить» по-прежнему адресует ответ посетителю.
- From: адрес посетителя
- Без Reply-To
- PHP mail() прямо с веб-сервера
- Нет SPF, DKIM или DMARC для домена отправителя
- Сообщение существует только как письмо
- From: адрес на Вашем домене, например form@yourdomain
- Reply-To: адрес посетителя
- SMTP с аутентификацией или сервис отправки
- SPF, DKIM и DMARC настроены и согласованы
- Копия также хранится в базе данных
Что делать
- 1Регулярно отправляйте тестовое сообщение через собственную форму — не реже раза в месяц и всегда после обновлений, смены темы или настроек почты. Ясно помечайте его как тест, чтобы никто не отвечал.
- 2Знайте обычный ритм. Если форма обычно приносит несколько сообщений в неделю, две недели тишины — повод проверить, а не просто тихий месяц.
- 3Отправляйте через SMTP с аутентификацией — через почтового провайдера или специальный сервис отправки — вместо надежды на PHP mail().
- 4Используйте свой домен в From, а адрес посетителя в Reply-To. Затем настройте SPF, DKIM и DMARC этого домена, чтобы письма проходили проверки.
- 5Храните копию каждой отправки в базе данных. Многие плагины форм предлагают это, иногда как дополнение. При сбое почты обращения сохраняются.
- 6Проверяйте форму после каждого обновления плагина, включая CAPTCHA, а также при отказе от cookie.
Такие проверки легко забыть, поэтому стоит их автоматизировать. С аккаунтом и подтверждённым доменом formexposed может отправить ясно обозначенную тестовую отправку и проверить её фактическое получение (проверка доставки, только с явным включением). Он также обнаруживает тишину — форма, обычно получающая сообщения, внезапно не получает ничего — и проверяет SPF, DKIM и DMARC писем уведомлений, а также сроки сертификата TLS и домена. Оповещение приходит только при изменении.
Если нужен лишь первый взгляд: бесплатная проверка на formexposed.com не требует аккаунта и ничего не отправляет. Среди прочего она показывает наличие неработающей CAPTCHA — виджета без скрипта, публичного тестового ключа, ошибок браузера — одного из незаметных способов прекращения работы формы. Реальное получение сообщений подтверждается только настоящим тестовым письмом, поэтому отправьте его сегодня.