Skip to content
iBlockSpam
SPF, DKIM & DMARC

SPF vs DKIM vs DMARC: what each one proves, and what it doesn't

By iBlockSpam Team How we check our guides Updated 8 min read 8 sources
Short answer

SPF proves a server was allowed to send for the envelope domain. DKIM proves a domain signed the message and the signed parts weren't changed. DMARC ties either result to the From address people see and tells receivers what to do on failure. None of them proves a message is safe or wanted.

Email was designed without any way to prove who sent a message. SPF, DKIM and DMARC were added later, each covering a different gap. Together they let a receiver answer: "Did this message really come from the domain in the From line?"

They don't answer: "Is this message safe?" or "Did the person want it?"

How do SPF, DKIM and DMARC compare?

Item SPF DKIM DMARC
Standard RFC 7208 RFC 6376 RFC 9989 (replaced RFC 7489 in May 2026)
DNS record TXT on the domain TXT at selector._domainkey.domain TXT at _dmarc.domain
Checks The sending server's IP against a list A cryptographic signature on headers and body That SPF or DKIM passed and aligns with From
Domain it authenticates Envelope sender (Return-Path / MAIL FROM) The signing domain (d=) The visible From domain
Survives forwarding Usually not Usually, unless the message is changed If DKIM survives
Tells receivers what to do Weakly (-all / ~all) No Yes (p=none, quarantine, reject)
Sends you reports No No Yes (rua)

SPF: was this server allowed to send?

SPF lists the IP addresses allowed to send mail using your domain in the envelope sender: the hidden bounce address, not the From line people read.

It proves: the connecting server was on the list published by the envelope domain.

It doesn't prove:

  • Anything about the From address the reader sees. A spammer can use their own envelope domain, pass SPF, and put your name in From.
  • That the message wasn't changed.
  • Much after forwarding, because the forwarder's IP isn't on your list.

SPF also has a hard limit of 10 DNS-querying mechanisms. Exceed it and the result is PermError. See how to fix too many SPF lookups, or start with what SPF is and how receivers check it.

DKIM: did this domain sign this message?

DKIM adds a DKIM-Signature header made with a private key. The receiver fetches the public key from DNS and verifies it.

It proves: the domain in d= took responsibility for the message, and the signed headers and body weren't altered since signing.

It doesn't prove:

  • That the signing domain is the one in From. Any domain can sign any message.
  • That the content is honest. A compromised account produces perfectly signed phishing.
  • That the message wasn't replayed. A validly signed message can be resent to other people.

An unknown DKIM selector isn't a failure. Selectors are names the sender chooses, and DNS can't list them. For the signature tags, keys and what breaks them, see what DKIM is and how it works.

DMARC: does the authenticated domain match the From line?

DMARC closes the gap. A message passes when SPF or DKIM passes for a domain aligned with the From domain. You publish a policy saying what receivers should do with mail that fails, and where to send reports. Our guide to what DMARC is covers the policy and its reports in more depth.

It proves: the visible From domain authorized this message through SPF or DKIM.

It doesn't prove:

  • That the message is safe. Attackers authenticate their own domains.
  • Anything about look-alike domains (examp1e.com, example-billing.com).
  • That receivers will follow your policy. They make the final decision.

RFC 9989 removed the pct tag, added t (test mode) and np (policy for non-existent subdomains), and replaced public suffix list lookups with a DNS tree walk for finding the organizational domain. Existing v=DMARC1 records still work.

How do SPF, DKIM and DMARC work together?

  1. Your invoicing tool sends an invoice from billing@example.com, using bounces.invoicetool.example as the envelope sender, signed with d=example.com.
  2. SPF: passes for bounces.invoicetool.example. Not aligned with example.com.
  3. DKIM: passes for example.com. Aligned.
  4. DMARC: passes, because DKIM passed with alignment.

Now remove the custom DKIM. DKIM passes only for invoicetool.example, SPF still isn't aligned, and DMARC fails. At p=reject, your invoices bounce.

What else appears in the same checks?

These aren't authentication, but they appear in the same checks:

Standard What it does
MTA-STS (RFC 8461) Tells senders your MX hosts support TLS with valid certificates, so mail to you can't be downgraded to plain text. A TXT record at _mta-sts plus a policy file at https://mta-sts.yourdomain/.well-known/mta-sts.txt.
TLS-RPT (RFC 8460) A TXT record at _smtp._tls asking senders to report TLS failures to you.
Null MX (RFC 7505) MX 0 . says a domain accepts no mail. Use it on parked domains alongside v=spf1 -all and p=reject.
BIMI Displays your logo in supporting inboxes. It requires DMARC at quarantine or reject, according to the BIMI Group, and most providers also want a Verified Mark Certificate (VMC) or Common Mark Certificate (CMC). It's an IETF draft, not an RFC.

