Blog · Dmarc

Why Email Receivers Disagree on Your Authentication Even When SPF, DKIM, and DMARC All Look Correct

You check SPF, DKIM, and DMARC in DNS. Every record resolves. Your mail goes to Gmail without issue. Outlook's consumer side refuses it. Yahoo drops it into spam. None of them agree on the same message and your tests say everything is fine.

That is not a misconfiguration smell. It is what email authentication looks like in 2026. The records passing DNS validation tells you the inputs are correct. It does not tell you what each receiver will conclude after it applies those inputs through its own policy, reputation, and content filters. Different receivers reach different verdicts from the same records, and most of the time both verdicts are defensible inside their own rules.

The fix is not a configuration check. The fix is reading the receivers' verdicts on the same message side by side and learning where the policy lines split.

Authentication does what, and what it does not

Authentication answers a narrow question: who claimed to send this message, and does the cryptographic proof match the published records. SPF checks the sending IP against the MAIL FROM or HELO domain's SPF record. DKIM checks a signature against a public key published in DNS. DMARC checks whether SPF or DKIM passed and that the identifier that authenticated is the same as the visible From domain.

Three things are outside that scope:

  • IP reputation. New sending ranges often have no reputation history at all. Receivers use that to decide whether to deliver, quarantine, or defer.
  • Content filtering. URLs, attachments, and content patterns are scanned after auth.
  • Policy and inbox scoring. Some receivers put authentication results into a feature. Others put them into a hard policy. Most combine them with everything else.

Authentication passing does not promise the inbox. Authentication failing does not always trigger quarantine. This split is the single most common reason two providers give you two different answers on the same mail.

Where the SPF verdict splits

SPF looks simple but has several places where two receivers can read the same record and reach different results.

The most common one is identity. RFC 7208 lets a receiver check either the MAIL FROM identity (also called envelope sender or RFC5321.MailFrom) or the HELO identity. Gmail defaults to MAIL FROM. Some receivers check HELO first if the MAIL FROM domain is empty (a so-called null sender, often shown as <>). If your envelope sender uses a different domain than your From, you can pass at one receiver and fail at another on the same SPF check.

Relaxed vs strict is another. SPF at its most literal checks the full MAIL FROM string. Some receivers allow a relaxed match where the DNS label structure matches even if the strings differ by case or trailing dot. Same record, two verdicts.

The 10-DNS-lookup limit is a third. SPF records that resolve through many include, a, mx, ptr, or redirect mechanisms can blow the limit. Different receivers stop evaluating at the lookup limit differently in practice.

Multiple SPF records at one DNS label is the simplest one to spot. RFC 7208 says only one SPF record should exist per label. If two are there, RFC says ignore both. Some receivers fall back to checking DKIM alignment, which is what you want. Others follow the strict RFC path and treat it as fail.

Where the DKIM verdict splits

DKIM signatures look binary but have a small set of choices that differ by signer.

Canonicalization is the biggest one. c=relaxed rewrites whitespace and case before the signature is calculated. c=simple makes almost no changes. A message signed c=relaxed and a message signed c=simple produce different signatures for the same body. If your ESP signs with one and a third-party forwarder re-signs with another, two receivers may see two different signatures on what looks like the same mail.

Signature freshness is the second. DKIM has an x= (expiration) and t= (created) tag. Some receivers re-validate the signature on every hop. If the signature expired between sign time and a slow forwarding path, the receiver that re-validates will fail it.

The l= tag r label. If two are there, RFC says ignore both. Some receivers fall back to checking DKIM alignment, which is what you want. Others follow the strict RFC path and treat it as fail.

Where the DKIM verdict splits

DKIM signatures look binary but have a small set of choices that differ by signer.

Canonicalization is the biggest one. c=relaxed rewrites whitespace and case before the signature is calculated. c=simple makes almost no changes. A message signed c=relaxed and a message signed c=simple produce different signatures for the same body. If your ESP signs with one and a third-party forwarder re-signs with another, two receivers may see two different signatures on what looks like the same mail.

Signature freshness is the second. DKIM has an x= (expiration) and t= (created) tag. Some receivers re-validate the signature on every hop. If the signature expired between sign time and a slow forwarding path, the receiver that re-validates will fail it.

The l= tag limits the signed body to the first N bytes. If a forwarder appends a footer or rewrites headers, the part of the message that falls inside l= still verifies, but receivers that check the full body hash against the signer hash may reject.

Key rotation races happen when an ESP publishes a new DKIM key and rotates. A message signed with the old key, in flight at rotation time, fails at receivers that already cached the new key only, passes at receivers still caching the old key only.

Where alignment is not always the same

DMARC alignment is the final check before the receiver consults policy. Alignment says: the SPF-authenticated domain (or DKIM-authenticated domain) must be the same as the visible From domain, or a subdomain of it.

