如何在邮件命令中同时使用html和纯文本标题?

时间:2018-08-07 17:16:08

标签: bash centos html-email

我需要在centos中使用mail命令发送邮件。正文作为HTML输入和附件将是一个.txt文件。

cat email_temp.html | mail -a "CH_sla_list" -s "$(echo -e "(RackTable Report)\nContent-type: text/html;")" example@xxx.com

如果执行上述命令,则会收到带有内联的邮件(显示附件文件的内容)。

cat email_temp.html | mail -a "CH_sla_list" -s "$(echo -e "RackTable Report")" example@xxx.com

如果我执行以上命令,将会收到一封带有附件的邮件,但是我的HTML输入在邮件中显示为文本。

我的要求是在单个命令中的同一标头中同时使用HTML和文本,否则任何解决方法将不胜感激。

注意: 仅供参考,我使用centos-release-7-0.1406.el7.centos.2.5.x86_64

1 个答案:

答案 0 :(得分:0)

这为mail带来了无限可能。您的第一个命令基本上利用了一个漏洞,该漏洞使您可以通过传递文字换行符和要添加的标头来注入任意标头-顺便说一下,许多新版本的mail中已阻止了此漏洞平台。

({echo当然没有嵌入的文字换行符,根本没有任何用处;它只是一个异常笨拙的useless use of echo.)

理论上,如果您知道要创建什么样的标题结构,则可以通过嵌入的换行技巧将消息的一半作为标题,主体等的“走私”顺序传递;但是此时mail不再真正有任何用处,因为您无论如何都要完成大部分工作。

我的建议是切换到具有适当MIME功能的邮件客户端,例如mutt,该客户端可以轻松地从命令行发送多个MIME正文部分。

如果您做不到,这是一个简单的原始shell脚本。

# sendmail might be hidden in either of these
PATH=$PATH:/usr/sbin:/usr/lib

( printf '%\n' \
    'To: example@xxx.com' \
    'Subject: RackTable Report' \
    'Content-type: multipart/mixed; boundary=_fooobar_' \
    'Mime-Version: 1.0' \
    '' \
    '--_fooobar_' \
   'Content-type: text/html' \
    ''
  cat email_tmp.html
 printf '%\n' \
    ''
    '--_fooobar_' \
    'Content/type: text/plain' \
    'Content-disposition: attachment; name="CH_sla_list"'
    ''
  cat CH_sla_list
  printf '%\n' \
    '' \
    '--_fooobar_--' )|
sendmail -oi -t

我显然不得不对您想要的电子邮件结构做出有根据的猜测。

如果要对此进行调整,请注意单引号将所有字符串逐字引用。如果要扩展变量,则需要使用双引号,例如"To: $1"

这有许多简化的假设,并且不能可靠地处理长行文本(过去900个左右的字符),带重音符号的字符或非ASCII符号(您会得到Az,0-9和基本标点符号;但除$之外,不能包含任何其他引号,印刷破折号或空格或货币符号。它是7位ASCII码,就像互联网刚建立时爷爷的电子邮件一样。

如果您知道自己在做什么,则可以放宽某些约束,但是如果您的要求很高,则可以考虑安装第三方实用程序或使用至少具有适当MIME库的某种语言编写脚本。有一些相当不错的第三方实用程序,它们或多或少地提供了命令行mutt的漂亮部分,但是它们中没有一个比mutt本身受欢迎。但是如果你有Python和“按我的意思做”电子邮件库之一,编写自己的类似自定义实用程序也不难。