【问题标题】:How to set the From email address for mailx command?如何设置 mailx 命令的发件人电子邮件地址?
【发布时间】:2010-11-20 18:50:01
【问题描述】:

我正在编写一个在 Solaris 服务器上运行的 KornShell (ksh) 脚本,该脚本会在满足错误条件时发送一封电子邮件。我通过mailx 发送电子邮件。

问题:如何在mailx 命令中设置“发件人”电子邮件地址?

当前代码:

echo ${msg_txt} | mailx -s "Script Failure" ${to_email}

注意:该命令可以正常工作,但是,“发件人”是我正在运行脚本的用户的名称,我希望将其发送到另一个电子邮件地址。

我将如何做到这一点?

【问题讨论】:

    标签: shell email solaris ksh mailx


    【解决方案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://stackoverflow.com/a/29826988/253139https://stackoverflow.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
        

        【讨论】:

        • 这并不能完全回答问题
        猜你喜欢
        • 2011-01-17
        • 1970-01-01
        • 2012-04-23
        • 2014-05-27
        • 1970-01-01
        • 2013-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多