如何让 Sendmail 向所有收到的电子邮件中添加信封收件人标头?

如何让 Sendmail 向所有收到的电子邮件中添加信封收件人标头?

免责声明:我读过这里和其他地方的一些问题和文章,它们涉及 Sendmail 重写标头。我没有找到以下问题的答案,因为其他问题主要与重写标题(而不是添加它们),并且几乎所有这些都与出站信息和信封发件人(而不是信封收件人)。

话虽如此:

我正在运行邮件服务器,使用 Debian jessie 下的 Sendmail 8.14.4。

有些邮件收件人地址与同一个操作系统用户账户对应,当相应的操作系统用户阅读邮件时,无法确定邮件最初发送到哪个电子邮件地址。

因此,我希望让 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 年,所以我想避免这种情况,因此我希望有一个简单的解决方案,或者有人可以给我指明正确的方向。说实话,目前编写一个邮件过滤器来解决我的问题对我来说似乎比重新学习 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

答案1

您的问题已在 Sendmail.org FAQ 3.29 中得到解决

3.29 当虚拟域中的多个用户转到单个邮箱时,如何添加指定实际收件人的标头?

简短版本:使用 virtusertable 和~offers/.procmailrc

虚拟用户表:

[email protected]  offers+offer1
[email protected]  offers+offer2

~offers/.procmailrc应获得“更多细节” $1
或者
您可以在自定义标题中使用 $h(设置为 +detail)

警告:您将获得/处理一封邮件的两份副本,该邮件的地址[email protected][email protected]

答案2

您的建议违反了 SMTP 协议:尽管地址在或标头RCPT TO中不存在,但仍有正当理由将地址添加到命令中,即To:Cc:RFC 5321 7.2。“盲”抄(重点是我的):

由于多种原因,未出现在邮件头部分的地址可能会出现在 SMTP 服务器的 RCPT 命令中。最常见的两种情况是将邮件地址用作“列表爆炸器”(解析为多个地址的单个地址)和出现“密件抄送”。尤其是当存在多个 RCPT 命令时,为了避免违背这些机制的某些目的,SMTP 客户端和服务器不应将完整的 RCPT 命令参数复制到标头部分,无论是作为跟踪标头字段的一部分,还是作为信息或私有扩展标头字段。由于此规则在实践中经常被违反,并且无法强制执行,因此,知道“bcc”使用的发送 SMTP 系统可能会发现将每个密件抄送作为仅包含单个 RCPT 命令的单独消息事务发送会很有帮助。

SMTP 事务(“信封”)中的“反向”(来自 MAIL、SAML 等命令)或“转发”(RCPT)地址与标头部分中的地址之间没有固有关系。接收系统不应尝试推断此类关系并使用它们来更改要传递的邮件的标头部分。 流行的Apparently-to标头字段违反了这一原则,并且是意外信息泄露的常见来源,不应使用。

不推荐的Apparently-to标题由选项控制NoRecipientAction=action

设置当邮件中没有收件人标头(To:Cc:或 )时要采取的操作:Bcc:

  • none信息保持不变,
  • add-to添加To:带有收件人的标题,
  • add-apparently-to添加Apparently-To:带有收件人的标题,
  • add-bcc添加一个空的Bcc:标题,并且
  • add-to-undisclosed 添加标题阅读'To: undisclosed-recipients:;'

请注意,通常原始收件人地址已在To:Cc:标头中。它不应被修改为用户帐户名称offers,因此它要么是[email protected][email protected]要么是隐藏的。重写标头变得更加危险,因为它还可能破坏 DKIM 签名。唯一合理的用例是针对具有本地来源(user[email protected])的邮件进行地址重写。


添加所有地址的列表RCPT TO会违反协议,但实际上你只需要单一原始RCPT TO地址邮件已送达的用户。我不知道如何使用 Sendmail 实现这一点,但是后缀(使用默认配置)添加X-Original-To:标题正好包含该内容,另外还有一个Delivered-To:包含内部目标邮箱的标题([email protected])。

相关内容