Я использую msmtp в качестве ретранслятора и пытаюсь отправить электронное письмо с помощью функции mail (). Он отлично работает в CLI, но ничего не делает в Apache. Мои конфигурации PHP для cli и apache идентичны, никаких ошибок в журналах нет, и у меня действительно нет идей.
Есть идеи, чем это может быть вызвано?
Я нашел решение этой проблемы. Я использую 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 будет пожаловаться на слабые права доступа.
Один из способов отправки почты - использовать его в функции 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 ()
должна вернуть ИСТИНА
, если почта была успешно принята для доставки, иначе ЛОЖЬ
. В обоих случаях, если функция смогла подключиться к SMTP-серверу, дополнительную информацию о подключении можно найти в файле журнала SMTP-сервера .
Если mail ()
возвращает FALSE
без подключения к SMTP, проверьте, включены ли safe_mode и mail ()
дополнительные_параметры установлены . Из журнала изменений (версия PHP 4.2.3):
Параметр additional_parameters отключен в safe_mode и Функция
mail ()
выдает предупреждающее сообщение и возвращаетFALSE
, когда