Перейти к содержанию

Не приходит почта с сайта на WordPress: четыре проверки, чтобы найти причину

Форма на сайте говорит «Сообщение отправлено», а письма нет. Или не приходят уведомления о комментариях, или ссылка для сброса пароля. Первое желание — ставить плагины и что-то перенастраивать. Но почти всегда причину можно найти за десять минут, просто пройдя по цепочке, по которой идёт письмо: сайт → почтовый сервер → ваш ящик.

Ниже — четыре проверки по порядку, от самой простой. Где сломалось, там и чиним.

Коротко: проверьте папку «Спам» в веб-интерфейсе почты; отправьте пробное письмо командой WP-CLI или плагином; включите запись ошибок отправки в журнал; посмотрите в заголовках дошедшего письма SPF и DKIM. Если сайт вообще не может отправить письмо — настройте отправку через SMTP: как это сделать через Яндекс, Mail.ru или Gmail.

1. Папка «Спам»

Папка Спам в почтеСамая частая причина лежит на поверхности: почта считает письма сайта спамом. Смотреть нужно не в почтовой программе на компьютере, а в веб-интерфейсе — mail.yandex.ru, e.mail.ru, gmail.com или где у вас почта на домене. Программа может не показывать серверную папку «Спам».

Нашлось там — переходите сразу к пункту 4: письма доходят, но почта им не доверяет.

2. Отправляет ли сайт письмо вообще

Отправим пробное письмо. Если есть доступ к серверу по SSH и установлен WP-CLI, это одна команда из папки сайта:

wp eval 'var_dump( wp_mail( "вы@example.ru", "Проверка", "Письмо с сайта" ) );'
Если сайт на Бегете, WP-CLI ставить не нужно — он там уже есть. Заходите по SSH (на Бегете он включается галочкой «Включить SSH» в разделе «Управление FTP-аккаунтами») и запускайте эту команду прямо из папки сайта. Что WP-CLI там работает, я проверил на своём сайте.

bool(true) — WordPress передал письмо дальше. Это ещё не значит, что оно дошло, но сайт свою часть сделал. bool(false) — отправить не удалось, переходите к пункту 3.

Без SSH то же самое делает плагин: в Check & Log Email и WP Mail SMTP есть страница «отправить тестовое письмо». Поставили, проверили, удалили.

3. Почему не отправилось

WordPress знает причину отказа, но никуда её не пишет. Попросим записывать. Создайте файл wp-content/mu-plugins/mail-log.php (папки mu-plugins может не быть — создайте и её):

<?php
add_action( 'wp_mail_failed', function ( $error ) {
	error_log( 'wp_mail: ' . $error->get_error_message() );
} );

Плагины из mu-plugins включаются сами, в списке плагинов их отдельная вкладка «Обязательные». Сообщение попадёт в журнал ошибок PHP — где он лежит, подскажет хостинг. Проще включить журнал WordPress: в wp-config.php перед строкой «Это всё, дальше не редактируем» (That’s all, stop editing!):

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );

Теперь ошибки пишутся в wp-content/debug.log, а посетители их не видят. Отправьте письмо ещё раз и загляните в журнал. Что там бывает:

  • Could not instantiate mail function. — функция PHP mail() на хостинге не работает: нет почтового сервера или он не принимает письма. Лечится отправкой через SMTP.
  • Call to undefined function PHPMailer\PHPMailer\mail(), а на сайте «Произошла критическая ошибка» (There has been a critical error on this website) — хостинг отключил mail() совсем. Многие хостеры так делают, чтобы с их серверов не рассылали спам. На PHP 8 отключённая функция не возвращает ошибку, а роняет страницу, поэтому форма обратной связи вместо «не отправлено» показывает критическую ошибку. Лечится тоже SMTP.
  • SMTP Error: Could not connect to SMTP host. и Could not authenticate. — отправка через SMTP уже настроена, но не работает. Разбор этих ошибок — в посте про SMTP.

После проверки верните WP_DEBUG в false: журнал растёт и может лежать в открытом доступе.

4. Письмо ушло, но не дошло или упало в спам

По умолчанию WordPress подписывает письма адресом wordpress@ваш-домен и отправляет их с сервера хостинга. Почтовые службы проверяют, имеет ли этот сервер право писать от имени вашего домена. Для этого у домена в DNS есть записи:

  • SPF — список серверов, которым разрешено отправлять почту домена;
  • DKIM — цифровая подпись письма;
  • DMARC — что делать с письмом, которое не прошло проверки.

Как посмотреть: откройте дошедшее письмо (хотя бы из спама) и найдите его заголовки — в Gmail «Показать оригинал», в Яндексе «Свойства письма». Ищите строки spf=pass и dkim=pass. Если там fail, softfail или none — Gmail и Яндекс таким письмам не доверяют, и с каждым годом всё строже.

Что делать: либо добавить сервер хостинга в SPF и включить DKIM (у многих хостингов это галочка в панели), либо отправлять письма через настоящий почтовый ящик по SMTP — тогда SPF и DKIM уже настроены почтовой службой.

Как я проверял в 2017 году

В первой версии поста я предлагал два способа проверить mail(): залить в корень сайта файл mail.php с формой «отправить письмо на адрес» или вписать вызов mail() в footer.php темы через редактор в админке. Сейчас я так не делаю и вам не советую. Забытый mail.php позволяет кому угодно слать письма с вашего сайта, правка footer.php из админки с одной опечаткой роняет сайт, а у современных блочных тем footer.php нет вовсе. Команда WP-CLI и запись в журнал делают то же самое без этих рисков.

Написать комментарий

Адрес почты не публикуется. Обязательные поля отмечены звёздочкой.