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

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

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

1
задан 3 April 2017 в 14:52
3 ответа

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

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

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

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

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

2
ответ дан 3 December 2019 в 17:35

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

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

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

1
ответ дан 3 December 2019 в 17:35

Прежде всего: Проверьте, действительно ли вы используете файл php.ini , который вы считаете.

Apache может, например, использовать другой php .ini расположение для каждого пользователя, если mod_suphp включен. При использовании suPHP расположение устанавливается с помощью директивы suPHP_ConfigPath в mods-enabled / suphp.conf , и по умолчанию используется путь по умолчанию, скомпилированный PHP, даже если задано другое PHPIniDir для глобальной конфигурации. ( PHP: файл конфигурации дает дополнительную информацию о порядке поиска php.ini .)

  1. Вы можете получить расположение php.ini , используя в том же каталоге.
  2. Вы можете напрямую получить текущий SMTP-сервер, используемый функцией mail () , с помощью ini_get () :

Если SMTP-сервер является тем, которым он должен быть, функция mail () должна вернуть ИСТИНА , если почта была успешно принята для доставки, иначе ЛОЖЬ . В обоих случаях, если функция смогла подключиться к SMTP-серверу, дополнительную информацию о подключении можно найти в файле журнала SMTP-сервера .

Если mail () возвращает FALSE без подключения к SMTP, проверьте, включены ли safe_mode и mail () дополнительные_параметры установлены . Из журнала изменений (версия PHP 4.2.3):

Параметр additional_parameters отключен в safe_mode и Функция mail () выдает предупреждающее сообщение и возвращает FALSE , когда

1
ответ дан 3 December 2019 в 17:35

Теги

Похожие вопросы