我已经通过在"/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
,看看你是否能发现你的电子邮件被发送或拒绝。也等几分钟,再次检查日志-您的原始邮件可能会从某些邮件服务器退回来,它将包括为什么它被退回的解释