Email deliverability Q&A

Why is DMARC failing but SPF passes?

Samuel Chenard

By Samuel Chenard · CEO & Co-Founder, Palisade · Reviewed July 20, 2026

Because SPF passed on the wrong domain. SPF is evaluated against the hidden Return-Path (RFC5321.MailFrom) domain; DMARC only counts that pass when the Return-Path domain aligns with your visible From domain. An ESP bounce domain, a forwarding hop, or a strict aspf setting breaks alignment while SPF itself keeps passing.

At a glance
The short versionSPF passed, but on a domain that does not match your From domain
What SPF evaluatesThe Return-Path (RFC5321.MailFrom) domain, which recipients never see
What DMARC addsAlignment: that domain must match the visible header From domain
Classic causeYour ESP puts its own bounce domain in the Return-Path
The rescue pathDMARC needs only ONE aligned pass; aligned DKIM saves the message
Default modesadkim and aspf both default to relaxed (organizational-domain match)

The confusion comes from two different domains wearing the same name. When a receiving server logs spf=pass, it is answering a narrow question: was the sending server authorized to send for the domain in the Return-Path (the envelope sender, called RFC5321.MailFrom in the specs)? That domain travels in the SMTP envelope, not in anything your recipient reads. It is often not your domain at all.

DMARC asks a second question on top: does the domain that passed actually match the From address a human sees? RFC 7489 is explicit that DMARC uses the result of SPF authentication of the MAIL FROM identity, and that the pass only counts toward DMARC when that domain aligns with the RFC5322.From domain. No alignment, no DMARC pass, regardless of how cleanly SPF verified.

So spf=pass next to dmarc=fail is not a contradiction; it is the single most common DMARC failure signature, and it is diagnosable from one header. The good news: DMARC only requires one aligned mechanism, so a DKIM signature from your own domain can carry the message even while SPF alignment stays broken. The sections below walk a real header, then the four causes in order of likelihood.

Triage flow for spf=pass with dmarc=fail: check for an ESP bounce domain in the Return-Path, a forwarder or mailing list hop, a strict aspf setting against a subdomain, and an unaligned DKIM d= domain.

Which domain each check actually evaluates

CheckDomain it evaluatesWhere you see the verdict
SPFReturn-Path (RFC5321.MailFrom), the invisible envelope senderspf= in the Authentication-Results header
DKIMThe d= domain named inside the DKIM-Signature headerdkim= in the Authentication-Results header
DMARCThe visible header From domain, compared against both of the abovedmarc= plus the applied policy (none, quarantine, reject)

DMARC passes when EITHER the SPF-authenticated domain OR the DKIM d= domain aligns with the From domain. Alignment semantics are defined in RFC 7489 section 3.1, checked 2026-07-20; link in Sources below.

A worked example: pass on the wire, fail at the policy

Here is the shape of the headers on a typical marketing send from acme.com through an ESP, trimmed to the three lines that matter. The From address is billing@acme.com. The Return-Path is bounce-77.campaign@mail182.mcsv.net, an ESP bounce domain. The receiver's Authentication-Results line reads spf=pass smtp.mailfrom=mail182.mcsv.net; dkim=pass header.d=mcsv.net; dmarc=fail header.from=acme.com.

Walk it check by check. SPF passed, honestly: the sending server really is authorized to send for mail182.mcsv.net, because the ESP publishes SPF for its own bounce domain. DKIM passed too, but the signature's d= is also the ESP's domain. DMARC then compares both authenticated domains against acme.com, finds neither aligns, and fails the message. Every individual check told the truth; none of them vouched for the domain in the From line.

This is exactly the scenario DMARC was designed to catch, because it is also what spoofing looks like: anyone can pass SPF for a domain they control while displaying yours. The fix is never to loosen DMARC; it is to give the receiver an authenticated identifier that IS your domain, which in practice means enabling custom DKIM signing (so d=acme.com) or a custom bounce domain (so the Return-Path becomes bounce.acme.com), or both.

Relaxed vs strict: what adkim and aspf change

