我正在使用 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 为:v=DMARC1; p=reject; sp=reject; rua=mailto:[电子邮件保护];
谢谢您的回答。以下是 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]
欢呼迈克
答案1
DMARC 失败取决于我们无法看到的标头中的特性。
DMARC取决于原始发件人设置的策略。在这个特定情况下,我猜他们不希望他们的邮件被转发,要么是因为他们的策略配置存在疏忽,要么是因为他们真的想禁止转发(实际上,因为他们认为这是禁止某些类型的伪造行为的可接受代价)。
避免这些问题的一个简单但可能不可接受的方法是将转发的消息嵌入到新消息中;或者尝试不修改您正在转发的消息。如果 DMARC 失败是由于底层 SPF 失败而发生的,那么最简单的解决方法可能是From:
也更新标头(但这取决于对发生的事情以及您希望发生的事情的多次猜测)。
:0 c
* (^TO_|X-Original-To:.*)root@myserver\.com
* <46000000
* ^From:\/.+
{
FROM=$MATCH
:0 hfw
* ^Subject:\/.+
| formail -I "Subject: FORWARDED:$MATCH" \
-I "X-Original-From:$FROM" \
-I "From: You <[email protected]>"
:0 a
! [email protected]
}
这应该可以绕过 DMARC 故障,因为您不再使其看起来好像您正在尝试在未经其批准的情况下尝试从原始域“发送”消息“来自:”。
更详细地说,您引用的 DMARC 记录仅指定了应如何处理 DMARC 故障;但总体症状表明收件人域不允许外部发件人在标头中使用其域名From:
,通过防晒指数记录更详细地指定了此策略。不幸的是,SPF 中没有机制说“除非您正在转发真正来自我们的消息”;事实上,它缺乏转发支持是针对 SPF 的常见批评之一。但对于许多目的,您可以通过将标头替换From:
为您有控制权的标头(然后可能将原始标头放入From:
,X-Original-From:
就像此配方一样)轻松解决这个问题。
更换标题也经常会破坏任何密钥管理信息系统签名,这是 DMARC 集成的另一种机制。如果您关心 DKIM 完整性,您的转发服务器可能会将原始 DKIM 包装器替换为您自己的包装器,然后该包装器将再次绕过原始发件人的 DMARC 和 DKIM 策略中表达的首选项。
如果没有 SPF 和 DKIM 记录以及邮件的实际标头的副本,这必然是一个高级概述;但我提出的解决方案应该可以解决您所询问的问题。