- Что делать, если не отправляется почта из PHP
- Убеждаемся, что PHP точно пытается отправить почту
- Проверяем, что письмо может отправить администратор из консоли (без всяких там PHP)
- Анализируем лог postfix
- Отучаем SELinux блокировать почту, отправляемую из PHP
- Запрещаем виртуальному хосту отправлять почту
- 2 комментария на запись «Что делать, если не отправляется почта из PHP»:
- Почему PHP функция mail() не работает на сервере?
- php функция mail() некорректно работает
- 2 ответа 2
- Всё ещё ищете ответ? Посмотрите другие вопросы с метками php email или задайте свой вопрос.
- Похожие
- Подписаться на ленту
- Настройки функции mail в PHP. Почему не работает mail в PHP?
- Лирическое отступление
- Настройка mail в PHP
- Особенности использования mail в PHP
- Настройки функции mail в PHP. Почему не работает mail в PHP?
- Лирическое отступление
- Настройка mail в PHP
- Особенности использования mail в PHP
Что делать, если не отправляется почта из PHP
Тривиальные ситуации, когда имеется непорядок со значением sendmail_path в конфигурации php, решаются легко. Проверьте через phpinfo(); , чтобы у вас было задано значение типа /usr/sbin/sendmail -t -i в конфиге, и чтобы за /usr/sbin/sendmail действительно скрывался установленный и работающий MTA. Но сегодня пришлось побеждать менее типовую проблему: из php-скрипта почта как бы отправлялась, но где-то дальше сообщения терялись.
Убеждаемся, что PHP точно пытается отправить почту
Для начала напомню, что начиная с php 5.3 можно включить лог для всей исходящей почты, отсылаемой через функцию mail() из php. Достаточно в конфигурацию php.ini добавить такую настройку:
При этом важно, чтобы пользователь, от которого работает php, имел доступ к файлу /var/log/phpmail.log на запись. Рекомендую для комфортной отладки создать файл и позволить всем в него записывать, примерно так:
Если у вас php работает как модуль Apache, то перезапустите последний.
Записи в логе будут примерно такие:
Если версия php у вас поновее чем 5.3, то в лог добавятся дата и время (что, конечно, очень полезно). Например, PHP версии 5.5.32 точно добавляет дату и время (но с какой в точности версии это началось — я не знаю). Всё-таки главное в этом логе — абсолютный адрес скрипта и номер строки, с которой вызывалась функция.
В общем, следующий тривиальный скрипт должен обязательно оставить след в логе:
У меня была как раз такая ситуация: php исправно делал свою работу и записи в логе почты оставлял (ничего при этом не оставляя в логе ошибок).
Проверяем, что письмо может отправить администратор из консоли (без всяких там PHP)
Одновременно с этим почта у меня прекрасно отправлялась из серверной консоли. Проверить можно так:
Если вдруг на вашем сервере нет утилиты mail , то установите пакет mailx вот так:
Анализируем лог postfix
Пришлось заглядывать в лог почтовика. Он пишется в файл /var/log/maillog (актуально для CentOS).
И вот там-то нашлись неприятные записи такого характера:
Даже минимальный опыт общения с линуксом подсказывает, что тут дело либо в несоответствии прав/владельцев, либо в какой-то дефолтной защите, типа фаерволла или… SELinux. В данном случае «виноват» последний.
Отучаем SELinux блокировать почту, отправляемую из PHP
Проверить можно такой командой:
Если вывод будет httpd_can_sendmail —> off , то значит вашу почту блокирует SELinux. Чтобы его от этого отучить на постоянной основе выполните команду:
И после этого ждите несколько секунд, пока снова не увидите приглашение командной строки. Без ключа -P блокировка снимется только до перезагрузки.
Кстати, пусть вас не смущает, что в параметрах SELinux упомянут httpd. Даже если у вас Apache отсутствует в принципе, а используется, например, связка nginx и php-fpm, то почта всё равно может блокироваться с аналогичными симптомами. Решается проблема точно также и для php-fpm (меняем ту же переменную).
Запрещаем виртуальному хосту отправлять почту
Иногда бывает такая ситуация, что надо наоборот запретить отправлять почту какому-то сайту. Например, если ясно, что на нём вирус, но на лечение вируса нужно время.
Тогда действуем от противного — в настройки виртуального хоста проблемного сайта добавляем параметр:
И перезапускаем Apache, чтобы изменения вступили в силу. Либо вы можете включить упомянутый выше параметр SELinux, однако, учтите, что это не поможет, если в вашей системе SELinux отсутствует или перманентно отключен.
2 комментария на запись «Что делать, если не отправляется почта из PHP»:
> Если версия php у вас поновее чем 5.3, то в лог добавятся дата и время (что, конечно, очень полезно).
У меня php 5.4, но дата и время в лог не добавляется! Есть решение?
Leonid, а у меня PHP 5.5.32 пишет в лог даты. Запись выглядит примерно так:
[05-Apr-2016 15:22:28 Europe/Moscow] mail() on [/var/www/xxx/public/sites/. . MailSystem.class.php:47]: To: xxx@xxx — Headers: MIME-Version: 1.0 Content-Type: text/html; charset=UTF-8; Content-Transfer-Encoding: 8Bit X-Mailer: Drupal Return-Path: xxx@xxx Sender: xxx@xxx From: xxx@xxx Bcc: xxx@xxx
C какой точно версии даты начали писаться — не скажу. Пока только известно, что PHP 5.3.3 их не пишет. И ваш 5.4 — тоже. А 5.5.32 уже точно пишет.
Если вы не хотите обновлять php, то, пожалуй, единственное решение в том, чтоб написать свой скрипт-прокладку, который потом указать в sendmail_path. То есть php будет на этот скрипт передавать письма, скрипт будет их желаемым вами образом логировать, а потом уже отдавать в настоящий sendmail для реальной отправки.
Самый простой вариант скрипта-прокладки выглядит примерно так:
sendmail_path = «tee -a /var/log/phpmail.log | /usr/sbin/sendmail -t -i» 🙂
Ремарка для новичков: это надо прописать в /etc/php.ini , предварительно создав файл /var/log/phpmail.log с правами на запись.
Комментарии к этой записи в RSS.
Источник
Почему PHP функция mail() не работает на сервере?
Все время выдает ошибку. Вроде бы сервер нормально настроили, все пакеты поставили, пути проверили, а не работает.
Практически такой же сервер нормально работает с mail().
Что проверить? На что обратить внимание? Что обновить?
- Вопрос задан более трёх лет назад
- 28134 просмотра
Проверьте работает ли вообще функция mail на сервере:
echo «Testing» | mail -s «Test» test@example.com
Проверьте установлена ли почтовая служба: sendmail, postfix или другая.
Проверьте запущена ли почтовая служба.
Для sendmail/postfix проверьте настройки в php.ini:
Проверьте в php.ini не внесена ли функция mail в список запрещённых функций:
disable_functions
Вот что там отключено: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority
Есть что-то способное повлиять на мою проблему?
pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,
pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,
pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,
pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority
Источник
php функция mail() некорректно работает
Пытаюсь наладить обратную связь на сайте. Отсылаю, введенные пользователями, данные на свою почту. Вот стандартный пример отправки имейла, который я беру за основу:
Проблема в том, что если в качестве имейла в секции From указан имейл типа . @mail.ru , то письма не доходят. В принципе, эту проблему можно обойти, но все же, для общего кругозора, хотелось бы знать, почему так происходит.
2 ответа 2
Письма, в которых, в качестве обратных адресов указываются почтовые ящики большинства общедоступных сервисов, скорее всего не дойдут, если отправлялись они без использования их собственных почтовых серверов. Для того, чтобы письма в небольших количествах гарантированно доходили до адресата, используйте SMTP, либо почту на собственном домене (для этого не забудьте указать соответствующую SPF-запись).
функция mail использует sendmail или другие и шлет с уже настроенных ящиков (через sendmail ). Если адрес отправки фактический не совпадает с полем FROM то скорее всего это спам и большинство систем или не принимают такое или пихают сразу в спам.
В php лучше использовать библиотеку PHPMailer или уметь самому нормально настраивать sendmail в linux
Всё ещё ищете ответ? Посмотрите другие вопросы с метками php email или задайте свой вопрос.
Похожие
Подписаться на ленту
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.10.15.40479
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Источник
Настройки функции mail в PHP. Почему не работает mail в PHP?
Какой бы интернет-проект на PHP вы не сделали, на нём должна быть форма обратной связи, что особенно актуально для проектов коммерческого направления. А значит, вам не обойтись без функции mail . Что же, давайте посмотрим, как использовать эту функцию для отправки сообщений.
Лирическое отступление
Прежде чем двигаться дальше, давайте немного вспомним теорию. Во-первых, чтобы отправлять письма нам потребуется SMTP-сервер . Но это не проблема, т. к. он есть практически на всех современных платных хостингах. Во-вторых, для приёма писем нам понадобится POP-сервер . В-третьих, следует понимать, что сам по себе PHP не отправляет сообщение, а лишь передаёт команды приложению sendmail — именно оно занимается отправкой, следовательно, его нужно иметь (если используете Денвер, то данное приложение уже встроено). В-четвёртых, все сообщения помещаются в директорию под названием «tmp/!sendmail».
Настройка mail в PHP
Настройка функции mail в PHP выполняется в конфигурационном файле php.ini . В этом файле нужно прописать путь к лог-файлам, а также задать значения порта.
Mail принимает 5 аргументов, три из которых являются обязательными, вот они:
1) адрес отправителя;
2) текст сообщения;
Если вы являетесь веб-мастером и используете Денвер, то информация, которая будет вами отправлена, сохранится на виртуальном диске Z в папке «tmp!sendmail».
Особенности использования mail в PHP
Работа функции mail в PHP зависит от ряда нюансов, включая вид операционной системы, выполненные настройки и параметры. Вот некоторые особенности:
— во время отправки письма заголовок Form задаётся через необязательный параметр «additional_headers». Если его нет, нередко возникает ошибка при отправлении;
— заголовки разделяйте символами перевода на новую строку и перевода каретки (\r\n);
— следите, чтобы длина строки не превышала 70 знаков, для регулировки тоже используйте (\r\n).
Источник
Настройки функции mail в PHP. Почему не работает mail в PHP?
Какой бы интернет-проект на PHP вы не сделали, на нём должна быть форма обратной связи, что особенно актуально для проектов коммерческого направления. А значит, вам не обойтись без функции mail . Что же, давайте посмотрим, как использовать эту функцию для отправки сообщений.
Лирическое отступление
Прежде чем двигаться дальше, давайте немного вспомним теорию. Во-первых, чтобы отправлять письма нам потребуется SMTP-сервер . Но это не проблема, т. к. он есть практически на всех современных платных хостингах. Во-вторых, для приёма писем нам понадобится POP-сервер . В-третьих, следует понимать, что сам по себе PHP не отправляет сообщение, а лишь передаёт команды приложению sendmail — именно оно занимается отправкой, следовательно, его нужно иметь (если используете Денвер, то данное приложение уже встроено). В-четвёртых, все сообщения помещаются в директорию под названием «tmp/!sendmail».
Настройка mail в PHP
Настройка функции mail в PHP выполняется в конфигурационном файле php.ini . В этом файле нужно прописать путь к лог-файлам, а также задать значения порта.
Mail принимает 5 аргументов, три из которых являются обязательными, вот они:
1) адрес отправителя;
2) текст сообщения;
Если вы являетесь веб-мастером и используете Денвер, то информация, которая будет вами отправлена, сохранится на виртуальном диске Z в папке «tmp!sendmail».
Особенности использования mail в PHP
Работа функции mail в PHP зависит от ряда нюансов, включая вид операционной системы, выполненные настройки и параметры. Вот некоторые особенности:
— во время отправки письма заголовок Form задаётся через необязательный параметр «additional_headers». Если его нет, нередко возникает ошибка при отправлении;
— заголовки разделяйте символами перевода на новую строку и перевода каретки (\r\n);
— следите, чтобы длина строки не превышала 70 знаков, для регулировки тоже используйте (\r\n).
Источник