我需要在centos中使用mail命令发送邮件。正文作为 HTML 输入,附件将是一个 .txt 文件。
cat email_temp.html | mail -a "CH_sla_list" -s "$(echo -e "(RackTable Report)\nContent-type: text/html;")" [email protected]
如果我执行上述命令,我将收到一封内联邮件(显示附件文件内容)。
cat email_temp.html | mail -a "CH_sla_list" -s "$(echo -e "RackTable Report")" [email protected]
如果我执行上述操作,我会收到一封带有附件的邮件,但我的 HTML 输入在邮件中显示为文本。
我的要求是在单个命令的同一标头中使用 HTML 和文本,否则我们将不胜感激任何解决方法。
注意: 仅供参考,我正在使用 centos-release-7-0.1406.el7.centos.2.5.x86_64
这正在突破
mail
的可能性界限。您的第一个命令基本上利用了一个漏洞,该漏洞允许您通过传入文字换行符后跟您想要添加的标头来注入任意标头 - 顺便说一句,无论如何,在许多平台上的新版本 mail
中已经阻止了这种情况.
(当然,没有嵌入文字换行符的
echo
根本没有任何用处;这只是对 echo
的异常丑陋无用的使用。)
理论上,如果您知道要创建什么标头结构,则可以使用嵌入的换行技巧将消息的一半作为标头、正文等的“走私”序列传递;但此时
mail
不再真正发挥任何有用的作用,因为无论如何你都在做它的大部分工作。
我的建议是切换到正确支持 MIME 的邮件客户端,例如
mutt
,它可以轻松地允许您从命令行发送多个 MIME 正文部分。
如果你做不到,这里有一个简单粗暴的 shell 脚本。
# sendmail might be hidden in either of these
PATH=$PATH:/usr/sbin:/usr/lib
( printf '%\n' \
'From: My right honorable self <[email protected]>' \
'To: [email protected]' \
'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 符号(你得到 A-z、0-9 和基本标点符号;但没有大引号、印刷破折号或空格,或除
$
以外的货币符号)。它是 7 位 ASCII,就像互联网刚出现时你爷爷的电子邮件一样。
如果您知道自己在做什么,则可以放松其中一些限制,但如果您的要求很重要,则可能会考虑安装第三方实用程序或使用至少具有适当 MIME 库的某种语言编写脚本。有一些相当不错的第三方实用程序或多或少提供了命令行
mutt
的优点,但它们都没有 mutt
本身那么受欢迎;但如果你有例如Python 和“做我的意思”电子邮件库之一,编写您自己的类似自定义实用程序也不难。