PHP "mail()" 函数从 php5 cli 发送邮件,但不在浏览器运行脚本时发送邮件



我已经通过在"/etc/php5/apache2/php.ini"中设置"sendmail_path = "/usr/sbin/sendmail"来配置我的服务器发送邮件,并且sendmail已经安装在服务器上。

当我通过cli从php5运行这个脚本或它的任何变体时,邮件发送正常,但当我有浏览器运行它时,即Chrome或Firefox,每次都失败。

<?php
 $to = "notreal@email.com";
 $subject = "Hi!";
 $body = "Hi,nnHow are you?";
 if (mail($to, $subject, $body)) {
   echo("<p>Message successfully sent!</p>");
  } else {
   echo("<p>Message delivery failed...</p>");
  }
?>

我使用"php5-cli"包作为命令行解释器。

其他依赖PHP "mail()"函数的基于PHP的web应用程序也不发送邮件。

Apache和CLI似乎在您的设置中使用不同的配置。

比较/etc/php5/cli/php.ini和Apache的php.ini中的配置。可能是Apache PHP的sendmail配置不工作,CLI配置是正确的

您首先需要验证当前设置是否为您认为的设置:

var_dump(ini_get('sendmail_path'));

如果在web和CLI中不同,PHP可能是不同的PHP .ini文件。运行这个:

phpinfo(INFO_GENERAL);

…然后找到这部分(你的值和我的不一样):

Configuration File (php.ini) Path => C:Windows
Loaded Configuration File => C:Program FilesPHPphp.ini
Scan this dir for additional .ini files => (none)
Additional .ini files parsed => (none)

这将帮助您确定需要编辑的php.ini文件。

(不管怎样,这在Linux服务器中被错误配置是很奇怪的。)

当您从cli运行php时,它运行在您登录到linux的帐户下。当你从Apache运行时,php以Apache的用户运行,通常是'nobody'

来自"nobody"的邮件失败可能有几个原因——一些垃圾邮件过滤器会拒绝它。

我也不确定你所说的"失败"是什么意思——只是没有收到你期望的电子邮件并不意味着它没有发送。您应该检查邮件日志,通常在/var/log/maillog中在浏览器中运行脚本后,检查日志中最近的几行,类型

# tail -20 /var/log/maillog

,看看你是否能发现你的电子邮件被发送或拒绝。也等几分钟,再次检查日志-您的原始邮件可能会从某些邮件服务器退回来,它将包括为什么它被退回的解释

最新更新