я использую мсмтп в качестве ретранслятора и пытается отправить электронное письмо с помощью функции 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
обыскивается.)
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):
В дополнительные_параметры параметр отключен в safe_mode и
mail()
функция отобразит предупреждающее сообщение и вернетFALSE
при использовании.
Один из способов отправки почты - использовать ее в функции exec ().
exec('usr/bin/mail <parameter>', $output); //$output for debugging
Проверьте вывод для ответа, но все же вам нужно разрешить свои настройки для использования php mail()
функция.