更改Unix中“mail”的“From:”地址

104
使用Unix命令行发送邮件mail TO_ADDR结果为来自$USER@$HOSTNAME的邮件。有没有一种方法可以更改mail插入的“发件人:”地址?
记录一下,我在Ubuntu上使用GNU Mailutils 1.1/1.2(但我在Fedora和RHEL上看到了相同的行为)。
$ mail -s Testing chris@example.org                                                                  
Cc: 
From: foo@bar.org
Testing .
结果为:
主题:测试
收件人:<chris@example.org>
X-Mailer:mail(GNU Mailutils 1.1)
Message-Id:<E1KdTJj-00025z-RK@localhost>
发件人:<chris@localhost>
日期:2023年3月11日 星期六 下午9:28:13
From: foo@bar.org
测试
“From: foo@bar.org”行是消息正文的一部分,而不是标题的一部分。

1
这是哪种Unix版本?以及使用的邮件版本是什么?只是想知道哪里出了问题。 - Vinko Vrsalovic
哦,但是抱歉,我在运行GenToo。 - Thomas Kammeyer
man mail-r address设置发件人地址。覆盖环境或启动文件中指定的任何发件人变量。 - Kellen Stuart
mail这样的古老命令的问题在于每个版本都有不同的API。不同的实现可能会基于环境变量$USER$HOSTNAME$EMAIL设置From,或者期望您使用-f-F-a-r标志。当然,每个标志都与其他某个版本不兼容。例如,-a对于一个实现意味着添加一个新的标题,而对于另一个实现则意味着添加一个MIME附件文件。POSIX仅定义了mailx和仅限于-s标志:https://pubs.opengroup.org/onlinepubs/9699919799/utilities/mailx.html - Mikko Rantalainen
如果你想使用GNU Mailutils,那么你应该写类似于mail.mailutils -a "From: user@domain.com" -s "Subject line here" "receiver@example.com"这样的代码,而不是使用可能具有任意API的mail - Mikko Rantalainen
显示剩余3条评论
20个回答

118

在我的邮件版本(Debian Linux 4.0)中,以下选项可用于控制发送/回复地址:

  • -a开关,用于应用附加标头,在命令行上提供一个From:标头,该标头将附加到传出邮件标头中。
  • $REPLYTO环境变量指定了一个Reply-To:标头。

因此,以下操作序列:

export REPLYTO=cms-replies@example.com
mail -aFrom:cms-sends@example.com -s 'Testing'

在我的邮件客户端中,结果是一封来自 cms-sends@example.com 的邮件,任何回复都将默认发送至 cms-replies@example.com。

NB: Mac OS 用户:您没有 -a,但您有 $REPLYTO

NB(2): CentOS 用户,许多评论员已经补充说明,您需要使用 -r 而不是 -a

NB(3): 这个答案至少有十年的历史,请在从 Google 进入时注意这一点。


我刚刚在这里再次测试了一下,对我来说它运行良好。并非所有的邮件客户端都能很好地处理“回复至”功能,但我认为这个问题现在应该已经解决了。“REPLYTO”环境变量在man页面中有提到,其他UNIX邮件客户端也会遵守它,比如emacs等。不过,我猜你已经找到了解决方法。 - cms
我不认为这是邮件客户端的问题...我在原始消息文本中没有看到回复头。但是,是的,-a就足够了。 - Chris Conway
1
不,它不会。但是:“由于许可证原因,在Debian系统中无法获得完整的GNU mailutils手册。” -aReply-To:...有效。 - Chris Conway
这在Ubuntu上对我有效,但在CentOS上出现“mail: invalid option -- a”的错误。 - dave1010
4
在CentOS中,mail -a选项表示“附件”。我需要使用-r,就像这样mail -r from@whatever.com - equivalent8
显示剩余2条评论

42

在Centos 5.3上,我能够执行以下操作:

mail -s "Subject" user@address.com -- -f from@address.com < body
双破折号可以防止邮件解析 -f 参数,并将其传递给 sendmail。

6
无效。现在添加了3个地址到地址列表中,包括收件人地址、发件人地址和本地域名。 - shorif2000
3
能帮忙吗?这个以前是可以用的,但最近更新后就不能用了,它只是尝试额外发送一封邮件到-f@hostname。 - Wil
1
不适用于CentOS 6.3。请尝试下面@ubuntu-fanboy的答案,使用-r标志。 - skytaker

28

GNU mailutils的'mail'命令不能很容易地让您做到这一点。 但是,如果您安装了'heirloom-mailx',那么它的mail命令(mailx)具有'-r'选项,可以覆盖默认的“$USER@$HOSTNAME”发件人字段。

