Inbox Placement Testby Live Direct Marketing

Choose your language

RU and EN are available. Other languages will be enabled after localization.

Sign in
Хостинг и почта4 мин чтения

Timeweb и PHP mail(): письмо отправлено, но оказалось в спаме

Как проверить отправку PHP mail на Timeweb: технического отправителя, адрес возвратов, DKIM и отличие передачи в очередь от доставки.

Форма на сайте сообщает «Письмо отправлено», PHP возвращает true, а менеджер находит уведомление в Спаме. В такой ситуации нужно разделить три события: приложение сформировало письмо, почтовый сервер принял его для передачи, получатель разместил копию в ящике. Зелёное сообщение формы обычно относится только к первым этапам.

Для Timeweb это особенно важно при старых скриптах, в которых вызов mail() написан прямо в обработчике формы. Такой код может работать годами без явно заданного транспорта. После изменения домена, шаблона или окружения видимое поведение остаётся прежним, а технический отправитель отличается от ожидаемого.

Timeweb и PHP mail(): письмо отправлено, но оказалось в спаме — схема из трёх шагов
Учебная схема: задача, проверка и следующий шаг. Это не результат выполненного теста.

Что подтверждает возврат true

Документация PHP поясняет: успешный результат mail() означает принятие сообщения для передачи, но не гарантирует его получение адресатом. Поэтому сохраняйте результат функции как событие приложения, а папку определяйте по полученной копии. Эти сведения дополняют друг друга, но не заменяют.

В инструкции Timeweb по PHP mail описана передача через Exim виртуального хостинга. Там же показан технический отправитель вида user@server.timeweb.ru для отправки без дополнительных настроек. Это не адрес вашего отдела продаж. У конкретного рабочего скрипта настройки могут отличаться: проверьте их, а не приписывайте ему поведение самого короткого примера из документации.

Два адреса, которые легко перепутать

Заголовок From показывает отправителя получателю. Адрес SMTP-конверта используется для возвратов и проверки SPF. Изменение строки From в HTML или в параметрах CMS не обязательно изменяет конверт. В документации Timeweb для mail() отдельно рассмотрен параметр -f, задающий технического отправителя.

Не собирайте этот параметр из произвольного ввода посетителя. Используйте фиксированный разрешённый адрес, а введённую клиентом почту помещайте в Reply-To после проверки формата. Обработчик должен формировать корректные заголовки, не позволяя пользовательской строке добавлять новые поля или получателей. Для доработки используйте возможности поддерживаемой почтовой библиотеки.

Почему создание ящика не подписывает любой скрипт

Созданный в панели ящик и PHP-процесс сайта — разные точки отправки. Включённая для почтового домена функция не доказывает, что локальный вызов mail() использовал её. Посмотрите, есть ли DKIM-Signature в исходнике проблемного письма, какой домен стоит в d= и какой селектор указан в s=.

Timeweb публикует отдельную инструкцию о DKIM для отправки с сервера. Она рассматривает библиотеку или модуль CMS, который подписывает сообщение. Это другой подход, чем SMTP-авторизация готовым ящиком. Выбор зависит от приложения: поддерживаемый SMTP-транспорт часто проще сопровождать, но сам по себе не даёт обещания попадания во Входящие.

Проверьте весь обработчик формы

Создайте безопасную заявку с тестовым адресатом, сохраните время выполнения и идентификатор сообщения. Не ограничивайтесь отдельным файлом test.php: он проверит наличие функции, но может не использовать заголовки, вложения и кодировку настоящей формы. Также проверьте, не отправляет ли обработчик второе письмо клиенту другим способом.

Для исходного замера направьте рабочий шаблон на контрольные адреса из теста размещения Check. Если приложение допускает только одного адресата, выполните предусмотренную им безопасную отправку каждой контрольной копии и сохраните различия. Не заменяйте рабочую отправку пересылкой из личного ящика: при пересылке появится другой маршрут.

Исправьте установленный дефект

Если подтверждено отсутствие управляемого адреса возвратов, начните с него. Если нет подписи, выберите и настройте подписывающий транспорт. Если произошла ошибка вызова или почтовая функция недоступна, работайте с этой ошибкой до исследования папок: письмо могло не выйти с сервера вообще. Нельзя объяснять отсутствующее сообщение «строгим фильтром» без подтверждения передачи.

После изменения повторите то же событие приложения. Сравните адреса, аутентификацию и фактические папки доступных копий. Смена маршрута может изменить несколько технических свойств одновременно; в отчёте называйте это проверкой нового маршрута, а не доказанным влиянием одного заголовка. Текст и ссылки при таком сравнении оставьте прежними.

Как оформить результат для разработчика

Полезная запись содержит имя обработчика, тип сообщения, From, технический домен возвратов, Message-ID и время. Рядом укажите подтверждённую папку либо отсутствие данных. Различие между принятием, оценкой анализатора и папкой помогает не закрыть задачу только потому, что функция вновь вернула true.

Условия наблюдения описаны в методологии Check. Результат контрольного ящика относится к этой копии. Он позволяет проверить, что исправление реально дошло до отправляемого сообщения, но не раскрывает внутреннюю причину решения фильтра и не предсказывает папку каждого будущего клиента.

Видео-памятка: что проверить

Видео без звука, 24 секунды. Текстовая версия краткого плана:

  1. true от mail() не подтверждает доставку.
  2. Проверьте From и технический адрес возвратов отдельно.
  3. Тест должен проходить через тот же PHP-обработчик.
AB
Об авторе
Artem Berezin
B2B Deliverability Specialist

B2B deliverability specialist with 5+ years of hands-on outreach experience. Built campaigns reaching 90,000+ inboxes across 20+ countries — and fixed the deliverability problems that came with that scale.

Проверьте, в какую папку попало письмо

Отправьте письмо на адреса теста и сравните наблюдаемое размещение по доступным ящикам. Результат относится к этой проверке и не гарантирует доставку всем получателям. Бесплатно, без регистрации.

Запустить тест →

Наблюдение в течение 24 часов · Данные теста хранятся 7 дней · Без регистрации