Zagubiona biała koperta na podłodze w przejściu między szafami serwerowymi — mail z formularza, który nie dotarłЗображення згенеровано ШІ

WordPress не надсилає листи з форми. Де шукати причину

WordPress

Клієнт заповнює форму, натискає «Надіслати», бачить зелене повідомлення «Ваше повідомлення надіслано. Дякуємо!». І все. До вас не приходить нічого — ні у вхідні, ні в спам. Ви дізнаєтеся про це через два тижні, випадково, коли хтось телефонує з претензією, що «писав, а ніхто не відповів».

Це одна з найдорожчих аварій, які можуть статися із сайтом компанії, бо нічого не виглядає зламаним. Сайт працює, форма працює, повідомлення зелене. Просто запити зникають. Нижче — чому так відбувається і як за 10–15 хвилин з’ясувати, на якому етапі обривається лист.

Чому форма пише «надіслано», якщо нічого не дійшло

Бо повідомлення означає не те, що здається. Contact Form 7 (як і будь-який інший плагін форм) не надсилає листів. Він передає повідомлення функції wp_mail(), а та віддає його серверу. Зелене повідомлення з’являється в момент, коли сервер прийняв завдання, — а не тоді, коли лист опинився у вашій скриньці.

Шлях заявки має чотири етапи, а форма бачить лише перший:

  1. форма збирає дані й перевіряє їх (валідація, антиспам),
  2. wp_mail() формує лист і віддає його серверу,
  3. поштовий сервер намагається його доставити,
  4. сервер одержувача вирішує: вхідні, спам або кошик.

Лист може загубитися на будь-якому з них. Звітує лише перший. Тому «надіслано» — це не доказ доставки, а лише доказ того, що форма виконала свою частину роботи.

Найчастіша причина: відправник, якого не існує

За замовчуванням WordPress надсилає пошту як [email protected]. Такої скриньки зазвичай немає — ніхто її не створював, ніхто в неї не заглядає, на неї неможливо відповісти.

Для Gmail чи Outlook це тривожний сигнал. Сервер одержувача перевіряє, чи справжній відправник, бо саме так поводиться спам: вказує адресу, яка не прийме ні відповіді, ні повідомлення про недоставку. Наслідок буває двоякий — лист потрапляє в спам або тихо відхиляється, без жодної інформації для відправника.

І тут типова пастка: запис SPF може бути налаштований бездоганно, а пошта однаково не доходить. SPF каже лише те, що цей сервер має право надсилати листи від імені цього домену. Він нічого не каже про те, чи скринька відправника взагалі існує. Це дві різні речі, і одна не замінює іншої.

Правильне налаштування виглядає так:

  • Від (From): справжня скринька у вашому домені, напр. [email protected].
  • Відповідати на (Reply-To): адреса клієнта з форми — завдяки цьому ви натискаєте «Відповісти» і пишете прямо йому.
  • Кому (To): скринька, яку ви справді читаєте.

Ніколи навпаки. Якщо вказати відправником адресу клієнта, ваш сервер почне надсилати листи «від імені» gmail.com — а політика DMARC Gmail такі листи відхиляє. Це найшвидший спосіб остаточно зламати форму.

Як з’ясувати, де обривається лист

Замість того щоб гадати, звузьте коло пошуку. П’ять кроків, кожен на кілька хвилин:

  1. Надішліть тест із панелі. Кожен SMTP-плагін має інструмент «Email Test». Якщо тест доходить, а заявки з форми — ні, пошта працює, а проблема у формі. Якщо не доходить навіть тест, проблема у відправленні.
  2. Перевірте відправника. У налаштуваннях форми, на вкладці з листом. Якщо бачите там wordpress@, дуже ймовірно, що причина саме в цьому.
  3. Загляньте в журнал помилок SMTP-плагіна. Невдалі відправлення залишають там слід із текстом помилки сервера — зазвичай він прямо каже, що саме відхилено.
  4. Протестуйте на двох різних скриньках. Gmail і ваша корпоративна пошта можуть зовсім по-різному поводитися з тим самим листом.
  5. Перевірте власні фільтри. Правило річної давності, яке переносить листи «із сайту» в підпапку, працює тихо й безвідмовно.

