Не работает отправка почты через функцию mail() при отправке формы
Во-первых вы плохо прочитали мануал для функции mail(). У вас $headers это строка с текстом, а в функцию нужно передать строку additional_headers . Смотрите хотя бы пример в мануале. (см. пример в конце)
Во-вторых использование return в глобальной области видимости прекращает выполнение скрипта. Документация. Так что вы никогда не увидите ваше уведомление.
В третьих отправка письма это большой и сложный вопрос. Если вы используете функцию mail(), то нужно учитывать, что php не отправляет письма, а передает отправку вашему почтовому серверу. Скорее всего это POSTFIX. Нужно смотреть настройки и логи.
И в четвертых письмо могло быть отправлено, но не доставлено. Опять же смотрите в логи и в спаме в почтовом ящике. Оно могло попасть в черные списки или спам листы. Не забудьте так же про DKIM и SPF
Лучше отправлять почту через SMTP сервер. Например Yandex или Google. Для php есть библиотека Swiftmailer
PS. Вот пример рабочего кода:
$charset = 'utf-8'; // Кодировка письма $to = ""; // Получатель $subject = ""; // Тема письма $text = ""; // Контент письма $from = ""; // Отправитель $fromName = ""; // Имя отправителя // Вот что такое заголовки $headers = "MIME-Version: 1.0\n"; $headers .= "From: =?$charset?B?".base64_encode($fromName)."?= \n"; $headers .= "Content-type: text/html; charset=$charset\n"; $headers .= "Content-Transfer-Encoding: base64\n"; return mail("=?$charset?B?".base64_encode($to)."?= ", "=?$charset?B?".base64_encode($subject)."?=", chunk_split(base64_encode($text)), $headers, "-f$from");
Что делать если функция mail не отправляет письма в php?
Вот несколько рекомендаций по решению данной проблемы:
- В первую очередь нужно проверить настройки вашего сервера
- Проверить что вы используете правильный адрес почты для отправки писем
- Проверить настройки безопасности и правила доступа для вашего сервера. Если ваш сервер использует SMTP-аутентификацию, то вам нужно будет проверить правильность введенных данных
- Если Вы пользуетесь услугами обычного хостинга, то данная функция должна поставляться хостером. Вам нужно задать вопрос в техподдержку
- Проверить логи:
- Найти файл mail в папке /var/log, в нем содержатся ошибки
- Также можно посмотреть файл error.log, обычно лежит в /var/log/apache
- И проверить в php.ini параметр sendmail_path
Не работает php mail() на хостинге
Иногда бывают такие хостинги, просто ужасные, на которых элементарная функции php mail() либо не работает, либо ее надо настраивать. Разберемся подробнее.
Чтобы проверить отправку почту используйте код:
if(mail(«lait@mail.ru», «My Subject», «Line 1\nLine 2\nLine 3»)) echo «message send»;
else echo «message not send»;
Если напишет message not send, то функция отправки сообщений не работает.
Решение:
Ищем на хостинге php.ini (может находиться в папке php-bin) : там пишем или исправляем 1-ю строку:
sendmail_path = «/usr/sbin/sendmail -t -i -f ваша-почта@mail.ru»
session.save_path = «/var/www/profnav/data/bin-tmp»
В этом случае все письма с любых форм должны идти только на эту почту. Чтобы формы не были привязаны только к этой почте, пишем в php,ini: sendmail_path = «/usr/sbin/sendmail -t -i»
А в формах отправки дописывает email:
if(mail(«lait@mail.ru», «My Subject», «Line 1\nLine 2\nLine 3», «-f lait@mail.ru»)) echo «message send»;
else echo «message not send»;
Читайте также
blogprogram.ru | 2014-07-28 | Не работает php mail() на хостинге | Иногда бывают такие хостинги, просто ужасные, на которых элементарная функции php mail() либо не работает, либо ее надо настраивать. Разберемся подроб |
Почему PHP функция mail() не работает на сервере?
Все время выдает ошибку. Вроде бы сервер нормально настроили, все пакеты поставили, пути проверили, а не работает.
Практически такой же сервер нормально работает с mail().
Что проверить? На что обратить внимание? Что обновить?
- Вопрос задан более трёх лет назад
- 34089 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 4
Архитектор распределённых систем управления
Проверьте работает ли вообще функция mail на сервере:
echo «Testing» | mail -s «Test» test@example.com
Проверьте установлена ли почтовая служба: sendmail, postfix или другая.
Проверьте запущена ли почтовая служба.
Для sendmail/postfix проверьте настройки в php.ini:
; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). ; http://php.net/sendmail-path sendmail_path = "/usr/sbin/sendmail -t -i"
Проверьте в php.ini не внесена ли функция mail в список запрещённых функций:
disable_functions
Ответ написан более трёх лет назад
Нравится 8 1 комментарий
Огромное спасибо вам!
Я почти месяц искл решение проблемы и вот оно!
sendmail_path = «/usr/sbin/sendmail -t -i» не был включён
Веб программист
Проверь, включена ли функция.
Ответ написан более трёх лет назад
Нравится 1 2 комментария
Volgarastraport @Volgarastraport Автор вопроса
Это как? Где включатель?)
Volgarastraport: выше ответ. можешь создать php файл с содержимым и посмотреть в выводе все описанные дерективы.

Laravel/Yii/2 AngularJs PHP RESTful API
а локальный SMTP server имеется?
если в *NIX можно с консоли проверить
echo “Test Mail” | mail -s “Hello world” you@domain.com