PHP的mail()函数在CLI中工作,但不在Apache中

我使用msmtp作为中继,并尝试使用mail()函数发送电子邮件。 它在CLI中完美工作,但在Apache中什么也不做。 我的PHPconfigurationcli和apache是​​相同的,没有在任何日志中的错误,我真的没有想法。

不知道这可能是由什么造成的?

在exec()函数中使用它可以发送邮件的一种方法。

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

检查输出的响应,但仍然必须解决使用php mail()函数的设置。

首先: 检查你是否确实使用了你认为的php.ini文件。

如果启用了mod_suphp ,Apache可以为每个用户使用不同的php.ini位置。 在suPHP中,位置是在mods-enabled/suphp.conf使用suPHP_ConfigPath指令设置的,即使为全局configuration设置了不同的PHPIniDir,该位置也默认为PHP编译的默认path。 ( PHP:configuration文件提供了关于php.ini被search的顺序的更多信息。)

  1. 你可以通过使用<?php phpinfo(); ?>来获得php.ini位置<?php phpinfo(); ?> <?php phpinfo(); ?>在同一目录下。
  2. 可以直接通过ini_get()获取mail()函数使用的当前SMTP服务器:

    <?php echo ini_get('SMTP') . ":" . ini_get('smtp_port'); ?>

如果SMTP服务器是它应该的那个,如果邮件被成功地接受了传递,那么mail()函数应该返回TRUE ,否则返回FALSE 。 在这两种情况下,如果该function能够连接SMTP服务器,则可以在SMTP服务器日志文件中find有关该连接的更多信息。

如果mail()在没有连接到SMTP的情况下返回FALSE ,请检查是否设置了safe_mode和mail() additional_parameters 。 来自changelog(PHP版本4.2.3):

additional_parameters参数在safe_mode中被禁用,并且mail()函数将暴露警告消息并在使用时返回FALSE

我find了解决这个问题的办法。 我使用的是msmtp ,它是一个SMTP代理,与sendmail类似,因此,当试图发送邮件时,msmtp命令从php调用,语法与sendmail类似。

现在,msmtp命令将由apache2正在运行的同一个用户运行。 在我的情况下万维网数据。

有一个msmtp的configuration文件(在我的情况下是/etc/.msmtp_php)需要www-data用户可读。

CLI正在工作而Apache PHP不工作的原因是,我正在root下运行CLI,它具有对文件的正确权限,但apache2正在www-data下运行,它没有这些权限。

所以解决的办法是:将/etc/.msmtp_php文件chownwww-data:www-data ,chmod把相同的文件改为0600 ,否则,msmtp会抱怨松散的权限。