Alignment comes in two strengths, set by the aspf and adkim tags in your DMARC record. In relaxed mode (the default for both), the two domains only need to share an organizational domain: RFC 7489's own example is a Return-Path of cbg.bounces.example.com aligning with a From of payments@example.com. In strict mode, only an exact domain match counts, so that same pair fails.

Strict mode is a common self-inflicted wound. Plenty of legitimate setups put a subdomain in the Return-Path (bounce.acme.com, em.acme.com) precisely so bounces route to the sending platform. Under aspf=r that aligns; flip to aspf=s and every one of those messages loses SPF alignment overnight, with nothing else changed. If you see DMARC failures only on subdomain-Return-Path mail, check whether someone set strict mode.

Leave both tags relaxed unless you have a specific threat model that requires exact matching, and you have first confirmed in your aggregate reports that every legitimate stream already matches exactly. The glossary entry on adkim and aspf covers the tag syntax; the link is in Related below.

Forwarding: the failure you cannot fix in your own DNS

When a recipient auto-forwards your mail (a university address forwarding to Gmail, an old work address forwarding to a new one), the forwarding server re-sends the message from its own infrastructure. Google's Workspace documentation states it plainly: "Even if SPF is correctly set up for your domain, forwarded messages can still fail SPF. This is usually because of the way the forwarding server forwards messages."

Many forwarders rewrite the Return-Path to their own domain (a scheme called SRS) so their server passes SPF, but that pass is on the forwarder's domain and cannot align with your From domain. Nothing in your SPF record can prevent this; the mail is legitimately no longer coming from your servers.

The mitigation is DKIM. A valid DKIM signature travels inside the message and survives a clean forward, so a signature with d= on your domain keeps DMARC passing even after SPF alignment breaks in transit. This is the practical reason to authenticate with both mechanisms: SPF for the direct path, DKIM for everything the message goes through afterward.

Triage: what you see, what it means, what fixes it

What you seeLikely causeThe fix
spf=pass but smtp.mailfrom is your ESP's domain, not yoursESP uses its own bounce domain in the Return-PathEnable the ESP's custom bounce domain feature, or rely on custom DKIM alignment
dkim=pass but the d= domain belongs to the ESPDefault platform DKIM signing instead of your domain's keyTurn on custom DKIM signing so d= is your domain, then verify
Return-Path is a subdomain of your domain yet DMARC still failsaspf=s (strict) in your DMARC recordSet aspf=r, or make the Return-Path domain match the From domain exactly
Direct mail passes; mail to certain recipients always failsAuto-forwarding rewrites the Return-Path in transitNothing on the SPF side; ensure aligned DKIM so the signature survives the hop
Tests pass, but aggregate reports show failing sources you do not recognizeOther tools sending as your domain without authentication (or spoofing)Inventory every sender via DMARC aggregate reports, authenticate or retire each one

If failures arrive as bounces, the code names the layer: Gmail's unauthenticated-mail rejection is 550 5.7.26. The SMTP error-code reference at /learning/smtp-error-codes has the per-code walkthroughs; this page stays on the alignment mechanics.

Triage flow for spf=pass with dmarc=fail: check for an ESP bounce domain in the Return-Path, a forwarder or mailing list hop, a strict aspf setting against a subdomain, and an unaligned DKIM d= domain.

How to fix it

  1. Check your DMARC record and alignment settings

    Run your domain through the free DMARC checker below. It shows your policy and whether adkim or aspf are set to strict, which is the fastest misconfiguration to rule out.

    Run the check now

    Enter your sending domain and the check runs instantly on the next page. Free, no signup.

  2. Read the Authentication-Results header, not just the verdicts

    Open a failing message's headers and compare three values: the smtp.mailfrom domain, the header.d domain, and the header.from domain. DMARC fails when neither of the first two aligns with the third; the mismatched pair tells you which fix applies.

  3. Align DKIM first; it is the more durable identifier

    Enable custom DKIM signing at your ESP so the signature's d= is your domain, not the platform's. An aligned DKIM pass satisfies DMARC on its own and keeps working through forwarding hops that break SPF.

  4. Fix SPF alignment where the platform supports it

    Most ESPs offer a custom bounce or Return-Path domain (usually a CNAME on a subdomain like bounce.yourdomain.com). Under relaxed alignment that subdomain aligns with your From domain, and SPF starts counting toward DMARC.

  5. Leave adkim and aspf relaxed unless you have a reason

    Relaxed is the RFC default and accepts organizational-domain matches, which is what subdomain bounce setups depend on. Strict mode buys marginal rigor and regularly breaks legitimate mail; earn it with clean aggregate reports first.

  6. Confirm the fix in your DMARC aggregate reports

    Reports show, per source, whether SPF and DKIM passed and whether each aligned. After the change, the failing source should flip to aligned within a few days; if a new source appears unaligned later, you catch it in a report instead of a blocked campaign.

