我有一个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');
我只想忍受这个,但如果删除参数,电子邮件通常会被服务器拒绝 - 我认为这是因为没有设置参数。
知道为什么会发生这种情况以及如何解决这个问题?我很乐意为这个问题添加更多细节,以便找到解决方案。
答案 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/就像在浏览器中执行它并发送电子邮件一样。