使用 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,知道为啥吗?的主要内容,如果未能解决你的问题,请参考以下文章