Two places where this is interpreted differently:

  • Subdomain policy. Your DMARC record's sp= tag sets policy for subdomain alignment. Some receivers honor it strictly. Some receivers treat the parent domain's p= as inheritable.
  • Sampling (pct=). DMARC supporare but happens at strict corporate gateways. If you do not publish an MTA-STS policy, you are opting out of that protection.

    BIMI adds another layer that some receivers run alongside DMARC. If a receiver enforces a strict BIMI policy and your record has a VMC, the same DMARC result can pass without BIMI support and fail where BIMI is required.

    Reputation, content, and the part no auth report sees

    This is what most disagreement actually comes down to, even when no one involved would call it an auth failure.

    A new IP range, a new sending domain, or a domain that has sent very little looks fresh to a reputation system. Two receivers can have completely different reputation pictures of the same IP because one has seen traffic from it for years and the other has not. Authentication does not change that picture.

    Spam content filtering is the same. A message that contains a typical transactional pattern, has normal text-to-image ratio, and lands on a domain with strong reputation can pass content filtering at one provider and trigger bulk content patterns at another.

    Graymail scoring sits next to authentication in some receivers and not in others. A newsletter that hits Gmail's "Promotions" tab can hit Outlook's spam folder with the exact same auth result.

    This is why "SPF and DKIM pass but one provider still drops me" keeps coming up. The authentication result is identical. The reputation and content layers differ.

    How to read the disagreement

    Five steps work in almost every case:

    1. Publish a DMARC record with rua= pointing at a reporting endpoint. Without this, you cannot see what receivers actually saw. Without aggregate reports, you are reverse-engineering deliverability from bounce messages. A reporting tool (DMARCFlow is one) that breaks down the per-receiver verdict turns a generic RUA stream into a per-domain checklist.

    2. Send the same message to a known-good Gmail, a known-good Outlook consumer mailbox, a known-good Yahoo, and a strict corporate filter. Use the same subject, the same body, the same attachment set. Same input.

    3. Pull the Authentication-Results header at each receiver. SPF, DKIM, DMARC, and ARC, each with header.from, header.d, and the receiving domain's verdict. This is the receiver's signed statement about what it saw.

    4. Pull your DMARC aggregate reports over the last 14 days. Sort by receiving domain. Look for the domains that count your SPF or DKIM as fail while others count the same as pass. That disagreement is your real signal.

    5. Run a TLSRPT report if you publish MTA-STS. Some "auth failed" verdicts on the user side are actually TLS negotiation failures on the receiver side.

    DMARCFlow fits here as a small practical win. A reporting tool that consolidates the RUA stream by receiving domain shows you which providers saw your message differently and on which check. That is the fastest path to "Gmail passes, Outlook fails, Yahoo passes" without seeding accounts at every provider yourself. The reporting tool does not invent visibility. It only shows you the cross-receiver signal you already had, in one view.

    Practical summary

    If you have authentic SPF, DKIM, and DMARC records and receivers still disagree, the answer is almost never alignment. Walk through this instead.

    • Confirm one SPF record at one label, no more than 10 DNS lookups.
    • Confirm DKIM canonicalization matches what you want (c=relaxed is the modern default).
    • Confirm DMARC alignment between the auth domain and the From domain.
    • Pull your RUA reports and look at the per-receiver verdict. The receiving domain column tells you who saw what. DMARCFlow surfaces this in one view if you want to skip the manual sort.
    • Treat reputation and content as separate inputs that auth does not cover.

    Auth passing is not the same as inboxing. Receivers will disagree on the inboxing. They should also disagree less often on the auth verdict than they used to. The rest is reputation, content, and policy - and those are not solved by adding records.

    FAQ

    Is it normal for receivers to disagree on the same outbound message? Yes. Different receivers check different layers after authentication, score reputation independently, and apply different content and policy filters. Two providers reaching different verdicts on the same mail is a normal operating condition of email in 2026, not necessarily a misconfiguration on your side.

    If SPF and DKIM pass but DMARC fails at one receiver, is that a misconfiguration on my side? Not always. It can be a misaligned subdomain, a stale DKIM key cached at that receiver only, or strict policy enforcement on sp= or pct= that another receiver applies loosely. The RUA aggregate report stream will show which check failed at which domain and on which message. If one receiver counts your DKIM signature as valid and another counts the same signature as body hash not verified, the difference is most often canonicalization (c=relaxed vs c=simple) or an l= body-tag trim.

    Does authentication passing guarantee inbox placement? No. Authentication passing removes one class of failure: spoofing and domain forgery. It does not remove the inbox-versus-spam decision, which is made on reputation, content, engagement, and policy. Two providers can land the same mail at the same authentication result and place it in inbox versus spam on other signals.

    Why does my mail land in spam at one provider but inbox at another with the same auth result? Reputation and content filtering are applied after authentication and dominate the deliverability outcome. A new IP range, a sending domain with no history, or content that matches bulk-sending patterns can move you across the line at one provider while staying clean at another. Auth reports do not see this.

    What is the fastest way to see what each receiver actually saw? Pull your DMARC aggregate reports and group them by receiving domain. Use a tool that breaks down the per-receiver verdict (pass, fail, on which check) at a glance. Cross-check with the Authentication-Results header at a small seed list of consumer mailboxes (Gmail, Outlook, Yahoo, Fastmail, Mimecast). The cross-receiver pattern in your RUA stream is the cleanest signal you have.