Функция PHP mail() работает в CLI, но не в Apache
Я использую msmtp в качестве реле и пытаюсь отправить электронное письмо с помощью функции mail(). Он отлично работает в CLI, но ничего не делает в Apache. Мои PHP-конфиги для cli и apache идентичны, ни в одном из журналов нет ошибок, и у меня действительно нет идей.
Есть идеи, чем это может быть вызвано?
3 ответа
Я нашел решение этой проблемы. Я использую msmtp, который является SMTP-прокси и работает аналогично sendmail, поэтому при попытке отправить почту вызывается команда msmtp из php с синтаксисом, аналогичным sendmail.
Теперь команда msmtp будет запущена тем же пользователем, под которым работает apache2. В моем случае www-data.
Существует файл конфигурации для msmtp (в моем случае /etc/.msmtp_php), который должен быть доступен для чтения пользователю www-data.
Причина, по которой CLI работал, а Apache PHP не работал, состоит в том, что я запускал CLI под root, у которого были правильные права доступа к файлу, но apache2 работает под www-данными, у которых не было этих разрешений.
Таким образом, решение заключается в следующем: преобразуйте файл /etc/.msmtp_php в www-data:www-data и chmod в тот же файл в 0600, в противном случае msmtp будет жаловаться на потерянные разрешения.
Один из способов отправить почту, используя ее в функции exec().
exec('usr/bin/mail <parameter>', $output); //$output for debugging
Проверьте вывод на ответ, но все равно вам нужно разрешить свои настройки для использования php mail()
функция.
Прежде всего: проверьте, действительно ли вы используете php.ini
файл вы верите.
Apache может, например, использовать разные php.ini
местоположение для каждого пользователя, если mod_suphp
включен. С помощью suPHP местоположение устанавливается с suPHP_ConfigPath
директива вmods-enabled/suphp.conf
и по умолчанию это скомпилированный путь по умолчанию в PHP, даже если он отличаетсяPHPIniDir
установлен для глобальной конфигурации. ( PHP: файл конфигурации дает больше информации о порядке, гдеphp.ini
получает поиск.)
- Вы можете получить
php.ini
местоположение с помощью<?php phpinfo(); ?>
в том же каталоге. Вы можете напрямую получить текущий SMTP-сервер, используемый
mail()
функция сini_get()
:<?php echo ini_get('SMTP') . ":" . ini_get('smtp_port'); ?>
Если SMTP-сервер является тем, который должен быть, mail()
функция должна вернуться TRUE
если почта была успешно принята для доставки и в противном случае FALSE
, В обоих случаях, если функция смогла подключиться к SMTP-серверу, дополнительную информацию о подключении можно найти в файле журнала SMTP-сервера.
Если mail()
возвращается FALSE
без подключения к SMTP, проверьте, есть ли у вас safe_mode и mail()
набор дополнительных параметров Из журнала изменений (версия PHP 4.2.3):
Параметр Additional_parameters отключен в safe_mode и
mail()
функция выставит предупреждающее сообщение и вернетFALSE
когда используется.