3

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

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

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

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

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 作业将发送电子邮件。

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

我会简单地接受这个,但如果我删除参数,电子邮件通常会被服务器拒绝 - 我认为这是因为未设置参数。

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

4

2 回答 2

4

正如@Michael 所说,您的 cron 工作很可能正在使用不同的 php.ini 文件。您可以使用该php_ini_loaded_file()函数查看脚本中加载了哪些文件 - 然后从命令行或您的 cron 运行它以查看与 Web 执行的区别。

我的猜测是问题的出现是因为 cron 作业(与命令行相同)的 php.ini 设置了 safe_mode,在这种情况下,您不应该使用mail()函数的最后一个参数,因为它可能会失败。作为证据,如果您查看PHPMailer该类,则有一个mail_passthru()方法可以简单地调用 PHPmail()函数。请注意,它在不在时省略了额外的参数safe_mode

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
于 2013-01-25T22:47:51.930 回答
0

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

于 2017-05-05T21:07:37.260 回答