当包含php mail()的第五个参数时,为什么cron作业无法发送电子邮件?

时间:2013-01-25 20:59:52

标签: cron php

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

/usr/bin/php -q /var/www/vhosts/domain.com/cron/job.php

当我从浏览器执行php脚本时,脚本会按预期发送电子邮件。它在由cron作业运行时失败。

我没有看到maillog中的任何错误。唯一的区别在于"来自"线。从浏览器执行脚本时,日志显示为:

Jan 25 12:24:39 VMW01 qmail-remote-handlers[1001]: from=sender@domain.com

但是当cron作业执行脚本时,"来自"行成为:

Jan 25 12:15:01 VMW01 qmail-queue-handlers[1000]: from=anonymous@VMW01.server.net

奇怪的是,当我删除mail()行的第五个参数时,cron作业将发送电子邮件。

mail($email, $subject, $body, $headers, '-fsender@domain.com');

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

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

2 个答案:

答案 0 :(得分:2)

正如@Michael所说,很可能你的cron作业使用的是另一个php.ini文件。您可以使用php_ini_loaded_file()函数查看脚本中加载的文件 - 然后从命令行或您的cron运行它以查看与Web执行的区别。

我的猜测是问题出现了,因为cron作业的php.ini(与命令行相同)设置了safe_mode,在这种情况下,你不应该使用{{1}的最后一个参数功能因为它可能会失败。作为证据,如果您查看PHPMailer class,有一个mail()方法只需调用PHP mail_passthru()函数。请注意,当它不在mail()

时,它会遗漏额外的参数
safe_mode

您可以从命令行(或您的cron作业)调用php时加载特定的php.ini文件,如下所示:

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;
}

答案 1 :(得分:0)

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