我有一个 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/