刚刚在 CentOS 7 机器上遇到了这个语法问题。
在运行 mail 的非常旧的 Ubuntu 机器上,编写精美的电子邮件的语法是
echo -e "$body" | mail -s "$subject" -a "From: Sender Name <$sender>" "$recipient"
但是在安装了mailx 的 CentOS 7 机器上,情况就完全不同了:
echo -e "$body" | mail -s "$subject" -S "from=Sender Name <$sender>" "$recipient"
咨询man mail 表明-r 已被弃用,现在应使用-S "variable=value" 直接设置“发件人”发件人地址。
在这些示例和后续示例中,我将$sender 定义为"Sender Name <sender.address@domain.tld>",将$recipients 定义为"recipient.name@domain.tld",就像我在我的bash 脚本中所做的那样。
然后您可能会发现,正如我所做的那样,当您尝试在发送电子邮件时在脚本中生成电子邮件的正文内容时,您会遇到一个奇怪的行为,即电子邮件正文被附加为二进制文件 ( “ATT00001.bin”、“application/octet-stream”或“noname”,取决于客户端)。
这种行为是 Heirloom mailx 处理文本输入中无法识别/控制字符的方式。 (更多信息:https://access.redhat.com/solutions/1136493,它本身引用了解决方案的 mailx 手册页。)
为了解决这个问题,我使用了一种方法,将生成的输出通过tr 传递给mail,并指定电子邮件的字符集:
echo -e "$body" | tr -d \\r | mail -s "$subject" -S "from=$sender" -S "sendcharsets=utf-8,iso-8859-1" "$recipients"
在我的脚本中,我还明确地预先声明了语言环境,因为它作为 cronjob 运行(并且 cron 不继承环境变量):
LANG="en_GB.UTF8" ; export LANG ;
(为 cronjobs 设置语言环境的另一种方法is discussed here)
通过https://stackoverflow.com/a/29826988/253139 和https://stackoverflow.com/a/3120227/253139 获得有关这些解决方法的更多信息。