RFC 9990(Sieve Email Filtering: DMARC Reject Codes)是什么?它给接收方提供了哪些新的过滤信号?
RFC 9990 是 DMARCbis 标准集中一个相对轻量但非常重要的扩展。它扩展了 Sieve 邮件过滤语言(RFC 5228),允许邮件接收方根据 DMARC 验证结果中具体的失败原因编写更精细的过滤规则。这相当于将 DMARC 评估从"通过/失败"的二元结果升级为具有丰富诊断信息的"结构化结果"。
一、背景:为什么需要 RFC 9990?
在 RFC 7489 时代,接收方只能通过 DMARC 的二元结果(pass / fail)配合策略(none / quarantine / reject)来决定邮件处理。但这种粗粒度决策存在以下问题:
- 无法区分"SPF 对齐失败"和"DKIM 对齐失败",导致管理员难以定位问题根源
- 无法区分"因邮件转发(forwarding)导致的认证失败"和"真实的伪造攻击"
- Sieve 脚本无法根据 DMARC 的失败子类型做差异化的垃圾邮件评分
- 企业级邮件过滤需要更细粒度的响应策略(如"SPF 失败时隔离、DKIM 失败时放行")
RFC 9990 正是为了解决这些问题而设计的。
二、RFC 9990 定义的新 Sieve 扩展
RFC 9990 定义了一个新的 Sieve 能力字符串 :dmarc-reject 和相应的测试命令。核心语法如下:
require [":dmarc-reject"];
if dmarc :reject-code ["dmarc-reject", "dmarc-forwarding"] {
discard;
stop;
}
定义的拒绝码(Reject Codes)
RFC 9990 规范定义了一组标准化的 DMARC 拒绝码:
| 拒绝码 | 含义 | 行动建议 |
|---|---|---|
| dmarc-reject | DMARC 验证失败且域策略要求拒绝 | 丢弃/拒绝邮件 |
| dmarc-quarantine | DMARC 验证失败且策略要求隔离 | 放入垃圾邮件文件夹 |
| dmarc-failed | DMARC 验证失败但策略为 none | 标记但放行,用于监控 |
| dmarc-forwarding | 认证失败系因邮件转发链导致(与 ARC 交互后判定) | 酌情处理,通常放行 |
| dmarc-spf-fail | SPF 对齐失败 | 可选隔离,记录告警 |
| dmarc-dkim-fail | DKIM 对齐失败 | 可选隔离,记录告警 |
| dmarc-both-fail | SPF 和 DKIM 均未对齐 | 采取较高等级的行动 |
三、接收方如何使用这些新信号
1. 差异化策略实施
企业邮件网关可以根据拒绝码实施不同的响应:
require [":dmarc-reject", "fileinto", "reject"];
if dmarc :reject-code "dmarc-both-fail" {
reject "550 5.7.1 DMARC policy violation - both SPF and DKIM failed";
} elsif dmarc :reject-code "dmarc-spf-fail" {
fileinto "INBOX.Suspicious";
} elsif dmarc :reject-code "dmarc-forwarding" {
fileinto "INBOX";
# 转发邮件通常放行
}
2. 垃圾邮件评分调整
MTA 或 MDA 可以在垃圾邮件评分系统中增加基于 DMARC 拒绝码的打分规则:
- dmarc-reject → +5 分(极高风险)
- dmarc-both-fail → +4 分
- dmarc-forwarding → -1 分(降低评分,信任转发链路)
- dmarc-spf-fail → +2 分(中等风险)
3. 日志和报警改进
管理员可以在邮件日志中根据拒绝码建立更精确的监控系统:
- dmarc-forwarding 高频出现 → 可能转发配置有问题
- dmarc-spf-fail 突增 → SPF 记录过期或发信 IP 变更
- dmarc-reject 来自不常见源 IP → 可能是假冒攻击
四、RFC 9990 与现有邮件过滤体系的关系
RFC 9990 不是要替代现有的垃圾邮件过滤(SpamAssassin、Rspamd 等),而是提供一个新的信号维度。接收方可以将 DMARC 拒绝码作为过滤规则的输入之一,与已有的反垃圾邮件评分体系协同工作。
对 Sieve 环境的兼容性:RFC 9990 要求邮件接收方的 Sieve 实现(如 Dovecot Pigeonhole、ManageSieve)支持 :dmarc-reject 扩展。管理员需要确保 MTA/MDA 软件版本达到以下最低要求:
- Dovecot Pigeonhole 0.5+(需包含 dmarc-reject 插件)
- 其他实现如 Cyrus Sieve 也需相应更新
五、部署建议
- 检查你的邮件服务器 Sieve 实现是否支持
:dmarc-reject扩展 - 从简单的拒绝码监控开始——在 Sieve 脚本中添加日志规则,记录 dmarc-forwarding 等码的出现频次
- 逐步引入差异化策略:对 dmarc-both-fail 直接拒绝,对 dmarc-forwarding 放行
- 与现有的 DMARC 报告分析联动——使用 RFC 9991 报告的 pcf 字段验证拒绝码的使用效果
参考文献
- RFC 9990 — Sieve Email Filtering: DMARC Reject Codes (2026)
- RFC 5228 — Sieve: An Email Filtering Language
- RFC 9989 — DMARCbis Core Specification
- Dovecot Pigeonhole Sieve Plugin Documentation
引用格式:ztpop.net 邮件技术知识库. "RFC 9990 Sieve Email Filtering: DMARC Reject Codes 是什么?" https://www.ztpop.net/kb/faq/dmarcbis-faq-03.html. 2026-07-29. CC-BY 4.0