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

Using PHP's mail() works from command line, not from Apache, any idea why?

我在 OS X (Yosemite) 上使用 XAMPP,使用 PHP 的标准 mail() 功能通过 Sendmail 发送(OS X Postfix 的别名)。我可以通过其他方式发送电子邮件,例如在 Postfix 配置文件中指定 SMTP 服务器或使用 PHP class,但我想首先使用基本的 mail() 功能 - 有很多遗留网站依赖它。

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

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

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

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

从您的网络服务器调用的

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

使用mod_php时,requests/responses通过apache。

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

的行为

还有...

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


调试:

  • 检查你的邮件日志,看看那里出现了什么错误(邮件日志应该在 /var/log/maillog
  • 检查邮件函数结果的var_dump

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

  • 检查发送邮件路径

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

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

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