Cron 为什么当php mail()和#x27;是否包括第五个参数?

Cron 为什么当php mail()和#x27;是否包括第五个参数?,cron,php,Cron,Php,我有一个cron-cron作业设置来发送电子邮件。它使用以下命令执行: /usr/bin/php -q /var/www/vhosts/domain.com/cron/job.php 当我从浏览器执行php脚本时,脚本会按预期发送电子邮件。它在由cron作业运行时失败 我在邮件日志中没有看到任何错误。唯一的区别在于“from”行。从浏览器执行脚本时,日志显示: Jan 25 12:24:39 VMW01 qmail-remote-handlers[1001]: from=sender@doma

我有一个cron-cron作业设置来发送电子邮件。它使用以下命令执行:

/usr/bin/php -q /var/www/vhosts/domain.com/cron/job.php
当我从浏览器执行php脚本时,脚本会按预期发送电子邮件。它在由cron作业运行时失败

我在邮件日志中没有看到任何错误。唯一的区别在于“from”行。从浏览器执行脚本时,日志显示:

Jan 25 12:24:39 VMW01 qmail-remote-handlers[1001]: from=sender@domain.com
但当cron作业执行脚本时,“from”行变为:

Jan 25 12:15:01 VMW01 qmail-queue-handlers[1000]: from=anonymous@VMW01.server.net
奇怪的是,当我删除mail()行的第五个参数时,cron作业将发送电子邮件

我只想接受这个,但是如果我删除这个参数,电子邮件通常会被服务器拒绝——我想这是因为参数没有设置


你知道为什么会发生这种情况,以及我如何解决它吗?为了找到解决方案,我很乐意为这个问题添加更多细节。

正如@Michael所说,您的cron作业很可能使用了不同的php.ini文件。您可以使用
php\u ini\u loaded\u file()
函数查看脚本中加载了什么文件,然后从命令行或cron运行它以查看web执行的差异

我的猜测是,出现问题是因为cron作业(与命令行相同)的php.ini设置了安全模式,在这种情况下,您不应该使用
mail()
函数的最后一个参数,因为它可能会失败。作为证据,如果你看一下,有一个
mail\u passthru()
方法,它只是在封面下调用PHP
mail()
函数。请注意,当不在
安全模式下时,它会忽略额外的参数:

private function mail_passthru($to, $subject, $body, $header, $params) {
    if ( ini_get('safe_mode') || !($this->UseSendmailOptions) ) {
        $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($subject)), $body, $header);
    } else {
        $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($subject)), $body, $header, $params);
    }
    return $rt;
}
从命令行(或cron作业)调用php时,可以加载特定的php.ini文件,如下所示:

/usr/bin/php -q /var/www/vhosts/domain.com/cron/job.php -c /path/to/php.ini

我也遇到了同样的问题,我发现将cron命令更改为wget-O/dev/null会像在浏览器中那样执行它,并发送电子邮件。

CLI加载的php.ini是否与web服务器不同?如果是,它们中的一个或另一个是否指定了
mail.force\u extra\u参数
?(我以前从未见过这个问题)我总是建议不要完全使用PHP的
mail()
函数;当它出错时,处理它可能会非常困难,调试起来也非常困难。在我所见过的几乎所有情况下,最好使用一个像样的第三方库,比如phpMailer。编写代码总是简单得多,通常是第一次工作,当它不工作时,更容易找出原因。我认为这让我更接近解决方案。我只需要对cmd行重新排序以加载php.ini:
/usr/bin/php-c/path/to/php.ini-q/var/www/vhosts/domain.com/cron/job.php
。不过,第五个参数失败了。我得到这个错误:“PHP警告:mail():安全模式限制生效。第五个参数在安全模式下被禁用”。如何在调用正确的php.ini时解除安全模式限制。
safe_mode
设置在
php.ini
文件中。。。您只需要将路径更改为
php.ini
文件位置的正确值,当然,还需要关闭
safe_mode
设置,或者不使用第五个参数。不确定原因,但用于web执行的php.ini已将safe mode设置为off,尽管web执行显然未处于安全模式。我已将安全模式设置为“关闭”。我想没有理由戴上它。mail()现在似乎按照cron作业的预期工作。
/usr/bin/php -q /var/www/vhosts/domain.com/cron/job.php -c /path/to/php.ini