Почему mail php не работает

Содержание
  1. Что делать, если не отправляется почта из PHP
  2. Убеждаемся, что PHP точно пытается отправить почту
  3. Проверяем, что письмо может отправить администратор из консоли (без всяких там PHP)
  4. Анализируем лог postfix
  5. Отучаем SELinux блокировать почту, отправляемую из PHP
  6. Запрещаем виртуальному хосту отправлять почту
  7. 2 комментария на запись «Что делать, если не отправляется почта из PHP»:
  8. Почему PHP функция mail() не работает на сервере?
  9. php функция mail() некорректно работает
  10. 2 ответа 2
  11. Всё ещё ищете ответ? Посмотрите другие вопросы с метками php email или задайте свой вопрос.
  12. Похожие
  13. Подписаться на ленту
  14. Настройки функции mail в PHP. Почему не работает mail в PHP?
  15. Лирическое отступление
  16. Настройка mail в PHP
  17. Особенности использования mail в PHP
  18. Настройки функции mail в PHP. Почему не работает mail в PHP?
  19. Лирическое отступление
  20. Настройка mail в PHP
  21. Особенности использования 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 на запись. Рекомендую для комфортной отладки создать файл и позволить всем в него записывать, примерно так:

Читайте также:  Как правильно настроить тох1

Если у вас 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).

Источник

Оцените статью