问题可能是您的mail 程序将您的管道输入编码为:
Content-Type: text/plain; charset=us-ascii
(假设您的mail 可能是snail、Berkeley mailx 或heirloom_mailx——所有这些都源自伯克利邮件的各种迭代以及当前维护的最新版本s-nail 14.9.11-1 (Homepage))
如果您的mail 是提供-a(附加)选项的派生之一,那可能就是要走的路。虽然您的电子邮件正文仍为Content-Type: text/plain,但您的附件将以Content-Type: text/html 的形式出现,大多数邮件阅读器将显示在电子邮件本身中(这似乎是您的目标)。
只需对您的例程进行一些调整,将df 的输出准备为表格,您所拥有的就可以很好地工作。所做的唯一调整(可选,但有帮助)是使用快速的 sed 替换将 "Mounted on" 替换为 "Mounted_on" 以提供一致数量的字段供 awk 使用,然后设置表格"width=60%" 防止表格呈现scrunched(技术术语)。
例如,包括调整,您可以这样做:
tmp=/home/david/tmp/df.html
echo '<html><body><table border=1 width=60%>' > "$tmp"
df | sed 's/Mounted\son/Mounted_on/' |
awk '{print "<tr>";for(i=1;i<=NF;i++)print "<td>" $i"</td>";print "</tr>"}
END
{print "</table></body></html>"}' >> "$tmp"
echo "df attached" | mailx -s "wizard df" -a "$tmp" david@nirvana
(明显的注释:根据您的系统和电子邮件的需要更改分配给tmp的路径)
除了调整之外,上面提到的唯一更改是将 html 文件“附加”到消息中,而不是将其转储到消息中。 mail(但不是全部)的大多数变体都提供了-a(附加)选项。这提供了一种简单的机制,可以将文件作为正确格式和编码的附件发送。为了提供邮件的正文,我只包含了一个简单的"df attached" 并使用echo 将文本传送到mail 命令。如上图,mail 命令为:
echo "df attached" | mailx -s "wizard df" -a "$tmp" david@nirvana
然后检查旧版本的 Thunderbird,您会发现 df 信息的表格输出,例如
检查一下,让我知道这是否是您正在尝试的,以及您是否能够在您的命令行邮件程序版本中找到 -a(附加)选项(如果没有,我建议检查是否你的发行版提供s-nail 或heirloom-mailx。对于一个小包,这两个实现提供了强大的命令行邮件功能)
编辑每个请求以在消息正文中编码为"text/html"
这很大程度上取决于您拥有的mail/mailx/s-nail 包。对于s-nail(通常也别名为mailx),-M 选项允许您为电子邮件正文在stdin 上接收的文本指定Content-type。在这种情况下,您只需将"$tmp" 重定向到您的邮件命令,同时指定-M "text/html" 作为选项,例如将上面的最后一行更改为:
mailx -M "text/html" -s "wizard df redir -M" david@nirvana < "$tmp"
使用s-nail/mailx 会导致:
(注意:我必须从另一台机器发送,例如 Archlinux 包 s-nail 为 mailx 而 OpenSuSE 包 heirloom-mailx)
对于像heirloom-mailx 这样的其他软件包,附件似乎是让mailx 根据扩展名设置Content-type 的唯一方法。它通过读取具有以下格式的 MIME 类型文件来实现:
type/subtype extension [extension . . .]
因此,在这种情况下,您似乎必须重新编写邮件标题,或者手动创建邮件正文,包括邮件表格部分的Content-type,类似于:
Content-Type: text/html; charset=us-ascii
(或者你的charset应该是什么)
这就是我建议的原因,如果你不使用基于s-nail 的mail/mailx,那么去看看你的发行版是否提供s-nail 包,或者它甚至值得从源代码构建并放入@987654381 @。