Назад | Перейти на главную страницу

Функция PHP mail () работает в CLI, но не в Apache

я использую мсмтп в качестве ретранслятора и пытается отправить электронное письмо с помощью функции mail (). Он отлично работает в CLI, но ничего не делает в Apache. Мои конфигурации PHP для cli и apache идентичны, никаких ошибок в журналах нет, и у меня действительно нет идей.

Есть идеи, чем это могло быть вызвано?

Я нашел решение этой проблемы. я использую мсмтп, который является прокси-сервером SMTP и работает аналогично sendmail, поэтому при попытке отправить почту команда msmtp вызывается из php с синтаксисом, аналогичным sendmail.

Теперь команда msmtp будет запускаться тем же пользователем, под которым работает apache2. В моем случае www-data.

Существует файл конфигурации для msmtp (в моем случае /etc/.msmtp_php), который должен быть доступен для чтения пользователем www-data.

Причина, по которой CLI работал, а Apache PHP - нет, заключается в том, что я запускал CLI под root, у которого были правильные разрешения для файла, но apache2 работает под www-data, у которого не было этих разрешений.

Итак, решение: Chown файл /etc/.msmtp_php в www-data: www-data и chmod тот же файл в 0600, иначе msmtp будет жаловаться на потерю разрешений.

Прежде всего: Проверьте, действительно ли вы используете 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):

В дополнительные_параметры параметр отключен в safe_mode и mail() функция отобразит предупреждающее сообщение и вернет FALSE при использовании.

Один из способов отправки почты - использовать ее в функции exec ().

exec('usr/bin/mail <parameter>', $output); //$output for debugging

Проверьте вывод для ответа, но все же вам нужно разрешить свои настройки для использования php mail() функция.