# ============================================================================
# DMARC 记录模板（RFC 9989 风格）
#
# 记录名固定是 _dmarc.<你的域>，类型 TXT。
# 一条就够 —— 子域没记录时会沿着 DNS 树向上继承。
#
# 四个阶段的写法在下面对应四段。**按顺序走，不要跳。**
# 跳段的典型后果：直接上 p=reject，把所有没签 DKIM 的链路当场打断，
#                 而你还没拿到「有哪些发信源」的清单。
# ============================================================================


# ---------------------------------------------------------------------------
# 阶段 0 · 观测（从这里开始，最少跑 30 天）
# ---------------------------------------------------------------------------
v=DMARC1; p=none; rua=mailto:dmarc@your.com
#
# p=none 的含义不是「暂时不配」，是「我要求接收方只报告、不处置」。
# 这个阶段你能拿到：每天一份聚合报告，列出每台发信我的域的 IP、通过率、对齐结果。
#
# 注意：p=none 期间那些失败的信**已经投进了对方收件箱**。
#      报告里的「可疑」源是真的在发信，不是「被拦住了」。

# 想收失败报告吗？加 ruf=，但要知道它是**每封失败都发一封邮件**：
#   v=DMARC1; p=none; rua=mailto:dmarc@your.com; ruf=mailto:dmarc@your.com; fo=1
# 观测期不建议开 —— 它会把邮箱淹掉，而 rua 已经包含同样的信息。


# ---------------------------------------------------------------------------
# 阶段 1 · 灰度（清单基本齐了，开始处置）
# ---------------------------------------------------------------------------
v=DMARC1; p=quarantine; sp=quarantine; rua=mailto:dmarc@your.com
#
# quarantine = 失败的进垃圾箱（不丢，但也不进收件箱）。
# 这一步的价值：万一还有没发现的发信源，它的信进垃圾箱而不是被拒，
#             你还有机会从业务反馈里发现「客户说没收到」。


# ---------------------------------------------------------------------------
# 阶段 2 · 收紧（清单完整 + 30 天无异常失败）
# ---------------------------------------------------------------------------
v=DMARC1; p=reject; sp=reject; np=reject; rua=mailto:dmarc@your.com
#
# ---------------- 三个 tag 逐一说明 ----------------
# p=reject     主域策略：直接拒
# sp=reject    子域策略。缺省等于 p —— 但如果你的营销子域需要宽松处理，
#              就在这里单独写 sp=quarantine，而不是让整个域放宽。
#              注意：sp 只对本记录的「下一级子域」生效。
#              子域自己有条 _dmarc 时，它的 sp 管的是再下一级。
# np=reject    「不存在的子域」策略（RFC 9989 新增）。
#              **没有它，p=reject 保护不到不存在的子域** ——
#              攻击者从 invoice@anything.your.com 发信就绕开了。
#              ⚠ RFC 9989 是 2026-05 发布的，大量接收方还没实现 np。
#                所以它是「渐进增强」，不能当成「加上就安全了」。


# ---------------------------------------------------------------------------
# 阶段 3 · 严格对齐（可选，且只在你能列出所有子域时才用）
# ---------------------------------------------------------------------------
v=DMARC1; p=reject; sp=reject; np=reject; adkim=s; aspf=s; rua=mailto:dmarc@your.com
#
# adkim=s / aspf=s 要求签名域（或 MAIL FROM 域）与 From 域**逐字相同**。
# 只要有一个子域在发信、而它的 DKIM d= 是主域，就会**全部失配**。
# 用之前先跑：
#   python scripts/auth_audit.py --domain mail.your.com    # 每个子域单独查一遍
# 拿不准就用默认的 r（放宽：只比组织域）。


# ============================================================================
# tag 速查
# ============================================================================
#
#   v      必须 DMARC1，必须是第一个 token
#   p      必须显式写。none / quarantine / reject
#   sp     子域策略，缺省 = p。只对「本记录的下一级子域」生效
#   np     不存在子域的策略（RFC 9989）。缺了就没保护
#   adkim  r（默认，比组织域） / s（比完整域）
#   aspf   r（默认） / s
#   rua    聚合报告收件地址。**不配就永远看不到报告**
#   ruf    失败报告收件地址。观测期别开
#   fo     何时发 ruf：0（SPF 失败）/ 1 / d / s。RFC 9989 已移出核心
#   pct    只对百分之几执行。**RFC 9989 已删除**，见下
#   t      测试模式 y/n（RFC 9989 新增）。取代 pct
#   psd    公共后缀标记 y/n/u（RFC 9989 新增）。普通域名不用写
#
# ⚠ pct 已经不是「兼容性差异」，是「执行强度差异」：
#     p=reject; pct=25
#     → 旧接收方：只拒 25% 的失败邮件
#     → 新接收方：忽略 pct，全量拒绝
#   灰度请改用 t=y。看到 pct / rf / ri 残留，当成升级债清掉。


# ============================================================================
# rua 指向第三方时：外部域授权（EDV）
#
# 这是最高频的一个错，而且错了之后没有任何报错 —— 报告被静默丢弃。
# ============================================================================
#
# 如果 rua=mailto:reports@dmarc-service.example，而那个域不是你的组织域，
# 你需要在**发布策略的域**下加一条记录：
#
#   记录名：your.com._report._dmarc.dmarc-service.example
#   类型：  TXT
#   值：    v=DMARC1
#
# ---- 名字方向（最容易搞反的地方）----
#   your.com._report._dmarc.dmarc-service.example   ✅  <策略域>._report._dmarc.<报告域>
#   dmarc-service.example._report._dmarc.your.com   ❌  反了
#   _dmarc.your.com._report.dmarc-service.example   ❌  漏了 _dmarc 段与顺序
#
# ---- 用 Google 做对照验证方向 ----
#   dig +short TXT gmail.com._report._dmarc.google.com   → "v=DMARC1"   ✅
#   dig +short TXT _report._dmarc.google.com             → 空（nodata）  ❌
#
# ---- 通配授权 ----
#   报告服务商普遍只发一条通配，不为每个客户单建记录：
#   dig +short TXT '*._report._dmarc.dmarc-service.example'   → "v=DMARC1"
#   不查通配就会把正常工作的第三方报告服务判成失效。
#
# ---- 缺授权的后果 ----
#   什么都不发生。没有退信、没有日志、邮箱里一份报告都没有。
#   然后你会得出一个错误结论：「没人冒用我的域」。
#   所以：**先等一份真实报告到手，再动 p=**。这是唯一能证明链路活着的办法。


# ============================================================================
# 收紧前检查表（p 从 none 到 quarantine / reject 之前逐条打勾）
# ============================================================================
#
# [ ] rua 已通，且连续收到 ≥30 天报告
# [ ] 报告里每台 source_ip 都认得出来（RDAP 查过归属）
# [ ] 每个发信源都签了 DKIM，且 d= 与 From 域对齐
# [ ] 每个发信源的 SPF 都通过（不只是「配了」，是 --send-ip 验证过）
# [ ] 所有在用的子域都列出来了（含营销、测试、历史遗留）
# [ ] 主域上的交易邮件实测三处收件箱（Gmail / Outlook / QQ）
# [ ] np= 已加（防止不存在的子域被冒用）
# [ ] 原记录原文已保存，TTL 已降到 300
#
# 验证命令：
#   dig +short TXT _dmarc.your.com
#   python scripts/auth_audit.py --domain your.com
#   python scripts/dmarc_report.py --dir ./rua/ --domain your.com
