PHP“mail()”函数从 php5 cli 发送邮件,但在浏览器运行脚本时不发送
Posted
技术标签:
【中文标题】PHP“mail()”函数从 php5 cli 发送邮件,但在浏览器运行脚本时不发送【英文标题】:PHP "mail()" function sends mail from php5 cli but not when the script is run by a browser 【发布时间】:2012-01-26 08:27:58 【问题描述】:我已经通过在“/etc/php5/apache2/php.ini”中设置"sendmail_path = "/usr/sbin/sendmail"
来配置我的服务器发送邮件,并且服务器上安装了sendmail。
当我从 php5 通过 cli 运行此脚本或它的任何变体时,邮件发送得很好,但是当我有浏览器运行它时,即 Chrome 或 Firefox,它每次都失败。
<?php
$to = "notreal@email.com";
$subject = "Hi!";
$body = "Hi,\n\nHow 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 的网络应用程序也不发送邮件。
【问题讨论】:
如果您可以访问 php.ini 文件,请检查 smtp 的设置。 mail() 不符合当今的电子邮件标准。请改用 PHPmailer 之类的邮件程序类。 【参考方案1】:Apache 和 CLI 似乎在您的设置中使用不同的配置。
将/etc/php5/cli/php.ini
中的配置与您的Apache 的php.ini
进行比较。 Apache 的 PHP 的 sendmail 配置可能无法正常工作,而 CLI 配置是正确的。
【讨论】:
原来他们是不一样的。在我的 apache php.ini 文件中,我设置了 sendmail_path,但在 cli/php,ini 中,它仍然被注释掉了。我的印象是必须明确设置。但是我确信路径是正确的......所以我仍然很困惑为什么它失败以及为什么它在被注释掉时会起作用。无论哪种方式,再次注释掉 php.ini 中的 sendmail_path 行并重新启动 apache 似乎已经解决了这个问题。谢谢【参考方案2】:您首先需要验证当前设置是否与您认为的一致:
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 Files\PHP\php.ini
Scan this dir for additional .ini files => (none)
Additional .ini files parsed => (none)
这将帮助您识别需要编辑的 php.ini 文件。
(无论如何,这很奇怪,这在 Linux 服务器中配置错误。)
【讨论】:
【参考方案3】:当您从 cli 运行 php 时,它会在您登录到 linux 的帐户下运行。 当您从 Apache 运行时,php 以运行 Apache 的用户身份运行,通常是 'nobody'
来自“nobody”的邮件失败的原因可能有多种 - 一些垃圾邮件过滤器会拒绝它。
另外,我不确定您所说的“失败”是什么意思 - 只是没有收到您期望的电子邮件并不意味着它没有发送。你应该检查你的邮件日志,通常在 /var/log/maillog 从浏览器运行脚本后,检查该日志中的最新几行, 输入
# tail -20 /var/log/maillog
并查看您是否可以发现您的电子邮件被发送或拒绝。还要等待几分钟,然后再次检查该日志 - 您的原始电子邮件可能会从某个邮件服务器退回,它会解释为什么它被退回
【讨论】:
以上是关于PHP“mail()”函数从 php5 cli 发送邮件,但在浏览器运行脚本时不发送的主要内容,如果未能解决你的问题,请参考以下文章
Nginx + php5-fpm 不显示 php 错误但 cli 显示错误