如何正确设置运行发送电子邮件的PHP脚本的cron作业?

时间:2013-01-19 22:49:29

标签: php email cron

我已经整理了一个PHP脚本,它将一些内容发送到预定义的电子邮件地址,并希望设置一个每天运行该PHP脚本的cron作业。另外,我已将其设置为每次cron运行时也向我发送电子邮件。 我应该提一下,这个脚本使用PHP mail()函数以html格式发送电子邮件,并且我已经通过浏览器的地址栏直接访问来测试脚本的工作原理。

cron命令:php /home/myuserid/public_html/projects/jobs/index.php

令人惊讶的是,当cron运行时,我通过电子邮件收到以下错误消息:

在连接(。)中使用未初始化的值或在/ usr / bin / sendmail第15行使用字符串。 内容类型:text / html

我甚至不确定从哪里开始寻找问题,所以我需要问:我如何正确设置一个运行PHP脚本的简单cron作业,该脚本使用mail()函数发送电子邮件?

5 个答案:

答案 0 :(得分:1)

如果不查看脚本本身就很难确切地说出问题所在,但潜在的问题是输出流被发送到了错误的位置。在标准POSIX环境中,有2个标准输出流,标准输出(stdout)和标准错误(stderr)。在Web浏览器中查看脚本时,stdout将传递给浏览器,而stderr将由Apache处理并通常发送到记录器。

从命令行调用时,情况有所不同:可能需要打印到控制台(标准stdout),但这些内容依赖于脚本和CLI php.ini之类的内容。 。在您的情况下,引用Content-Type的行表示输出被发送到错误的位置。您可以使用shell(通常是BASH)重定向重定向输出。您可以使用>进行写入,使用>>进行追加,也可以指示默认值为stdout2代表stderr的输出流。输出可以在任何地方发送,例如基本日志记录文件,或者如果根本不需要,可以通过将其发送到特殊设备/dev/null来丢弃。

所以....提供的解决方案

php /home/myuserid/public_html/projects/jobs/index.php 2> /dev/null

运行您的脚本,同时丢弃发送到stderr的错误,这些错误之前已被发送到错误的目的地并导致某些接收器丢失。

答案 1 :(得分:0)

您是否检查过脚本在cron之外是否正确执行? 在shell上运行相同的命令会发生什么?

答案 2 :(得分:0)

您必须确保服务器的SMTP服务器处于活动状态。此外,如果它说你有连接问题,那么你就像在;

这样的行上做错了
$output = $string . " and " . $string;

或者像这样;

$output = "Hello";
$output .= " there!";

答案 3 :(得分:0)

运行cron的方法似乎是正确的。您的邮件发送一定有问题。您的服务器可能不支持使用mail()功能。您可以使用PhpMailer来优先选择smtp邮件。

尝试设置标题:

// To send HTML mail, the Content-type header must be set
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";

mail($to, $subject, $message, $headers);

答案 4 :(得分:0)

我已经联系了我的托管服务提供商,他们已经将cron命令自己更改为php /home/myuserid/public_html/projects/jobs/index.php 2> /dev/null,这就是诀窍。 @Matt Whipple建议部分修复(即在命令行中添加/dev/null)。