Related free tools: SPF checker · DKIM checker · Email header analyzer

Alignment is not a one-time fix

Alignment breaks silently. Marketing adds a new tool, the ESP rotates a sending configuration, someone edits DNS, and a stream that aligned last quarter quietly stops counting. At p=none nobody notices until deliverability sags; the reports record the drift, but only if someone reads them.

The end state worth reaching is DMARC at p=reject with every legitimate sender aligned: spoofed mail using your domain gets dropped at the receiver, and any alignment regression in your own streams surfaces immediately instead of festering. Monitoring is how you get there; enforcement is the point.

DMARC software that does the work

Palisade's AI agent hosts your SPF, DKIM, and DMARC records and takes every domain to p=reject automatically. Your first domain is free.

First domain free forever

Why it matters for MSPs

Alignment failures are the default state of an unmanaged client domain: nearly every tenant runs at least one SaaS tool that sends with its own Return-Path, so "SPF passes but DMARC fails" shows up on almost every onboarding audit. The billable work is the sender inventory: read the client's aggregate reports, list every source, and align or retire each one before touching the policy. Palisade does the ongoing half of that automatically; it hosts the SPF, DKIM, and DMARC records per client domain, watches every source in the aggregate reports, and walks each domain to p=reject, with ConnectWise, HaloPSA, and Autotask integrations so an alignment regression lands as a ticket in your PSA. Your own MSP domain is a free NFR domain to prove the workflow on.

Frequently asked questions

Yes, and it is the most common DMARC failure mode. SPF verifies the hidden Return-Path domain; DMARC additionally requires that domain to align with the visible From domain. When an ESP or forwarder controls the Return-Path, SPF passes on their domain and contributes nothing to your DMARC result.

No. DMARC passes when either mechanism produces an aligned pass: SPF aligned with the From domain, or a DKIM signature whose d= domain aligns. You should still deploy both, because SPF alignment routinely breaks under forwarding while an aligned DKIM signature usually survives the extra hop.

Mailchimp's technical sender address normally lives on its own domains (mcsv.net, mcdlv.net, rsgsv.net, or mailchimpapp.net), so SPF passes on Mailchimp's domain, not yours, and cannot align. Mailchimp's documented fix is authenticating your domain with custom DKIM, which also removes the "via mcsv.net" label some inboxes show.

An SPF pass means the sending server was authorized for the Return-Path domain, whatever that domain is. SPF alignment is DMARC's extra test: that Return-Path domain must match your From domain, exactly in strict mode or by organizational domain in relaxed mode. Only an aligned pass counts toward DMARC.

Rarely. Both tags default to relaxed, which accepts organizational-domain matches, and that default is what subdomain bounce and signing setups depend on. Strict mode breaks them for marginal benefit. Consider it only after your aggregate reports show every legitimate source already matching the From domain exactly.

It can. Google's own documentation notes that correctly configured SPF still fails on forwarded mail, because the forwarding server re-sends from its own infrastructure and often rewrites the Return-Path. You cannot fix that in DNS; an aligned DKIM signature travels inside the message and keeps DMARC passing.

Usually no. If the platform puts its own domain in the Return-Path, receivers evaluate SPF against that domain, and your record is never consulted for those messages. Adding the include only spends your 10-DNS-lookup budget. Alignment for that stream has to come from custom DKIM or a custom bounce domain.

Sources

Every benchmark above was verified against the vendor's own documentation on the date shown.

Related reading

Email deliverability, fixed: the full guide