DMARC troubleshooting tips start with one important distinction: a message can pass SPF or DKIM and still fail DMARC. The usual cause is alignment, DNS configuration, or an overlooked sending system—not necessarily a broken email provider.
Understand what DMARC is actually checking
DMARC evaluates the domain a recipient sees in the visible From: header, then asks whether that domain is authenticated by SPF, DKIM, or both. It also lets the domain owner publish an instruction for receivers when that authentication fails and request feedback reports.
A DMARC pass requires at least one of these conditions:
- SPF passes and the SPF-authenticated envelope-sender domain aligns with the visible
From:domain. - DKIM passes and the signing domain in the DKIM
d=tag aligns with the visibleFrom:domain.
That means a message can have results such as spf=pass, dkim=pass, and still show dmarc=fail if neither passing identity aligns with the address in From:.
For example, imagine this message:
From: Billing <receipts@example.com>
Return-Path: bounce@provider-mail.example.net
DKIM-Signature: v=1; d=provider-mail.example.net; s=s1; ...
If SPF passes for provider-mail.example.net and DKIM passes for provider-mail.example.net, but the visible sender is example.com, neither identity is aligned under the default relaxed alignment rule. DMARC fails unless the provider can sign with d=example.com or use an aligned custom bounce domain such as bounce.example.com.
This is why DMARC troubleshooting should never stop at a green SPF or DKIM result. Inspect the authenticated domains, not just the pass/fail labels.
Start with the original delivered message and headers
The fastest way to diagnose a real DMARC issue is to use a message that reached a test inbox, open the original source, and read its authentication headers. Do not infer authentication from DNS alone: DNS can be correct while your application, SMTP relay, forwarding service, or campaign platform is using the wrong identity.
Look for an Authentication-Results header added by the receiving system. A simplified example looks like this:
Authentication-Results: mx.google.com;
spf=pass smtp.mailfrom=bounce.example.com;
dkim=pass header.d=example.com header.s=s2026;
dmarc=pass header.from=example.com
The fields answer three separate questions:
smtp.mailfrom=identifies the domain evaluated by SPF.header.d=identifies the DKIM signing domain that was validated.header.from=identifies the domain visible to the recipient and used by DMARC.
A useful failure example is:
Authentication-Results: mx.recipient.test;
spf=pass smtp.mailfrom=mailer.vendor.example;
dkim=pass header.d=mailer.vendor.example;
dmarc=fail header.from=example.com
Here, the sending platform may be functioning perfectly, but its default sending domain is not aligned with example.com. The fix is usually in sender-domain configuration, not in the recipient mailbox.
When testing a transactional message, send the exact message type that is failing: password resets, invoices, account invites, and notifications may pass through a different code path or sender configuration than marketing mail. If your application supports both an HTTP email API and an SMTP relay, test both paths independently. A valid REST API integration does not prove that a legacy application using SMTP is using the same authenticated domain, DKIM selector, or envelope sender.
Verify the DMARC DNS record before changing policy
A DMARC policy is published as a DNS TXT record at _dmarc.yourdomain. For example.com, the lookup name is:
_dmarc.example.com
A minimal monitoring record is:
v=DMARC1; p=none
A practical starting record with aggregate reporting is:
v=DMARC1; p=none; rua=mailto:dmarc-reports@example.com; adkim=r; aspf=r; pct=100
Publish it as a TXT record. In many DNS dashboards, you enter _dmarc as the host/name because the DNS provider appends example.com. Other providers require the complete hostname. Check the resulting public DNS response rather than relying on how the dashboard displays the entry.
Use command-line tools to check what the internet can see:
dig +short TXT _dmarc.example.com
nslookup -type=TXT _dmarc.example.com
You should see one coherent DMARC policy beginning with v=DMARC1. DNS interfaces may split a long TXT value into quoted chunks; that is normal if resolvers return the chunks as one concatenated value.
Common DNS record mistakes
The most frequent errors are basic but consequential:
- Publishing the policy at
example.cominstead of_dmarc.example.com. - Creating a CNAME where the DNS provider or receiving implementation expects a TXT response.
- Publishing two DMARC TXT records at the same
_dmarcname. - Letting a wildcard DNS record answer
_dmarc.example.comwith unrelated text, such as an SPF record or domain-verification token. - Copying typographic quotes, smart dashes, extra spaces, or line breaks into the DNS value.
- Writing
p=quarantineorp=rejectbefore discovering every legitimate sender. - Using an invalid URI in
rua, such as a bare mailbox address withoutmailto:.
A receiver that sees multiple valid-looking DMARC policy records can treat the domain as having no usable policy. Consolidate the tags into one record. Unlike SPF, where organizations sometimes accidentally create multiple TXT records while adding services, DMARC must be represented by a single policy record for the queried name.
Do not assume a recent DNS edit is globally visible. Check the TTL, query authoritative and public resolvers where practical, and wait for cached values to expire. If a provider asks you to publish a DKIM CNAME or TXT record before it signs mail for your domain, confirm that lookup resolves publicly before turning on a strict DMARC policy.
Fix alignment, the most common DMARC failure
Alignment is the central concept behind most DMARC troubleshooting tips. SPF validates the SMTP envelope sender—often called MAIL FROM, Return-Path, or bounce domain—not the friendly sender address a recipient sees. DKIM validates the domain in the d= value of the cryptographic signature, not necessarily the From: domain either.
Under relaxed alignment, which is the default:
mail.example.comaligns withexample.com.notifications.example.comaligns withexample.com.example-mail.comdoes not align withexample.com.example.co.ukdoes not align withexample.com.
Under strict alignment, domains must match exactly. The DMARC tags are:
adkim=r
aspf=r
for relaxed alignment, and:
adkim=s
aspf=s
for strict alignment.
Relaxed alignment is usually appropriate for organizations that use subdomains for separate mail streams. Strict alignment can be valuable in tightly controlled environments, but it can break legitimate mail if a vendor signs with a subdomain or uses a delegated bounce domain.
A reliable alignment strategy
For most transactional senders, use a visible address such as support@example.com or receipts@example.com, then configure the sending platform to do at least one of the following:
- Sign every message with DKIM using
d=example.comor a subdomain such asd=mail.example.com. - Use a custom envelope-sender or bounce domain such as
bounce.example.com, with SPF authorization for the provider. - Use a dedicated sending subdomain, such as
notify.example.com, for application mail and send visible mail from that same domain.
DKIM alignment is often more resilient than SPF alignment because SPF commonly breaks during forwarding. A recipient-side forwarding server may relay a message from its own IP address, which is not authorized in the original sender's SPF record. The original DKIM signature can still pass after forwarding if the message body and signed headers were not modified.
That does not mean SPF is optional. Publish SPF for all legitimate sending domains, but aim for a functioning aligned DKIM signature as your durable DMARC path.
Repair SPF without creating a lookup-limit failure
SPF is a DNS TXT record that authorizes infrastructure to send mail using a domain in the SMTP envelope sender. A basic record might look like this:
v=spf1 ip4:198.51.100.25 include:spf.transactional-provider.example -all
The syntax means:
v=spf1declares SPF.ip4:198.51.100.25authorizes a particular IPv4 address.include:spf.transactional-provider.exampleauthorizes systems approved by that provider's SPF policy.-allsays all other senders should fail SPF.
Use the exact include value supplied by your provider. Do not invent an include hostname based on a provider's brand name, and do not add a provider's web domain to SPF. SPF includes are authorization mechanisms, not ordinary website URLs.
SPF problems that lead to DMARC confusion
Multiple SPF records: A domain must have one SPF policy. If you publish separate TXT records for an office suite, support system, application server, and marketing platform, receivers can return permerror. Merge the authorized mechanisms into one record.
Too many DNS lookups: SPF evaluation has a limit of ten DNS-mechanism lookups. include, a, mx, exists, redirect, and some nested mechanisms can contribute. A chain of several SaaS providers can exceed the limit even if the top-level SPF record looks short. Simplify unused includes, ask providers for alternatives where appropriate, and validate with an SPF-aware checker.
Using the wrong domain: SPF needs to authorize the domain in MAIL FROM, not automatically the visible From: domain. If the envelope sender is bounce@bounce.example.com, SPF belongs at bounce.example.com. Whether it also aligns with From: sender@example.com depends on your aspf setting.
Overly permissive policies: +all authorizes every sender and defeats the protection SPF is meant to provide. ~all is a soft fail and is sometimes used during a transition, but it is not a substitute for knowing your legitimate mail sources. Once your inventory is accurate, use -all for a clear unauthorized result.
Stale infrastructure: A retired server, old CRM connector, or developer's cloud VM may remain authorized for years. SPF should describe current mail sources, not every host that has ever sent mail.
If SPF passes but DMARC fails, do not keep adding IP addresses blindly. First compare the SPF-authenticated domain with the visible From: domain. The issue may be alignment, not authorization.
Diagnose DKIM signatures, selectors, and message modification
DKIM adds a signature header that lets recipients fetch a public key from DNS and validate selected headers and body content. A message normally contains a header similar to this:
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=example.com; s=s2026; h=from:to:subject:date:message-id;
bh=...; b=...
The receiver looks up this hostname:
s2026._domainkey.example.com
The public DNS record might be a TXT record such as:
v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A...
The p= value is a public key and will be long. Do not manually alter it, wrap it with arbitrary spaces, or substitute a key from another environment.
What a DKIM failure usually means
dkim=none means no usable signature was found. The message may not be configured for signing, may have been sent through a different relay than expected, or may have had its signature removed.
dkim=fail means a signature was present but could not validate. Common causes include:
- The selector in
s=does not exist in public DNS. - The key in DNS is truncated, pasted incorrectly, or published at the wrong hostname.
- The sending provider is signing with its own domain rather than your custom domain.
- A key was rotated before all sending servers began using the new selector.
- A downstream system rewrote signed content after DKIM signing.
- A forwarding gateway added a footer, altered MIME boundaries, re-encoded content, or changed a signed header.
Avoid signing a message and then passing it through another system that rewrites it. For example, a helpdesk, CRM, secure-email gateway, or mailing-list processor can append text to a body or modify headers. A DKIM signature using relaxed canonicalization tolerates certain harmless formatting changes, but it does not make arbitrary message rewrites safe.
Use selector rotation deliberately. Publish the new selector, verify resolution, configure the sending service to sign with it, send live tests, and only then remove the old key after its signed mail has aged out. Removing a still-active selector can create sudden intermittent failures across a distributed sending fleet.
Read DMARC reports as an inventory, not a scorecard
DMARC aggregate reports are XML files sent by participating receivers to the URI in the rua tag. They are often compressed and may arrive daily. A basic policy requesting reports is:
v=DMARC1; p=none; rua=mailto:dmarc-reports@example.com
Use a dedicated mailbox or reporting service; do not send aggregate reports to an ordinary support inbox. Reports can be large, highly technical, and include data from many receiving networks.
Each aggregate report groups mail by source IP and authentication outcome. The important questions are:
- Which source IPs are sending mail that claims to be from your domain?
- Which sources are expected and owned by you or a contracted sender?
- For each legitimate source, does SPF pass, DKIM pass, and does either result align?
- Which failures reflect spoofing rather than a broken legitimate sender?
- Are message counts stable, or did a new sender appear after a product launch or integration change?
A report line showing spf=fail, dkim=fail, and an unfamiliar source IP is often valuable evidence that DMARC is detecting impersonation. Do not “fix” that by adding the IP address to SPF.
A line showing spf=pass, dkim=pass, but disposition=none and dmarc=fail usually points to an alignment issue. A line showing spf=temperror or dkim=temperror may point to transient DNS or receiving-side conditions; investigate patterns before changing policy.
If you send reports to a mailbox outside the domain being protected, DMARC requires an external reporting authorization record. For a policy on example.com that sends reports to reports@reporting.example.net, publish a TXT record at:
example.com._report._dmarc.reporting.example.net
with this value:
v=DMARC1
Many managed reporting services provide the required authorization value and hostname. Follow their documentation exactly.
Move from p=none to quarantine and reject safely
A DMARC record can publish one of three policy values:
p=none
p=quarantine
p=reject
p=none requests monitoring and reporting without asking receivers to quarantine or reject failing messages. It is useful during discovery, but it does not stop spoofed email by itself.
p=quarantine asks receivers to treat failing messages suspiciously, which can mean spam placement or another receiver-specific handling action. p=reject asks receivers to reject failing messages during SMTP processing. Receiving systems make their own final decisions, so DMARC policy is an important signal rather than an absolute guarantee of identical behavior everywhere.
A conservative rollout looks like this:
- Publish
p=nonewithruareporting. - Inventory every legitimate sending service, including support tools, payroll systems, document-signing services, product email, marketing platforms, and human mailboxes.
- Fix aligned SPF or DKIM for every legitimate source.
- Monitor reports over normal business cycles, including invoicing dates, password-reset events, seasonal campaigns, and automated reports.
- Move to
p=quarantine; pct=10, then increasepctgradually after observing no material legitimate failures. - Move to
p=reject; pct=10, then raise the percentage toward 100 as confidence grows.
The pct tag controls the percentage of failing mail to which the requested policy applies. It does not protect a random sample of your valid mail; it samples policy application among messages that fail DMARC. A cautious record could be:
v=DMARC1; p=quarantine; pct=25; rua=mailto:dmarc-reports@example.com
Do not mistake a lack of visible user complaints for success. A misconfigured sender may be silently landing in spam, affecting only a low-volume workflow, or failing at a mailbox provider that sends limited feedback. Test critical mail flows deliberately.
Handle third-party senders, forwarding, and mailing lists
Third-party senders are the main reason otherwise mature domains delay DMARC enforcement. The problem is not that you use multiple vendors; the problem is failing to give each legitimate sender an aligned identity.
For each provider, document:
- The visible
From:domain and subdomain it uses. - The envelope-sender or custom return-path domain it supports.
- Its DKIM signing domain and selector arrangement.
- DNS records it requires, including TXT and CNAME records.
- Whether it supports a dedicated sending subdomain.
- The application, team, owner, and message types using it.
A practical architecture is to separate streams by subdomain:
notifications.example.com → product and transactional email
marketing.example.com → newsletters and campaigns
support.example.com → helpdesk notifications
Then publish a DMARC policy for each subdomain as needed, while retaining an organizational-domain policy for the root domain. This reduces blast radius: an issue with a marketing tool does not need to endanger password-reset mail.
Forwarding deserves special care. Ordinary forwarding commonly breaks SPF because the forwarding server is not included in the original sender's SPF policy. DKIM may survive if the message remains intact. Mailing lists can be harder because list software may alter the subject, body, recipient headers, or add a footer, breaking DKIM too.
ARC, or Authenticated Received Chain, can help receivers assess authentication results before a message was changed in transit. However, ARC support and trust are receiver-specific. Do not rely on ARC as a reason to leave your own aligned SPF and DKIM unfinished.
Never use a consumer mailbox address as the visible From: identity for a system that sends through your own infrastructure. For example, sending From: employee@gmail.com through an application relay means your system cannot generally create aligned authentication for gmail.com. Use an address at a domain you control and put the external address in Reply-To: if a reply should go there.
Interpret SMTP and API errors in context
DMARC failure is not always returned as a neat DMARC-specific error. A recipient may accept the message and place it in spam, temporarily defer it, quarantine it, or reject it with a policy-related SMTP response.
Useful SMTP status-code categories include:
250 2.0.0: The receiving server accepted the message. This confirms acceptance, not inbox placement or DMARC success.421 4.7.x: A temporary policy, reputation, authentication, or rate-related deferral. Retry according to the server's guidance and investigate if it persists.450 4.7.1: Often a temporary policy-related deferral, though the exact meaning depends on the recipient.550 5.7.1: A permanent policy or permission rejection. Read the full enhanced-status message.550 5.7.26: A Gmail rejection commonly associated with missing or failed authentication checks; inspect SPF, DKIM, and the actual source IP and identities in the bounce.
If you send through an HTTP API, separate provider acceptance from recipient acceptance. An API response such as 202 Accepted commonly means the provider accepted your request for processing; it does not mean the destination mailbox accepted the message. Review provider event data, SMTP bounce classifications, and the original recipient response.
For a repeatable troubleshooting workflow, capture:
- The recipient domain and timestamp in UTC.
- The full SMTP response or API event payload.
- The
Message-IDyou generated or received from the sender. - The visible
From:, envelope sender, and DKIMd=domain. - The sending IP or provider route when available.
- A copy of the original MIME source and authentication results from a test inbox.
This evidence lets an email provider, DNS administrator, or security team diagnose the correct layer. Avoid reporting only that “DMARC is failing”; include the exact alignment state.
When adding a new sender to an application, follow its email API reference and setup guides closely for the exact DNS records and sender-domain verification sequence. The same principle applies whether the application sends through REST or an SMTP relay: make the configured sender identity match the authentication identity you intend to use.
Use the right testing tools—and know their limits
DNS checks, inbox-header inspection, and reporting answer different questions. Use more than one method before declaring a deployment complete.
A practical toolset includes:
digandnslookupfor direct DNS checks.- MXToolbox for public DNS and mail-authentication lookups.
- mail-tester.com for sending a test email and reviewing authentication, MIME, and basic deliverability signals.
- Gmail Postmaster Tools for eligible domains sending to personal Gmail accounts, including authentication and compliance information.
- A DMARC report parser or dashboard for turning aggregate XML reports into a sender inventory.
- A controlled test mailbox at major providers for reading raw headers and comparing receiver behavior.
Mail-tester.com is useful for catching missing authentication, malformed content, and configuration mistakes, but a good test score is not a promise of inbox placement at every provider. Similarly, an MXToolbox lookup can show that a record is syntactically visible, but it cannot prove that a real message is signed by the aligned domain.
Build automated checks into deployment work. When DNS or sender settings change, test the exact production From: address, send a plain-text and HTML message, verify DKIM signatures, and ensure the final recipient headers say dmarc=pass. For teams with multiple applications, make sender-domain ownership part of the release checklist.
Avoid the fixes that make DMARC worse
Some quick fixes only conceal the actual issue or introduce a new one.
Do not weaken a policy permanently because one legitimate workflow failed. Find the workflow, determine whether it needs custom DKIM, a custom return-path domain, or a different visible From: address, and correct it.
Do not add unknown IP addresses from aggregate reports to SPF. Attackers can spoof your domain in the visible header and generate report entries. SPF should list only systems you operate or explicitly authorize.
Do not use a single shared sender address for every tool without confirming each tool can authenticate it. A visible address like no-reply@example.com is not enough; the tool must produce aligned SPF or DKIM for example.com.
Do not turn on strict alignment merely because it sounds more secure. Strict alignment can be appropriate, but it is a compatibility decision. If your legitimate message streams use subdomains, relaxed alignment may provide strong protection with much less operational risk.
Finally, do not treat DMARC as an inbox-placement switch. DMARC is necessary authentication and anti-impersonation infrastructure, but delivery also depends on content, recipient engagement, list quality, complaint rates, IP and domain reputation, sending consistency, TLS, reverse DNS, and recipient-specific filtering.
A repeatable DMARC troubleshooting checklist
Use this sequence whenever a legitimate message fails, is quarantined, or is rejected:
- Obtain the original message source or full bounce response.
- Record
From:,Return-Path, SPF domain, DKIMd=domain, selector, and the recipient'sAuthentication-Resultsheader. - Confirm the DMARC record exists at
_dmarc.example.comand contains one validv=DMARC1policy. - Determine whether SPF passes and whether its envelope-sender domain aligns.
- Determine whether DKIM passes and whether the signing domain aligns.
- Verify public DNS for SPF, the DKIM selector, and any custom bounce-domain records.
- Check for SPF multiple-record errors or lookup-limit problems.
- Identify whether the mail used your REST API, SMTP relay, office suite, CRM, helpdesk, or another service.
- Compare the failure with aggregate DMARC reports to see whether it is isolated or systematic.
- Make the smallest correct change, send fresh tests, and verify
dmarc=passin recipient headers before changing enforcement.
A well-run DMARC deployment is ongoing operational work. Keep an owner for each sending system, review reports after introducing vendors or changing DNS, and treat authentication failures as a release-quality issue rather than a marketing-email problem.
FAQ
Why does DMARC fail when SPF passes?
SPF can pass for the envelope-sender domain while the visible From: domain is different. DMARC requires the SPF domain to align with From:. Check smtp.mailfrom= and header.from= in the recipient's authentication headers.
Can a message pass DMARC if SPF fails?
Yes. DMARC passes when either aligned SPF or aligned DKIM passes. In practice, aligned DKIM is especially important because ordinary forwarding can break SPF.
Should I start DMARC with p=reject?
Usually no. Begin with p=none and aggregate reporting, identify all legitimate senders, repair alignment, then move gradually through quarantine and reject. Immediate rejection can block infrequent but business-critical mail from forgotten systems.
What is the best DMARC record for a new domain?
A safe initial record is v=DMARC1; p=none; rua=mailto:dmarc-reports@example.com. It is only a starting point: add reporting, review the data, and move to enforcement after all legitimate mail has aligned authentication.
Does DMARC guarantee inbox placement?
No. DMARC helps receivers validate domain identity and handle unauthenticated mail, but it does not override spam filtering or sender reputation. A DMARC-passing message can still be filtered if recipient signals, content, complaints, or sending behavior are poor.