如何设置 mailx 命令的发件人电子邮件地址?
Posted
技术标签:
【中文标题】如何设置 mailx 命令的发件人电子邮件地址?【英文标题】:How to set the From email address for mailx command? 【发布时间】:2010-11-20 18:50:01 【问题描述】:我正在编写一个在 Solaris 服务器上运行的 KornShell (ksh) 脚本,该脚本会在满足错误条件时发送一封电子邮件。我通过mailx
发送电子邮件。
问题:如何在mailx
命令中设置“发件人”电子邮件地址?
当前代码:
echo $msg_txt | mailx -s "Script Failure" $to_email
注意:该命令可以正常工作,但是,“发件人”是我正在运行脚本的用户的名称,我希望将其发送到另一个电子邮件地址。
我将如何做到这一点?
【问题讨论】:
【参考方案1】:您可以使用“-r”选项设置发件人地址:
mailx -r me@example.com -s ...
【讨论】:
【参考方案2】:“-r”选项在我的系统上无效。我不得不对“发件人”字段使用不同的语法。
-a "From: Foo Bar <foo.bar@someplace.com>"
【讨论】:
在我的情况下,在 Ubuntu 16.04 上,使用您的-a
选项,它确实在收到的邮件中显示了 Foo Bar
名称,但是对收到的邮件的回复提供了我使用的 gmail 电子邮件地址作为 smtp 登录,而不是 foo.bar@someplace.com
之一。
这应该被认为是正确的答案。
我遇到了错误:“来自:Foo Bar 如果您还想在 from-field 中包含您的真实姓名,您可以使用以下格式
mailx -r "me@example.com (My Name)" -s "My Subject" ...
如果你的名字中有非 ASCII 字符,比如 My AEÆoeøaaå (Æ= C3 86, ø= C3 B8, å= C3 A5),你必须像这样对它们进行编码:
mailx -r "me@example.com (My =?utf-8?Q?AE=C3=86oe=C3=B8aa=C3=A5?=)" -s "My Subject" ...
希望这可以为某人节省一个小时的辛勤工作/研究!
【讨论】:
如果有人好奇,=?utf-8?...?=
位是MIME encoded-word。
实名部分在 solaris 上对我不起作用。邮件成功发送并具有正确的电子邮件地址,但我发送的每封电子邮件都被精简到电子邮件地址。
@Rune 你的方法返回 (My AE??oe??aa??) 知道为什么吗?
@RafaSashi 我猜这是因为您的系统未设置为显示 UTF-8 字符(在这种情况下为 2 字节挪威字符)。在我的挪威语 (UTF-8) 系统上,它显示为“my AEÆoeøaaå”
添加 -a "Content-Type: text/plain; charset=UTF-8"
标头解决了我的 UTF-8 字母问题。现在é
已正确显示。【参考方案4】:
在默认安装bsd-mailx
的debian 上,-r
选项不起作用。但是,您可以改用mailx -s subject recipient@abc.com -- -f sender@abc.com
。根据手册页,您可以在 --
之后指定 sendmail 选项。
【讨论】:
感谢您的提示,我想我应该更详细地阅读概要。不幸被可怕的 bsdutils 卡住了,很高兴有一个解决方法。 不幸的是,DSA 3104-1 security update 破坏了这种方法。相反,可以安装 heirloom-mailx 包,它确实提供了-r
选项。
我刚刚安装了bsd-mailx
版本Version: 8.1.2-0.20160123cvs-2
,尽管是在Ubuntu 16.04系统上; -r
选项有效。【参考方案5】:
刚刚在 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://***.com/a/29826988/253139 和https://***.com/a/3120227/253139 获得有关这些解决方法的更多信息。
【讨论】:
注意:在类 RH 发行版(也包括 SLES)上使用的 mailx 包实际上是heirloom mailx
,它比 BSD mailx
更复杂。它支持 SMTP,并且可以通过-S
选项设置许多不同的变量。如果你有选择,那就去heirloom mailx
。
感谢@reichhart 的详细信息,感谢您的评论。【参考方案6】:
包nail
提供了一个增强的类似mailx 的界面。它包括-r
选项。
在 Centos 5 上安装包 mailx
会给你一个名为 mail
的程序,它不支持 mailx
选项。
【讨论】:
注意:在类 RH 发行版(也包括 SLES)上使用的 mailx 包实际上是heirloom mailx
,它比 BSD mailx
更复杂。它支持 SMTP,并且可以通过-S
选项设置许多不同的变量。如果你有选择,那就去heirloom mailx
。【参考方案7】:
在 Ubuntu Bionic 18.04 上,这可以正常工作:
$ echo -e "testing email via yourisp.com from command line\n\nsent on: $(date)" | mailx --append='FROM:Foghorn Leghorn <fleghorn@yourisp.com>' -s "test cli email $(date)" -- recipient@acme.com
【讨论】:
【参考方案8】:在 macOS Sierra 上,使用 smtp 设置创建 ~/.mailrc 就可以了:
set smtp-use-starttls
set smtp=smtp://smtp.gmail.com:587
set smtp-auth=login
set smtp-auth-user=youremail@gmail.com
set smtp-auth-password=yourpass
然后从 CLI 发送邮件:
echo "your message" | mail -s "your subject" to_email@gmail.com
【讨论】:
这并不能完全回答问题以上是关于如何设置 mailx 命令的发件人电子邮件地址?的主要内容,如果未能解决你的问题,请参考以下文章
SMTP 的哪些实现通常处理邮件数据以响应 DATA 之后的 RSET?