我正在升级一些批处理程序以生成 html 输出而不是文本。批处理程序使用 at 命令运行,然后使用 sendmail 命令将所有输出发送给用户。
因为 at 命令构成了电子邮件的标头,所以我一直困惑于如何向“at”命令或“sendmail”指示批处理命令的输出为 HTML 格式。 “at”和“sendmail”的组合创建标头并以换行符终止标头,因此标头信息(例如 Content-Type)的包含内容被视为正文的一部分。
我的期望是,当现代客户端读取邮件时,内容类型正确设置为“text/html”。
我对任何解决方案都很满意,包括:命令行选项、环境变量、bash/perl/awk/脚本、新的批处理执行程序的建议。
答案1
从脚本显式发送消息,而不是仅打印输出并依赖于at
发送消息。将 HTML 写入文件并用于mutt
附加它并发送消息。
或者,编写带有标头、MIME 结构等的消息,并将其通过管道传送到sendmail -t -i
.mutt
到目前为止,使用是更简单的方法。
答案2
我认为不可能本地做你正在寻找的事情。我不知道有任何at
实现能够在工作中对结果消息头进行任何真正的更改。
但是,您可以将脚本作为生成 HTML 输出的子进程运行,将该输出重定向到文件中,并根据需要添加任何周围的标头,然后将整个结果文本 blob 传递给sendmail -bm
按原样(并依靠sendmail
找出发件人和收件人字段)。
就像一个非常人为的例子:
>tempfile
echo 'From: nobody@localhost' >>tempfile
echo 'To: root@localhost' >>tempfile
echo 'Subject: list of files' >>tempfile
echo >>tempfile
ls -lh $HOME >>tempfile
echo 'Add more data here' >>tempfile
sendmail -bm <tempfile && rm -f tempfile
可能会大致做你想做的事。 (当然,您必须调整上面的内容以包含指示输出为 HTML 的所有内容。)
答案3
通读“at”源代码,这是一个相当简单的补丁,用于更改 at 命令创建的邮件标头以包含内容类型字段。
完整的答案可能是添加环境变量(例如 AT_CONTENT_TYPE)或命令行参数(例如 -c),at 命令根据两个允许值(“plain”作为默认值和“html”作为有效替代值)检查和验证该值。
当然,这将使您的实现不符合 POSIX 规范at 的 POSIX 规范因此,您将受益于复制和重命名符合 GNU 通用公共许可证的命令。