跳到主要内容

3.5. 报告投递

Mail Receiver 在准备好 report 后, MUST 按给定顺序评估所提供的 reporting URIs. 参见 [RFC9989]. 如果任何 URI 格式错误, 则 SHOULD 忽略它们. MUST 尝试向每个剩余 URI 投递 aggregate report, 直到达到 Receiver 对受支持 URIs 的限制.

如果由于已发布 URIs 所通告的服务无法接受 reports 而不能投递, 例如 URI 指向不可达服务, Mail Receiver MAY 缓存该数据并稍后重试, 或者 MAY 丢弃无法发送的数据.

当 "rua" tag 中指定的 URI 未另行说明时, 生成 feedback report 的 Mail Receiver SHOULD 使用安全传输机制, 即 report 应通过采用 TLS 的 channel 投递 (SMTP+STARTTLS).

3.5.1. Report-ID 的定义​

此 identifier 对发送到同一 domain 的 reports MUST 唯一, 以便 receivers 在 duplicate reports 发生时识别它们. Report-ID 值应使用以下 ABNF 构造:

ridfmt =  (dot-atom-text ["@" dot-atom-text]) ; from RFC 5322

ridtxt = ("<" ridfmt ">") / ridfmt

此处指定的格式并不非常严格, 因为核心目标是唯一性. 为了创建这种唯一性, Mail Receiver 可能希望组合使用 receiving domain, sending domain, timestamp 等元素. 示例字符串可以是 "[email protected]". 另一种形式可以使用日期字符串, 例如 "[email protected]".

3.5.2. Email​

Mail Receiver 生成的消息 MUST 如 [RFC5322] 所述, 并按 [RFC2045] 格式化. aggregate report 本身 MUST 包含在消息的某个 part 中, 作为带有下列相应 media type 的 attachment. MAY 将 human-readable annotation 作为 body part 包含在内, 并使用面向人类友好的 content-type, 例如 "text/plain" 或 "text/html".

aggregate data MUST 是 XML file, 且 SHOULD 经 GZIP [RFC1952] 压缩. 拒绝应用压缩可能导致 report 过大而 receiver 无法处理, 例如 total message size 可能超过 receiver SMTP size limit. 执行压缩会以一定计算成本提高 report 被接受的概率. 如果经过压缩, aggregate data MUST 使用 media type "application/gzip" 呈现. 参见 [RFC6713]. 否则 MUST 使用 "text/xml". attachment filename MUST 使用以下 ABNF 构造:

filename = receiver "!" policy-domain "!" begin-timestamp
"!" end-timestamp [ "!" unique-id ] "." extension

receiver = domain-name
; imported from RFC 6376

policy-domain = domain-name

begin-timestamp = 1*DIGIT
; seconds since 00:00:00 UTC January 1, 1970
; indicating start of the time range contained
; in the report

end-timestamp = 1*DIGIT
; seconds since 00:00:00 UTC January 1, 1970
; indicating end of the time range contained
; in the report

unique-id = 1*(ALPHA / DIGIT)

extension = "xml" / "xml.gz"

以下使用但未另行指定的 primitive tokens 取自 "Core Rules" ([RFC5234] Appendix B.1): DIGIT, ALPHA.

extension 对于普通 XML file MUST 为 "xml", 对于使用 GZIP 压缩的 XML file MUST 为 "xml.gz".

"unique-id" 允许 Mail Receiver 生成可选的唯一 ID, 以区分同一 Domain Owner 内不同来源同时生成的多个 reports. 一个可行选项是探索 Universally Unique Identifiers (UUIDs) [RFC9562].

如果 report generator 需要重新发送 report, 系统 MUST 使用与原始 report 相同的 filename. 这将允许 receiver 覆盖原始数据, 或丢弃 report 的第二个实例.

例如, 以下是从 Mail Receiver "mail.receiver.example" 发往 Domain Owner "example.com" 的 report gzip file 示例 filename:

mail.receiver.example!example.com!1013662812!1013749130.xml.gz

消息正文不要求特定 MIME message structure. 假定 aggregate reporting address 将能够提取具有规定 media type 和 filename 的 body parts, 并忽略其余部分.

承载 DMARC feedback data 的 mail streams MUST 符合 DMARC mechanism, 从而产生 aligned "pass". 参见 [RFC9989] Section 4.4. 这种做法可最大限度降低 Report Consumers 处理欺诈 reports 的风险.

单个 report submissions 的 RFC5322.Subject field MUST 符合以下 ABNF:

; FWS is imported from RFC 5322
dmarc-subject = %s"Report" 1*FWS %s"Domain:"
1*FWS domain-name 1*FWS ; policy domain
%s"Submitter:" 1*FWS
domain-name 1*FWS ; report generator
[ %s"Report-ID:" 1*FWS ridtxt ] ; defined above

第一个 domain-name 表示生成 report 所针对的 DNS domain name. 第二个 domain-name 表示生成 report 的 Mail Receiver 所代表的 DNS domain name. 该 field 中 Report-ID: 部分的目的是使 Domain Owner 能够识别并忽略 Mail Receiver 可能发送的 duplicate reports.

例如, 以下是从 Mail Receiver "mail.receiver.example" 发往 Domain Owner "example.com" 的 report 的可能 Subject field. 它按照 [RFC5322] 允许的方式折叠:

Subject: Report Domain: example.com
Submitter: mail.receiver.example
Report-ID: <[email protected]>

当 feedback data size 超过 generator 或 consumer 允许的最大 attachment sizes 时, 此 transport mechanism 可能遇到问题.

可选地, report sender MAY 选择将同一 "ridtxt" 用作 report 所含 RFC5322.Message-Id header 的一部分或全部. 这样做可以帮助 receivers 区分某条消息是 re-transmission 还是 duplicate report.

3.5.3. 其他方法​

按现有写法, 本规范允许在后续版本中添加对其他已注册 URI schemes 的支持.

3.5.4. Duplicates 的处理​

可能出现 report generator 尝试向 receiver 投递 duplicate information 的情况. 这可能表现为 report 的完全重复, 或两个 reports 之间的信息重复. 在这些情况下, 如何处理 duplicate data 的决定权属于 receiver. 如上所述, sender 在发送 report 时 MUST 使用相同的 unique identifiers. 这使 receiver 能更好地理解何时发生 duplicates.

以下是处理该 duplicate information 的几个选项:

  • 向 sender 拒绝, 理想情况下带有说明 duplicate receipt 的 permfail error.

  • 收到后丢弃.

  • 检查内容以评估 timestamps 和 reported data, 并采取适当行动.

  • 接受 duplicate data.

接受数据时, duplicate data 很可能尚未被注意到, 且属于一次性体验. 长期 duplicate data 并不理想. 在 partial time frame overlap 的情况下, 没有明确方法区分 overlap 的影响. receiver 需要整体接受或拒绝 duplicate data.