如何设置 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 ”没有这样的文件或目录【参考方案3】:

如果您还想在 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 &lt;sender.address@domain.tld&gt;",将$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 &lt;fleghorn@yourisp.com&gt;' -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 命令的发件人电子邮件地址?的主要内容,如果未能解决你的问题,请参考以下文章

Centos发送邮件

Centos发送邮件

SMTP 的哪些实现通常处理邮件数据以响应 DATA 之后的 RSET?

使用 python 发送邮件 - 如何设置与“发件人”地址不同的返回路径

ubuntu安装邮件发送

AWS-SES:如何设置发件人地址的显示名称