echo "Hello there" | mail -s "testing" -r sender@company.com recipient@company.com

对于“mailx”有效,但对于“mail”无效。

$ ls -l /usr/bin/mail
lrwxrwxrwx 1 root root 22 2010-12-23 08:33 /usr/bin/mail -> /etc/alternatives/mail
$ ls -l /etc/alternatives/mail
lrwxrwxrwx 1 root root 23 2010-12-23 08:33 /etc/alternatives/mail -> /usr/bin/heirloom-mailx

7
或许有用的是,GNU mailutils中的mail命令在Ubuntu 14.04 LTS上预装了-r选项,因此您可以轻松设置发件人地址。 - gerlos
我已在Debian 9.11上进行了测试,该选项也有效。 - Fedir RYKHTIK

16
mail -s "$(echo -e "This is the subject\nFrom: Paula <johny@paula.com>\n
Reply-to: 1232564@yourserver.com\nContent-Type: text/html\n")" 
milas.josh@gmail.com < htmlFileMessage.txt

以上是我的解决方案...任何额外的标题可以在发件人之后、回复之前添加...只需确保在添加之前了解您的标题语法...这对我完美地起作用了。


1
这个例子对我来说是有效的。当我更改电子邮件地址主题等时,所有标题都会显示出来? - bsmoo
这是在我的MacOS(Monterey)上通过“From:<address>”头部传递的唯一方法,感谢您的提示! - Arul Selvan

8

此外,最好使用-F选项来指定发件人的名称。

就像这样:

mail -s "$SUBJECT" $MAILTO -- -F $MAILFROM -f ${MAILFROM}@somedomain.com

或者只需查看可用选项:http://www.courier-mta.org/sendmail.html

5

我从以上所有答案中得出了这个方法。当我尝试每一个答案时,它们都没有起作用。通过结合所有以上的答案进行大量试错,最终得出了这个结论。我不确定这是否适用于你,但在Ubuntu 12.04和RHEL 5.4上对我有用。

echo "This is the body of the mail" | mail -s 'This is the subject' '<receiver-id1@email.com>,<receiver-id2@email.com>' -- -F '<SenderName>' -f '<from-id@email.com>'

通过添加任意数量的接收者ID,可以向任意数量的人发送邮件,邮件由 SenderName from-id@email.com 发送。

希望这可以帮到您。


这个不起作用于 /usr/bin/mail,也许你的命令是针对 sendmail 的。 - basZero

5

您也可以使用以下方式设置发件人名称和邮箱地址:

 echo test | mail -s "test" example@example.com -- -F'Some Name<example2@example.com>' -t

出于某种原因,传递-F'名称'-fexample2@example.com不起作用,但是在sendmail中传递-t起作用且“容易”。


4

我不知道其他操作系统是否相同,但在OpenBSD中,mail命令的语法如下:

mail to-addr ... -sendmail-options ...

sendmail有一个-f选项,您可以在其中指定FROM:字段的电子邮件地址。以下命令适用于我。

mail recepient@example.com -f from@example.com

对我来说没问题!(也适用于OpenBSD -- MacBook Pro。) - Aeonaut
1
更新--电子邮件接收者在from@example.com之前仍然看到我的本地帐户名--例如,“Aeonaut from@example.com”。有任何想法如何更改这个? - Aeonaut
3
对我来说不起作用(OS X Mountain Lion)。“邮件:无法同时指定 -f 选项和收件人。” - Jonny

4

以下是一些选项:

  • 如果您拥有足够的权限,请使用generics表配置sendmail以进行重写

  • 自己编写整个头文件(或将其发送给自己,保存包含所有标头的整个消息,并重新编辑,然后使用命令行中的rmail发送它)

  • 直接使用sendmail发送邮件,使用“-f”命令行标志,并不在您的消息中包括“From:”行

这些选项并非完全相同,但我会让您进一步了解它们。

在我的移动设备上,我使用sendmail作为客户端进行身份验证,连接到一个发件人电子邮件服务器,并使用generics将返回的邮件发送到另一个帐户。这很好用。 我使用fetchmail聚合收件箱中的邮件。


3
感谢BEAU
mail -s "Subject" user@address.com -- -f from@address.com

我刚刚发现这个方法,对我很有效。CentOS 5上的邮件8.1手册没有提到这一点。对于-f选项,手册中说:

-f 从文件操作数指定的文件中读取消息,而不是系统邮箱。(另见folder)如果未指定文件操作数,则从mbox而不是系统邮箱中读取消息。

总之,这个方法非常好用,谢谢。


1
“-f” 在您的示例中当然不是 “mail” 的选项,因为它前面有 “--”。该选项将移交给您的 MTA。 - Anthon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接