Функция 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когда используется.