p=none is usually the right DMARC policy — it satisfies the requirement while you monitor reports. Roll toward quarantine/reject only after your reports are clean.Every guide to cold email infrastructure tells you that authentication matters, and the deliverability posts explain why the mailbox providers care. Almost none of them show you the actual DNS records. This is the missing walkthrough: what SPF, DKIM, and DMARC each do, the exact records to publish, the traps that silently break them, and how to satisfy the 2024–2026 rules from Google, Yahoo, and Microsoft without torching your domain reputation in the process.
Email was designed in an era of trust, so by default anyone can put your address in the "From" field. Authentication is the layer that closes that hole. Three records do three different jobs:
| Record | Question it answers | How it works | DNS record |
|---|---|---|---|
| SPF | Is this server allowed to send for my domain? | Lists authorized sending IPs/services; checked against the envelope Return-Path | TXT on the root domain |
| DKIM | Was this message altered, and is it really signed by me? | Private key signs the message; receivers verify with your public key | TXT at selector._domainkey |
| DMARC | Do SPF/DKIM match the visible From address — and what happens if not? | Enforces alignment, sets a failure policy, and requests reports | TXT at _dmarc |
The key concept most people miss is DMARC alignment. It isn't enough for SPF or DKIM to pass — the domain they authenticate has to match the domain the human reads in the From header. DMARC passes when at least one of SPF or DKIM both passes and aligns. That "at least one" is why you don't strictly need both to be perfect, but you absolutely want both configured. (The underlying standards are RFC 7208 for SPF, RFC 6376 for DKIM, and RFC 7489 for DMARC, if you like reading specs.)
SPF is a single TXT record on your sending domain listing everything allowed to send on its behalf. A minimal record for a domain sending through Google Workspace looks like this:
v=spf1 include:_spf.google.com ~all
The pieces: include: pulls in an authorized service's own SPF, and the closing all mechanism decides what to do with everything else — ~all is a softfail (recommended while you're setting things up), -all is a hardfail (strict). Add an include: for every legitimate sender: your mailbox provider, your sending tool, any transactional service.
v=spf1 TXT records = SPF fails outright. Merge them into one.include, a, mx, and redirect counts, and each include can pull in more. Blow past 10 and you get a PermError — which fails SPF for every message you send, not just some. Fix it by removing unused vendors and consolidating includes; use "SPF flattening" (replacing includes with resolved IPs) only as a last resort, because flattened records need manual updates whenever a provider's IPs change.DKIM adds a cryptographic signature to every outgoing message. Your sending platform holds a private key and signs the mail; you publish the matching public key in DNS so receivers can verify it. The record lives at a host built from a selector:
Host: google._domainkey (selector varies by provider)
Type: TXT
Value: v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB...
You almost never write this by hand — your mailbox provider or sending tool generates the key and gives you the exact record to paste. Two things to get right:
DMARC ties it all together. Publish a TXT record at _dmarc.yourdomain.com:
v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.com; pct=100; adkim=r; aspf=r
The tags that matter: p= is the policy (none, quarantine, or reject), rua= is where aggregate reports get sent (never omit this — it's your only visibility into what's failing), pct= is the percentage of failing mail the policy applies to, and adkim/aspf set alignment strictness (r = relaxed, the sane default; s = strict).
Roll the policy out in stages — never start at reject:
| Stage | Policy | What happens on failure | When to move on |
|---|---|---|---|
| 1. Monitor | p=none | Nothing — mail still delivers; you just collect reports | Once rua reports show all your legit senders passing & aligned |
| 2. Quarantine | p=quarantine | Failing mail goes to spam/junk | After a clean monitoring window (guides suggest ~30–60 days) |
| 3. Reject | p=reject | Failing mail is rejected at SMTP (bounced, never delivered) | Optional for cold email — see below |
Timeline caveat: the 30–60-day figure is vendor guidance for simple setups; enterprises with sprawling mail infrastructure are advised to monitor a full quarter or longer. For a handful of cold-email sending domains you'll converge much faster. Directional.
This is the part that turned authentication from "nice to have" into "you don't send at all without it." The rules are pegged to bulk senders — anyone sending roughly 5,000+ messages per day to a provider's users, which most serious cold-email operations cross quickly across their domains.
| Provider | Since | Requirement |
|---|---|---|
| Google & Yahoo | Feb 1, 2024 | SPF + DKIM + DMARC (min p=none), at least one aligned; one-click unsubscribe on marketing mail (RFC 8058, enforced Jun 1, 2024); valid forward + reverse DNS (PTR); spam-complaint rate under 0.3% (aim for <0.1%) |
| Microsoft (Outlook.com/Hotmail) | May 5, 2025 | SPF + DKIM + DMARC (min p=none) aligned; non-compliant bulk mail is rejected with a 550 5.7.515 error, not just junked |
Note the complaint-rate line — authentication gets you in the door, but the 0.1% target / 0.3% hard limit on spam complaints is what keeps you there. That's a list-quality and copy problem, not a DNS problem, and it ties directly into how you build your list and how you stay compliant. (Enforcement has tightened progressively through 2025; exact rejection-cutover dates beyond the ones above are single-sourced — directional.)
Standard authentication guides assume you're protecting a corporate domain. Cold outreach flips several defaults:
yourcompany.com reputation stays pristine. A common ratio is ~1 domain per 2–3 mailboxes and ~40–50 sends per mailbox per day — vendor rules of thumb, directional — but the principle is firm: spread the load and keep it off the brand domain.p=none is genuinely fine for cold email. Its main job here is satisfying the "must have a DMARC record" requirement while you monitor. You're not primarily fighting spoofers of a throwaway domain, so aggressive reject buys little and risks bouncing legitimate mail if alignment isn't perfect.Before you hit send on a new domain, rule out the usual silent failures:
rua= — zero visibility into failures.p=reject before monitoring reports.You never have to guess. Free record checkers — MXToolbox, Google Admin Toolbox, dmarcian (record wizard + DKIM validator + SPF surveyor), and EasyDMARC — will look up and validate each record. The fastest end-to-end test: send a message to a Gmail account, open it, and use "Show original." Gmail shows you a clean PASS/FAIL for SPF, DKIM, and DMARC plus whether each aligned. If all three say PASS, you're authenticated. Pair this with a run through the warmup and deliverability tools before you scale volume.
Yes. Since February 2024, Google and Yahoo require all three from bulk senders (5,000+/day), and Microsoft began rejecting non-compliant bulk mail to Outlook.com in May 2025. Technically DMARC only needs one of SPF or DKIM to pass and align, but you should configure both — it's more resilient, and forwarding can break SPF while DKIM survives it.
A separate sending domain, always. Cold outreach carries reputation risk — spam complaints, occasional blocklisting — that you don't want anywhere near your primary brand domain. Register close-variant domains, point them at your main site, and authenticate each one independently.
p=none is the right starting point and is usually sufficient for cold email. It satisfies the requirement to have a DMARC record while you monitor rua reports. Only progress to quarantine or reject after reports confirm all your legitimate senders pass and align — and for throwaway sending domains, aggressive enforcement rarely adds value.
SPF is capped at 10 DNS-querying mechanisms (RFC 7208). Each include, a, mx, and redirect counts, and includes can nest more lookups inside them. Exceed 10 and you get a PermError, which fails SPF for every email. Fix it by removing unused senders and consolidating includes; only flatten SPF (resolve includes to raw IPs) as a last resort, since flattened records need manual upkeep.
No. A domain may have only one v=spf1 TXT record. Two or more cause SPF to fail. If multiple services each told you to "add an SPF record," merge their include: mechanisms into a single record.
Use a free checker like MXToolbox, dmarcian, EasyDMARC, or Google Admin Toolbox to validate each record's syntax, then send a live test to Gmail and use "Show original" to confirm SPF, DKIM, and DMARC all PASS and align. That end-to-end check catches problems the record-syntax tools can miss.
No — it's the entry ticket, not the whole game. Authentication gets you past the door; staying in the inbox depends on list quality, warmup, sending volume, and keeping your spam-complaint rate under the 0.3% hard limit (ideally below 0.1%). Authentication is necessary but not sufficient.
Don't want to hand-configure DNS across a dozen sending domains? GenFlows builds and maintains the full cold-email infrastructure — authenticated sending domains, warmup, and deliverability monitoring — so your campaigns land in the inbox instead of the spam folder. See how the infrastructure fits together or talk to our team.
By the GenFlows GTM engineering team. Provider requirements and record specifications verified July 2026 against Google, Yahoo, and Microsoft sender guidelines and the relevant RFCs (7208, 6376, 7489); volume ratios, rollout timelines, and single-sourced enforcement dates are flagged directional. This is operational guidance, not legal or security advice. Last updated July 2026.