我正在使用 Procmail 将邮件转发到另一台服务器。我经常从收件人服务器收到错误消息:
host smtp-in.orange.fr[80.12.26.32] said: 501 5.2.0
y8XgrepnBNXb2 Mail rejete. Mail rejected. DMARC check failed. OFR_515 [515]
(in reply to end of DATA command)
这是我的 Procmail 配置中的相关片段:
:0 c
* (^TO_|X-Original-To:.*)[email protected]
* <46000000
{
:0 hfw
* ^Subject:\/.+
| formail -I "Subject: FORWARDED:$MATCH"
:0 a
! [email protected]
}
发件人的 DMARC 记录为:
dmarc is: v=DMARC1; p=reject; sp=reject; rua=mailto:[email protected];
以下是 DMARC 详细信息(编者注:显然是针对我自己的域):
_dmarc.myserver.com
v=DMARC1; p=none; sp=none; fo=1; ri=86400; rua=mailto:[email protected],mailto:[email protected]; ruf=mailto:[email protected],mailto:[email protected]
DMARC 失败取决于标头中我们看不到的功能。
DMARC取决于原始发件人设置的策略。在这个特定的例子中,我猜测他们不希望他们的消息被转发,要么是因为他们的策略配置中的疏忽,要么是因为他们真的想禁止它(实际上是因为他们认为这是一个可以接受的代价)禁止某些类型的伪造)。
避免这些问题的一个简单但可能不可接受的方法是将转发的消息嵌入到新消息中;或者尝试不要修改您转发的消息。如果由于底层 SPF 故障而发生 DMARC 故障,也许最简单的修复方法也是更新
From:
标头(但这取决于对发生的情况以及您希望发生的情况的多种猜测)。这应该会绕过 DMARC 故障,因为您不再让它看起来好像您试图在未经原始域批准的情况下“从:”发送邮件。
更详细地说,您引用的 DMARC 记录仅指定应如何处理 DMARC 故障;但总体症状表明,收件人域不允许外部发件人
From:
通过更详细地指定此策略的SPF记录在标头中使用其域名。不幸的是,SPF 中没有机制可以说“除非您转发的消息确实是来自我们的”;事实上,缺乏转发支持是对 SPF 的常见批评之一。From:
但对于许多目的,您可以通过将标头替换为您可以控制的标头(然后也许将原始From:
标头放入 中X-Original-From:
,就像本食谱所做的那样)来轻松解决这个问题。替换标头通常还会破坏任何DKIM签名,这是 DMARC 集成的另一种机制。如果您关心 DKIM 完整性,您的转发服务器可能会用您自己的 DKIM 包装器替换原始 DKIM 包装器,然后该包装器将再次围绕原始发件人的 DMARC 和 DKIM 策略中表达的首选项进行工作。
如果没有 SPF 和 DKIM 记录的副本以及邮件的实际标头,这必然是一个高级概述;但我提出的解决方案应该可以解决您所询问的问题。