免责声明:我在这里和其他地方阅读了一些有关 Sendmail 重写标头的问题和文章。我还没有找到下面问题的答案,因为另一个问题主要与重写标头(而不是添加标头)有关,而且几乎所有标头都与出站消息和信封发件人(而不是信封收件人)有关。
说了这么多:
我正在运行一个邮件服务器,在 Debian jessie 下使用 Sendmail 8.14.4。
有一些电子邮件收件人地址映射到同一个 O/S 用户帐户。当相应的 O/S 用户阅读这些消息时,他无法确定这些消息最初是发送到哪个电子邮件地址的。
因此,我想让 Sendmail 将包含信封收件人的自定义标头添加到所有入站电子邮件中。
我想我可以通过例子更好地解释我的问题:
假设我有两个电子邮件地址,[email protected]
并且[email protected]
. 两者都映射到 O/S 用户帐户offers
。到目前为止,这是可行的:O/S 用户offers
在获取他的电子邮件时,会获取发送到[email protected]
和的所有消息[email protected]
。
现在的问题是他无法确定每条消息最初发送到哪个电子邮件地址。这意味着:尽管他看到了所有已发送到两个电子邮件地址的邮件,但他无法判断某条邮件最初是发送到[email protected]
还是发送到[email protected]
。
因此,我想为每个入站消息添加一个自定义标头,可能是这样的:X-Envelope-Recipient: <Original envelope recipient>
.
最简单的方法是什么?
曾几何时,我为 Sendmail 编写了一些简单的自定义规则。但是从那时起已经过去了将近 15 年,所以我想避免这种情况,因此我希望有一个简单的解决方案,或者有人可以为我指明正确的方向。老实说,目前写一个 milter 来解决我的问题对我来说似乎比重新学习 Sendmail 的规则语法更容易......
编辑 1
根据@AnFi 的要求,这里是 sendmail.cf 中的本地邮件程序定义:
Mlocal, P=/usr/lib/sm.bin/mail.local, F=lsDFMAw5:/|@qPSXnz9, S=EnvFromSMTP/HdrFromL, R=EnvToL/HdrToL,
T=DNS/RFC822/SMTP,
A=mail.local -l -h inbox
您的建议将反对 SMTP 协议:尽管在or标头
RCPT TO
中不存在地址,但仍有正当理由将地址添加到命令中,即RFC 5321 7.2。“盲”副本(重点是我的):To:
Cc:
不推荐的
Apparently-to
标头由 option 控制NoRecipientAction=action
。请注意,通常原始收件人地址已经在
To:
orCc:
标头中。它不应该被修改为用户帐户名offers
,所以它要么是[email protected]
,[email protected]
要么是隐藏的。重写标头变得更加危险,因为它还可能破坏 DKIM 签名。唯一合理的用例是使用本地来源 (user
to[email protected]
) 的邮件的地址重写。添加所有
RCPT TO
地址的列表会违反协议,但实际上您只需要邮件发送到的用户的单个原始RCPT TO
地址。我不知道如何使用 Sendmail 来实现这一点,但Postfix(使用默认配置)添加了一个X-Original-To:
包含该内容的标头,另外还添加了一个Delivered-To:
包含内部目标邮箱 ([email protected]
) 的标头。您的问题是 Sendmail.org FAQ 3.29 的地址
短版:使用 virtusertable 和
~offers/.procmailrc
虚拟用户表:
~offers/.procmailrc
应该在$1
.或者
您可以在自定义标题中使用 $h(设置为 +detail)
警告:您将获取/处理发送给两者的消息的两个副本,
[email protected]
并且[email protected]