Siftsmith
← All guides

Fix “Multiple DMARC records found”

When a domain publishes more than one DMARC record, receivers throw all of them away and apply no DMARC policy for it. See every record at your _dmarc name below, get a merged record to replace them with, and check the fix with dig or nslookup.

Last verified 30 September 2026.

What the error means

A domain’s DMARC policy lives in a TXT record at _dmarc. plus the domain, for example _dmarc.example.com. The standard allows exactly one record there that starts with v=DMARC1. Checkers report “multiple DMARC records” when they find two or more.

Receivers don’t pick one, merge them or use the strictest. They discard the lot:

The practical effect is the same as publishing no DMARC record at that name: your p=quarantine or p=reject isn’t enforced, spoofed mail using your domain in the From: address gets no DMARC treatment, and no aggregate reports reach your rua addresses. A published DMARC record is also part of the Gmail, Yahoo and Microsoft bulk sender requirements.

One difference between the two versions: under RFC 9989 the lookup then continues up the DNS tree as if the name had no record (§4.10.1), so duplicates on a subdomain such as _dmarc.mail.example.com make it fall back to the organizational domain’s record and its sp= policy. Under RFC 7489 discovery simply stops. Either way, the policy you wrote for that name is never used.

See every record at your _dmarc name

Enter the domain in your From: address. The lookup runs in your browser against public DNS and lists every TXT record at _dmarc, including the ones receivers ignore.

This reads what your DNS publishes right now through Cloudflare’s public resolver. If you just changed a record, an old answer can stay cached until its TTL runs out. For the full A–F grade with SPF, DKIM, MTA-STS, BIMI and DNSSEC, use the DMARC checker.

What counts as multiple records, and what doesn’t

Two TXT records at _dmarc that both start with v=DMARC1Multiple records. Both are discarded. This is the error, even when the two are identical.
One TXT record made of several quoted stringsFine. DNS stores long TXT values as chunks of up to 255 characters, and receivers join them in order into one record (RFC 9989 §4.5). In dig it’s one line: "v=DMARC1; p=reject; " "rua=mailto:dmarc@example.com".
One v=DMARC1 record plus a TXT record that doesn’t start with itNot multiple. Records that don’t start with v=DMARC1 are discarded first (RFC 7489 §6.6.3 step 2, RFC 9989 §4.10 step 2), and the one DMARC record applies. Remove the stray record anyway: it does nothing, and anything in it is lost (see the split-record cause below).
One record at _dmarc.example.com and one at _dmarc.mail.example.comFine. Different names. Each subdomain can have its own single record.

Common causes

A DMARC vendor or email provider added its own record

The most common case. You signed up for a DMARC reporting service, or followed a mail provider’s setup guide, and added the record it gave you without removing the one that was already there. Now there are two, often with different p= values and different rua= addresses. Some registrars also create a default DMARC record when you turn on their email or DNS, which then sits next to the one you add later.

Records added in two places

Two people or teams each “added DMARC” without checking. Or the domain is served by two DNS providers at once (name servers at both), and each zone was edited separately: resolvers get whichever provider answers, so a checker can report different records from one run to the next. Keep one authoritative copy of the zone, or make sure both providers hold the same single record.

One record split into two TXT records

A long record pasted as two separate TXT records instead of one TXT record with two strings. If both halves start with v=DMARC1, that’s multiple records. If only the first does, the second half is silently discarded as not-DMARC, so the tags in it (often the rua= address) never take effect and you get no reports. Put the whole value in one record; if your DNS host needs it split, split it into quoted strings inside that one record.

A CNAME and a TXT record at _dmarc

Some DMARC services host your policy for you: you point _dmarc.example.com at their name with a CNAME, and they publish the record. A CNAME can’t share its name with any other record (RFC 1034 §3.6.2). Many DNS hosts refuse the combination. Where both exist, answers depend on which server and resolver you ask: some lookups return the vendor’s record, some return yours, and a checker can see both. Choose one: keep the CNAME and delete your TXT record, or delete the CNAME and publish one TXT record yourself.

An SPF record at _dmarc

A v=spf1 record published at _dmarc by mistake. Receivers discard it for DMARC purposes (it doesn’t start with v=DMARC1), so it doesn’t cause the error on its own, but some checkers count every TXT record at the name and report it as a duplicate. It also means SPF isn’t where it should be: SPF belongs on the domain itself (example.com), not on _dmarc. Delete it from _dmarc and make sure the root has exactly one SPF record.

