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

标签 cron php

我有一个 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');

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

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

最佳答案

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

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

关于cron - 为什么包含 php mail() 的第五个参数时 cron 作业无法发送电子邮件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14530313/

相关文章:

php - MongoConnectionException - 无法连接到 : localhost:27017

java - 如何等待 spring cron 作业从 ant build 脚本完成

每个月的第一个星期一的 Spring @scheduled cron 表达式

c# - CRON 表达式在每月的最后一天触发 Azure 函数

php - 在 Laravel 4 单元测试中,如何在请求中设置 cookie?

php - 这是PHP中的错误吗

Php set_time_limit 不可用,还有其他办法吗?

linux - 是否可以在 3-6 分钟之间随机运行 cron 作业?

linux - 删除除一个之外的所有子目录和文件

php - 如何创建具有 3 个不同系列类别名称的 Highcharts