我有一个 cron 作业,如果失败,则输出 HTML。如果成功,则不输出任何内容,在这种情况下,我不会收到任何邮件。如果它失败并输出 HTML,cron 会向我发送邮件,但邮件以纯文本形式发送,难以阅读。
我想出了两个部分解决方案,但还没有弄清楚如何让它真正发挥作用。第一个是让我的作业在输出顶部打印 MIME 说明符,如下所示:
Mime-Version: 1.0
Content-Type: text/html
<html>...
然后我在 cron 中像这样运行它:
my-job | sendmail my.name
这样做的主要问题是,即使没有任何文本,我也会收到邮件。第二个问题是,我必须将 MIME 类型行添加到我的脚本中,而这似乎不太合适(不太优雅,但也许可以忍受)。
然后我尝试使用mail
或,如果没有文本,mailx
则可以选择跳过发送:-E
my-job | mail -E my.name
这基本上就是 cron 默认所做的。但是我找不到任何方法来使用 mail/mailx 设置 MIME 类型!网上的一些参考资料说这是使用选项完成的-a
,但在我的系统 (Fedora 16) 上,它mail -a
采用的是附件文件名,而不是标题行,就像Content-Type: text/html
在其他一些系统上一样。
我不想创建临时文件、检查其大小等。我想我想要其中之一:
- 使 cron 邮件可读为 HTML 的一种方法。
- 使 sendmail 跳过空消息。
- 在 mailx 中设置 MIME 类型。
- 其他一些方法是使用 Fedora 上默认安装的不同程序。
答案1
不要在命令行上指定收件人,而是使用 调用 sendmail-t
并让脚本生成to:
标题。(您也可以subj:
在执行此操作时生成标题。)这样,当没有输出时,就没有收件人,因此也就没有邮件。
答案2
最简单的方法是在脚本中调用 sendmail fom。这样你就可以控制是否向你发送邮件。
或者,你可以让你的脚本返回成功代码,如果它失败并且仅当脚本“正确”退出时才运行 sendmail:
$ my-job >/tmp/message && cat /tmp/message | sendmail
告诉&&
bash 仅当第一个命令成功退出时才运行下一个命令(exit 0
在 BASH 或exit(0)
PERL 中)。通过告诉脚本在失败时以状态 0 退出,您将使 sendmail 命令仅在失败时运行。
答案3
您可以按如下方式指定内容类型:
mail -s "$(echo -e "Status Report: $HOSTNAME\nContent-Type: text/html")" "yourmail@"