
PHP mail() не работает: Диагностика и решения
Функция PHP mail() — базовая, но часто проблемная. Письма не доходят или попадают в спам. Разберем ключевые причины и их устранение, актуальное для российского веб-пространства.
1. Настройки сервера (php.ini)
Большинство проблем начинаются здесь.
- Для Linux/Unix-серверов:
sendmail_path: Вphp.iniукажите верный путь кsendmail(например,/usr/sbin/sendmail -t -i). Неверный путь или отсутствиеsendmailблокирует отправку.- Права доступа: PHP-процесс должен иметь права на запуск
sendmail.
- Для Windows-серверов (XAMPP/WAMP):
- SMTP-сервер: В
php.iniнастройтеSMTP = ваш.smtp.сервер.ruиsmtp_port = 587(или 25, 465). Возможно,sendmail_from = ваш@email.ru. - Без аутентификации: Встроенная
mail()не поддерживает SMTP-аутентификацию, что делает её неработоспособной с большинством современных SMTP.
- SMTP-сервер: В
- Фаервол: Исходящие порты 25, 465, 587 могут быть заблокированы, предотвращая соединение с почтовыми серверами.
2. Хостинг и репутация
Ограничения провайдеров и репутация сервера влияют критически.
- Лимиты хостинга: Виртуальный хостинг ограничивает число писем в час/сутки.
- Отключение
mail(): Некоторые хостинги отключают функцию полностью. - IP в черном списке: IP-адрес сервера мог попасть в спам-листы (проверить на 2IP.ru, MXToolbox). Это блокирует доставку.
- DNS-записи (SPF, DKIM, DMARC): Эти записи (настраиваются в панели домена) критичны для подтверждения подлинности отправителя. Отсутствие или ошибка ведет к попаданию в спам.
3. Ошибки в PHP-коде
Проверьте корректность использования функции.
- Параметры: Убедитесь, что
mail($to, $subject, $message, $headers)переданы верно. - Заголовки письма:
From:Укажите реальный адрес отправителя (например,From: Имя <no-reply@ваш-домен.ru>).Content-Type:Для HTML:Content-Type: text/html; charset=UTF-8. Для текста:text/plain.- Кодировка: Всегда UTF-8, особенно для кириллицы.
- Переносы строк: Используйте CRLF (
\r\n) в заголовках и теле письма.
- Обработка ошибок:
mail()возвращаетfalseпри неудаче. Всегда проверяйте это и логируйте:$sent = mail($to, $subject, $message, $headers); if (!$sent) { error_log("Ошибка отправки письма на " . $to); }
4. Спам-фильтры
Даже отправленные письма могут быть отклонены.
- Содержание: Избегайте «спамных» слов, излишних заглавных букв, сомнительных ссылок.
- Репутация: Отправляйте с доменов с хорошей репутацией.
5. Отладка
Используйте логи для диагностики:
- Логи почтового сервера: Linux:
/var/log/maillog,/var/log/mail.log. - Логи PHP-ошибок: Путь в
php.ini.
Создайте простой тестовый скрипт, чтобы локализовать проблему.
6. Альтернативы mail()
Для надежности и функциональности:
- PHPMailer / Symfony Mailer: Мощные библиотеки с поддержкой SMTP-аутентификации, SSL/TLS, HTML, вложений.
- Сторонние SMTP-сервисы: SendGrid, Mailgun, или SMTP от Яндекса/Mail.ru для доменов. Обеспечивают высокую доставляемость и статистику.
Заключение
Проблемы с mail() требуют системного подхода. От настроек сервера до кода и спам-фильтров — каждый шаг важен. Если стандартной функции недостаточно, переходите на специализированные библиотеки или сервисы для стабильной работы почты в вашем проекте.