Merge them into one record

Say _dmarc.example.com has these two records, an older one of your own and one a reporting vendor gave you:

v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com
v=DMARC1; p=none; rua=mailto:abc123@rua.vendor.example; fo=1

Replace both with one:

v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com,mailto:abc123@rua.vendor.example; fo=1
  1. Start with v=DMARC1, first, exactly once.
  2. Pick one p=: the policy you actually mean to enforce, normally the stricter of the two (reject over quarantine over none). Do the same for sp= and np= if either record has them; a record without sp= applies its p= to subdomains, so count that as its sp=.
  3. Combine the reporting addresses into one rua= tag, separated by commas. RFC 9989 defines rua as a comma-separated list of URIs (§4.6, §4.7), and a report should go to each. Do the same for ruf=.
  4. Keep the strictest alignment: if either record has adkim=s or aspf=s, keep it.
  5. Publish the merged record and delete every other TXT record at _dmarc, including stray non-DMARC ones.

Check the policy before you publish. While the duplicates were live, no policy was applied at all. The moment you publish a single record with p=quarantine or p=reject, receivers start enforcing it, and any sending service that doesn’t pass DMARC starts landing in spam or bouncing. If you haven’t read aggregate reports that show all your legitimate mail passing, publish the merged record with p=none first, watch the reports for a week or two, then raise it.

A rua address on a different domain from yours (a vendor’s, like the example above) only receives reports if that domain authorizes it with a record at example.com._report._dmarc.rua.vendor.example (RFC 9990 §4). The vendor publishes that on its side; you don’t add anything.

If an old record has pct=: RFC 9989 removed that tag and replaced it with t=y for testing mode (Appendix A.6). pct=100 is the default, so you can simply leave it out.

Verify the fix

From a terminal on macOS or Linux:

dig +short TXT _dmarc.example.com

You want exactly one line starting "v=DMARC1. One line with several quoted parts is one record split into strings, which is fine. Two lines that each start "v=DMARC1 is the error. If the first line is a host name, _dmarc is a CNAME and the records below it come from that name.

On Windows:

nslookup -type=TXT _dmarc.example.com

Each record appears as its own text = entry; you want one. To skip your local cache and ask two public resolvers directly:

dig +short TXT _dmarc.example.com @1.1.1.1
dig +short TXT _dmarc.example.com @8.8.8.8

If you still see the old records, the resolver is serving a cached answer: wait for the record’s TTL (often an hour or less) and check again, or run the checker above.

FAQ

Is a DMARC record split into several quoted strings the same as multiple records?

No. A single TXT record can hold several quoted strings, and receivers join them in order into one record (RFC 9989 §4.5). In dig it shows as one line with several quoted parts. Multiple records means two or more separate TXT records at _dmarc that each start with v=DMARC1; dig shows each on its own line.

What do receivers do when a domain has two DMARC records?

They discard both. Under RFC 7489 §6.6.3, policy discovery stops and DMARC is not applied to the message. Under RFC 9989 §4.10, all the records at that name are discarded and the lookup moves on as if the name had none, so a subdomain can fall back to its organizational domain’s record, but the domain’s own policy and reporting addresses are never used.

Can I have one DMARC record for the domain and another for a subdomain?

Yes. _dmarc.example.com and _dmarc.mail.example.com are different names, so each can hold one record. The rule is one v=DMARC1 record per name.

How do I send DMARC reports to two places?

List both addresses in one rua tag, separated by a comma: rua=mailto:dmarc@example.com,mailto:reports@vendor.example. RFC 9989 defines rua as a comma-separated list. Don’t publish a second record for the second address.

Checking many domains?

If you manage domains for clients or brands, Email Security Signals checks a whole list and returns one row per domain with SPF, DKIM, DMARC and an A–F grade. Duplicate DMARC records show up as a dmarc_multiple_records issue with the record count, ready to filter in a CSV export. $0.02 per graded domain ($20 per 1,000); invalid inputs, domains that don’t exist, DNS lookup failures and duplicates are free.

Check a list on the Apify Store →

Related: fixing Outlook’s 550 5.7.515 bounce and fixing SPF “too many DNS lookups”.