使用 PHP 的 mail() 从命令行工作,而不是从 Apache,知道为啥吗?

Posted

技术标签:

【中文标题】使用 PHP 的 mail() 从命令行工作,而不是从 Apache,知道为啥吗?【英文标题】:Using PHP's mail() works from command line, not from Apache, any idea why?使用 PHP 的 mail() 从命令行工作,而不是从 Apache,知道为什么吗? 【发布时间】:2015-08-01 00:48:56 【问题描述】:

我在 OS X (Yosemite) 上使用 XAMPP,使用 php 的标准 mail() 函数通过 Sendmail(OS X 为 Postfix 别名)发送。我可以通过其他方式发送电子邮件,例如在 Postfix 配置文件中指定 SMTP 服务器或使用 PHP 类,但我希望基本的 mail() 函数首先工作 - 有很多依赖它的旧网站。

命令行和 Apache 的 PHP 都以同一用户身份运行(通过 exec() 函数使用 whoami 进行测试,以及创建文件和查看权限)。他们都使用相同的php.ini 文件。

当我从终端运行 PHP 脚本时,它暂停了一会儿,我看到它正在邮件日志文件中进行处理,我在目的地收到电子邮件,mail() 函数返回 true

当我通过 Apache 运行脚本时,它暂停了一会儿,邮件日志没有命中,没有电子邮件到达,函数返回 false 并且任何地方都没有错误......无论我如何改变报告级别或查看各种日志文件。它似乎悄悄地失败了。

有什么东西阻止 Apache 在后台与邮件服务器交互吗?像 OS X 中的东西?或者可能是 PHP 中的错误?还是 XAMPP 独有的东西?我尝试升级到最新版本的 XAMPP(它擦除了我所有的配置文件并破坏了 DBs grrr),但结果相同。有什么想法吗?

【问题讨论】:

你怎么知道它们都使用相同的 PHP.ini?你检查phpinfo()了吗? OSX 与 PHP 捆绑在一起。确保您实际上运行的是相同的版本。 在终端中运行 php 脚本与在 httpd 中运行 php 不同——我也不确定 XAMPP 如何在 OS X 上打开套接字。 @Brad Yep 从这两种方法中做了一个 phpinfo,它们指向:/Applications/XAMPP/xamppfiles/etc/php.ini @Tivie 我确保对路径进行了排序,以便 php 指向 XAMPP。 【参考方案1】:

从您的网络服务器调用的 PHP 的配置与命令行 PHP 的配置非常不同,因为 mod_php 是一个单独编译的模块。它不会调用您通过终端访问的标准 php 命令。

使用 mod_php 时,请求/响应通过 apache。

设置可以通过多种方式进行更改(而且肯定会有所不同): - 不同的 php.ini(确保你真的使用相同的) - 从 .htaccess 文件中设置的指令 - 环境变量 - Apache 配置可以(并且确实)改变 php 的行为。

还有……

OSX 与 PHP 捆绑在一起。确保在终端中,您实际上正在运行从 XAMPP(而不是捆绑的那个)调用 php.exe。


调试:

检查您的邮件日志,看看那里出现了什么错误(邮件日志应该在/var/log/maillog

查看邮件函数结果的var_dump

var_dump(mail('someone@example.com', 'foo', 'msg'));

检查发送邮件路径

【讨论】:

var_dump 返回 bool(false) - 所以没有任何迹象。 /var/log/mail.log 仅通过命令行 mail() 更改。根据 phpinfo(),两者的路径都是“/usr/sbin/sendmail -t -i”。会继续寻找。【参考方案2】:

好的,我找到了解决方案,无论出于何种原因,php.ini 中的 sendmail 路径必须看起来像这样,PHP 的邮件才能在 OS X Yosemite 上通过 Apache 工作:

sendmail_path = "env -i /usr/sbin/sendmail -t -i"

感谢所有试图找到答案的人。

【讨论】:

以上是关于使用 PHP 的 mail() 从命令行工作,而不是从 Apache,知道为啥吗?的主要内容,如果未能解决你的问题,请参考以下文章

从命令行卸载 MSI 文件而不使用 msiexec

为啥从命令行编译而不是从 IDE 编译时会出现歧义错误?

PHP Mail 在我不编辑代码的情况下停止工作

使用 PHP 时使用 socks5 代理的 cURL 请求失败,但它通过命令行工作

RabbitMQ 从命令行创建队列和绑定

从phpmailer发送邮件正在工作,但cakephp邮件不能与saim cradienial一起使用