- Неотправляется почта php функцией mail на виртуальной машине битрикс
- Что делать, если не отправляется почта из PHP
- Убеждаемся, что PHP точно пытается отправить почту
- Проверяем, что письмо может отправить администратор из консоли (без всяких там PHP)
- Анализируем лог postfix
- Отучаем SELinux блокировать почту, отправляемую из PHP
- Запрещаем виртуальному хосту отправлять почту
- 2 комментария на запись «Что делать, если не отправляется почта из PHP»:
- Функция PHP mail не работает на сервере Centos
- 7 ответов
- Проблема отправки почты через mail() в php
- Почему PHP функция mail() не работает на сервере?
Неотправляется почта php функцией mail на виртуальной машине битрикс
Проверка отправки почты из консоли линукс echo «Testing» | mail -s «Test» johndoe@example.comс Ошибка -bash: mail: command not found
Если php почта не отправляется, устанавливаем комманду yum install mailx
Проверяем дальше echo «Testing» | mail -s «Test» johndoe@example.comс Ошибка /usr/sbin/sendmail: No such file or directory «/root/dead.letter» 9/216 . . . message not sent.
Устанавливаем sendmail yum install sendmail sendmail-cf -y chkconfig —level 345 sendmail on service sendmail start
Проверяем дальше echo «Testing» | mail -s «Test» johndoe@example.comс Ошибка пропала, письма приходят
Но вот не задача. PHP Функция mail() не работает Вопрос решился письмом в службу поддержки firstVDS сервера У меня на сервере VDS установлено веб окрежение битрикс Необходимо было в файле /etc/php.d/bitrixenv.ini сменить параметр sendmail_path ;sendmail_path = msmtp -t -i sendmail_path = /usr/sbin/sendmail -t -i и все заработало!
PS: для работы curl потребуется еще одна настройка копируем данные из /etc/php.d/20-curl.ini.disabled в 20-curl.ini service httpd restart
Работаю © 2012 — 2021 год
Все права защищены
Навыки и умения Знание PHP5, MySQL, JS, HTML5, CSS3. Работа с технологиями XML, AJAX, GIT, SOAP Большой опыт взаимодействия с сервером. Работа с 1C-BITRIX FRIMEWORK, BITRIX24
Источник
Что делать, если не отправляется почта из 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 не работает на сервере Centos
Я использую сервер centos и должен отправить письмо пользователю, поэтому я скопировал свой рабочий код с одного сервера и использовал его здесь, но он не отправляет письма.
Он всегда печатает 1. Тот же код работает нормально в другом проекте. Пожалуйста, направьте меня, что я могу сделать, чтобы включить его здесь? Любая помощь будет высоко ценится!
7 ответов
после установки sendmail* и выполнения следующих команд:
у меня все еще была та же проблема. Я проверил свой /var/log/maillog и увидел ошибку:
после дополнительных поисков я изменил /etc/hosts from:
и теперь функция почты теперь работает нормально.
Я знаю, что на это был дан ответ, но у меня была аналогичная проблема. В случае, если кто-то еще.
/var/log / maillog показал мне проблему с разрешением Postfix.
отслеживание ошибки я нашел решение для политики SELinux на CentOS (я использую версию 6).
короткий ответ: setsebool httpd_can_sendmail 1
Вы можете использовать -P, чтобы сделать изменение постоянным; мне просто нужно для сброса пароля электронной почты, поэтому не нужно для моего случая.
EDIT: я бы прокомментировал, но у меня еще недостаточно репутации.
у меня была та же проблема. У меня есть сервер разработки дома и сервер prod на внешнем сервере, а входящие письма идут на другой сервер. PHP: s mail() прекрасно работает в серверном доме, но не дома.
я немного протестировал и заставил его работать дома так же, как и в server house. Разница между методами в server house и home заключается в конфигурации sendmail. Серверный дом мне нужно было только установить sendmail, и это было хорошо, но дома мне также пришлось установить sendmail-cf и использовать его для добавления адреса сервера исходящей почты.
предположим, у вас есть Centos, Apache и PHP на домашнем сервере, и вы хотите отправлять электронные письма с помощью функции PHP:s mail ().
1) Установите имя хоста на домашнем сервере в двух местах: /etc/sysconfig /network и/proc/sys/kernel / hostname таким образом:
Источник
Проблема отправки почты через mail() в php
Появилась на продакшен сервере вот такая ошибка
Severity: Warning
Message: mail(): Could not execute mail delivery program ‘/usr/sbin/sendmail -t -i’
Filename: libraries/Email.php
Line Number: 1545
framework code igniter
Код в этом файле такой:
if ( ! mail($this->_recipients, $this->_subject, $this->_finalbody, $this->_header_str, «-f «.$this->clean_email($this->_headers[‘From’]))) < return FALSE; >else
Чтобы отловить ошибку пробовал ловить exception его нет
try < тут код с майл; >catch (Exception $e) < print $e->getMessage(); > return true;
Вывел echo все переменные на продакшене и на тестовом, вроде тут тоже все одинаковое.
Код одинаковый с тестовым сервером, на тестовом такое же окружение в такой же ос(amazon linux аналог centos) все работает и шлет. Изменений в момент когда все сломалось в окружение я не вносил.
Файл /usr/sbin/sendmail присутствует, имеет нормальные права и нормально запускается.
Функция mail используется в других частях кода и там все в порядке.
В php.ini всего две строчку для настройки mail
sendmail_path = /usr/sbin/sendmail -t -i
mail.add_x_header = On
Пробовал убирать -t -i для теста, чтобы проверить используется ли этот php.ini, после этого ошибка изменилась на не могу вызвать sendmail но без параметров -t -i
Скрипт запускаю в консоли, memory_limit 1500MB, памяти свободной куча, проца тоже, файл подкачки пустой.
конфиг php.ini не менялся несколько месяцев, конфиг sendmail также не менялся несколько месяцев.
Обновил для пущей уверенности php до 5.3.25 и sendmail до 8.14.4
Ума не приложу в какую сторону копнуть ещё или как получить больше информации об ошибке.
Источник
Почему PHP функция mail() не работает на сервере?
Все время выдает ошибку. Вроде бы сервер нормально настроили, все пакеты поставили, пути проверили, а не работает.
Практически такой же сервер нормально работает с mail().
Что проверить? На что обратить внимание? Что обновить?
- Вопрос задан более трёх лет назад
- 28132 просмотра
Проверьте работает ли вообще функция 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
Источник