What DMARC does that SPF and DKIM cannot
SPF authenticates the envelope sender and DKIM signs the message, but neither looks at the From address the recipient actually sees. DMARC (Domain-based Message Authentication, Reporting and Conformance) closes that gap. It tells receivers to check that at least one of SPF or DKIM passed and that the domain that passed aligns with the From header domain, then apply a policy you choose to anything that fails. It also asks receivers to send you reports about every message that used your domain, which is the only visibility you get into spoofing and misconfigured tools.
Alignment is the key concept. In relaxed mode, the authenticated domain only needs to share the organizational domain with the From header, so mail.example.com aligns with example.com. In strict mode they must match exactly. Relaxed is right for almost every cold email setup, because providers often use a subdomain as the envelope sender or DKIM d= domain. Strict SPF alignment in particular breaks many tools and gains nothing once DKIM aligns.
The record lives at _dmarc.yourdomain.com as a TXT record. Publishing it on the organizational domain covers every subdomain by default, so you do not need one per subdomain unless you want a different subdomain policy via the sp tag.
Every DMARC tag explained
A DMARC record is a semicolon-separated list of tag=value pairs. Only v and p are required; everything else has a default. The generator only includes tags that differ from the default, which keeps the record short and avoids typos.
- v=DMARC1: version, must be first. p: policy for failing mail from the domain, one of none, quarantine or reject.
- sp: policy for subdomains. Omit it to inherit p. Set sp=none while enforcing p=reject only if a subdomain sends unauthenticated mail on purpose.
- pct: percentage of failing mail the policy applies to, 1 to 100. The remainder gets the next weaker policy. It has no effect at p=none.
- rua: mailto address for aggregate reports, daily XML summaries per sending IP. ruf: address for forensic per-message samples, which most large receivers do not send.
- adkim and aspf: alignment mode, r (relaxed) or s (strict). fo: when to generate forensic reports, 0 by default meaning only when both SPF and DKIM fail.
- ri: requested report interval in seconds, default 86400. Most receivers send daily regardless of the value.
- If rua points to a different domain, that domain must publish yourdomain.com._report._dmarc.reportdomain.com TXT "v=DMARC1" or receivers discard the reports.
Rollout plan for cold email domains
Cold email domains are a special case: they are new, they send at steady volume from a handful of inboxes, and a broken authentication setup costs replies immediately. Start every new domain at p=none with an rua address the day you register it. That satisfies the Gmail and Yahoo bulk sender requirement, which asks for a DMARC record with at least p=none, while you confirm that every inbox on the domain passes both SPF and DKIM with alignment.
After two to four weeks of reports showing only your own sending IPs, move to p=quarantine with pct=25. Legitimate mail is unaffected because it already passes; the only effect is on spoofed mail. Watch bounce and reply rates for a week, raise pct to 100, then switch to p=reject. A domain that stays at p=none for months is the most common finding in the checker above, and it means spoofers can use the domain freely while the owner believes they are protected.
- Stage 1, weeks 1 to 4: p=none; rua=mailto:… Deliver everything, fix any inbox or tool that fails alignment.
- Stage 2, weeks 4 to 6: p=quarantine; pct=25. Confirm reply rates hold.
- Stage 3, weeks 6 to 8: p=quarantine; pct=100.
- Stage 4, week 8 onward: p=reject. Keep rua and review reports monthly.
Reading aggregate reports and the mistakes that keep DMARC from working
Aggregate reports arrive as zipped XML, one per receiver per day, listing each sending IP, its SPF and DKIM results, alignment, and how many messages it sent. Reading them by hand is tedious at scale, so most teams route rua to a report-processing service that turns them into a dashboard. What you are looking for is simple: every IP that belongs to you should show pass on both checks with aligned domains, and every IP you do not recognize is either a forwarder, which is harmless, or a spoofer, which is exactly what the reject policy is for.
The mistakes are consistent. Publishing the record on the root instead of _dmarc. Two DMARC records on the same host, which invalidates both. Writing [email protected] without the mailto: prefix. Setting pct with p=none, which does nothing. Forgetting the external report authorization record when rua points to a service. And most of all, never revisiting the record: keys get rotated, new tools get added, and a domain at p=reject with a forgotten sending source silently loses mail. ColdBox surfaces the DMARC status of every connected domain next to its inbox health, so a policy stuck at none or a broken alignment shows up before it costs a campaign.