Функция 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получает поиск.)

  1. Вы можете получитьphp.iniместоположение с помощью<?php phpinfo(); ?>в том же каталоге.
  2. Вы можете напрямую получить текущий 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 когда используется.

Другие вопросы по тегам