What do people get wrong about SPF, DKIM and DMARC?

"We have SPF, so nobody can spoof us." SPF checks the envelope sender, which readers never see. Without DMARC at enforcement, an attacker can use their own envelope domain, pass SPF for it, and put your domain in the visible From line.

"DKIM encrypts our email." It doesn't. DKIM signs messages; anyone along the way can still read them. Encryption in transit is TLS, which MTA-STS helps enforce.

"p=reject will block our own mail." Only mail that fails both aligned SPF and aligned DKIM. If you've read your reports and fixed your senders first, legitimate mail keeps flowing. The risk comes from skipping the monitoring stage, not from the policy itself.

"DMARC stops phishing." It stops one kind: exact-domain spoofing at receivers that enforce it. Look-alike domains, display-name tricks ("IT Support" random@freemail.example) and compromised real accounts all pass or bypass it.

"An unknown DKIM selector means DKIM is broken." Selectors are names the sender chooses and can't be listed from DNS. If a checker can't guess yours, enter the s= value from a real message header.

"A domain with no MX is misconfigured." Not if it doesn't receive mail. It should say so with a Null MX record, MX 0 ., plus v=spf1 -all and a p=reject DMARC policy, so nobody can send as it either.

"We only need this if we send newsletters." Every domain that sends any email benefits. Gmail requires SPF or DKIM from all senders, not just bulk ones, according to Google's sender guidelines.

What do receivers do with the results?

The standards say what to check, not exactly what to do. Each receiver combines the results with its own signals. A failed SPF check under ~all is usually just one negative signal. A DMARC failure under p=reject is a strong instruction that most large receivers follow, though they may make exceptions, for example for mailing lists that carry trustworthy ARC results. A full pass is a positive signal, but content and reputation filtering still decide whether the message reaches the inbox, the junk folder or quarantine.

In what order should you set them up?

  1. Inventory your senders. Every service that sends with your domain in From.
  2. Publish SPF listing your mail platform and any outbound relay. One record only.
  3. Enable DKIM with your domain in every service. Prefer 2048-bit keys.
  4. Publish DMARC at p=none with a rua address.
  5. Read the reports, fix gaps, then move toward p=reject. Our staged DMARC rollout has the detail.
  6. Add MTA-STS and TLS-RPT for transport security.

How iBlockSpam helps

Our free checkers test each record: SPF, DKIM, DMARC, and all of them together in the Email Health Check. For mail you receive, iBlockSpam adds spam, virus, malware, phishing and spoofing protection at the MX. That matters because passing authentication doesn't make a message safe.

Next steps

  1. Check all three records at once with the free Email Health Check.
  2. Fix SPF and DKIM for every sending service, then publish DMARC at p=none with the DMARC Record Generator.
  3. Move toward enforcement with DMARC from none to reject.

If you'd rather not read aggregate reports yourself, iBlockSpam's DMARC monitoring shows which of your senders pass SPF, DKIM and DMARC, and it's included in both plans on our pricing page.

Browse our other SPF, DKIM and DMARC guides.

Frequently asked questions

Do I need all three?

Yes. SPF and DKIM give receivers two independent ways to authenticate your mail, and DMARC connects them to your visible From address. Google and Yahoo require all three from bulk senders, and every domain benefits from them.

If an email passes SPF, DKIM and DMARC, is it safe?

No. It only means the message genuinely came from the domain it claims. Attackers can register their own domain, set up perfect authentication and send phishing. Content and reputation filtering still matter.

Why do I see dkim=pass but dmarc=fail?

DKIM passed for a domain that doesn't match your From domain. Many tools sign with their own domain by default. Set up custom DKIM so they sign as your domain.

Is DMARC still RFC 7489?

No. RFC 9989, published in May 2026, replaced RFC 7489 and moved DMARC onto the IETF Standards Track. Existing v=DMARC1 records keep working.

Sources

  1. RFC 7208: Sender Policy Framework (SPF)
  2. RFC 6376: DomainKeys Identified Mail (DKIM) Signatures
  3. RFC 9989: Domain-Based Message Authentication, Reporting, and Conformance (DMARC)
  4. RFC 8461: SMTP MTA Strict Transport Security (MTA-STS)
  5. RFC 8460: SMTP TLS Reporting
  6. RFC 7505: A Null MX No Service Resource Record
  7. BIMI Group: Implementation guide
  8. Gmail Help: Email sender guidelines

See how your domain measures up

Run a free Email Health Check: MX, SPF, DKIM, DMARC and transport security in one scan, with the raw records shown. No sign-up.

Keep reading