Антиспам, який тихо відсікає заявки

Друга група причин не має нічого спільного з поштою: заявка взагалі не доходить до етапу відправлення, бо її визнано спамом.

Механізми на кшталт Cloudflare Turnstile чи reCAPTCHA додають до форми приховане поле з токеном. Без токена плагін вважає відправлення ботом і блокує його. Проблема в тому, що токен може не з’явитися з причин, які жодним чином не залежать від користувача, — наприклад, коли на одній сторінці стоять дві форми, що перемикаються вкладками, і одна з них прихована. Віджет не рендериться в прихованому контейнері й заодно ламає другу форму.

Ззовні це виглядає так: клієнт бачить повідомлення «щонайменше одне поле містить помилку», хоча заповнив усе. Або — що гірше — форма пише, що надіслала, а заявка зникає. Симптом буває випадковим, бо іноді віджет встигає завантажитися, а іноді ні.

Як це розпізнати: відкрийте сторінку з формою і перевірте, чи поле антиспаму взагалі відображається. Якщо на місці віджета порожньо, а форма все одно просить пройти перевірку, — причину знайдено.

SMTP, тобто відправлення через справжню скриньку

Стандартне відправлення через серверну функцію mail() — найслабша ланка: немає автентифікації, немає логів, немає зворотного зв’язку. SMTP змінює ситуацію докорінно — WordPress входить у вашу скриньку й надсилає листи через неї, так само як поштова програма.

Що потрібно підготувати:

  • адреса сервера — зазвичай це назва сервера хостингу, а не mail.twojadomena.pl. Це часта помилка: запис MX може вказувати на одну назву, а відправлення працювати через іншу. Правильну ви знайдете в панелі хостингу,
  • порт і шифрування — 465 із SSL або 587 із TLS,
  • логін — повна адреса e-mail, а не лише ім’я користувача,
  • пароль до цієї скриньки,
  • адреса відправника — та сама, з якої ви надсилаєте, плюс опція її примусового встановлення («Force From»), щоб плагіни не підміняли її на свій розсуд.

Після налаштування надішліть тест із панелі і тільки потім — одну справжню заявку з форми. Два окремі тести, бо вони перевіряють дві різні речі.

Страховка: зберігайте заявки в базі даних

Незалежно від того, чи працює пошта, заявки мають зберігатися на сайті. Плагіни на кшталт Contact Form CFDB7 роблять це автоматично: кожен надісланий запит потрапляє в базу, і ви бачите його в панелі.

Це забирає чверть години, але змінює характер аварії. Замість «ми втратили невідому кількість запитів і не знаємо, від кого» маєте «листи не доходили тиждень, ось список восьми людей, яким треба передзвонити». Якщо завдяки цьому плагіну ви повернете хоча б одного клієнта, він окупиться багаторазово.

Короткий чекліст

  • відправник — це наявна скринька у вашому домені, а не wordpress@,
  • адреса клієнта стоїть у Reply-To, а не в полі відправника,
  • відправлення йде через SMTP, а не через mail(),
  • поле антиспаму справді відображається,
  • заявки зберігаються в базі даних,
  • раз на квартал ви надсилаєте собі тестову заявку з форми.

Останній пункт найдешевший і найчастіше його пропускають. Форма — єдиний елемент сайту, який ламається без жодних видимих симптомів, тож варто час від часу її перевіряти.


Маєте форму, щодо якої не впевнені, чи доходять заявки? Напишіть мені — перевірка всього шляху від форми до скриньки займає один вечір. Постійний нагляд за такими речами входить в обслуговування сайту.