Email authentication
DMARC record parser
Paste a DMARC record you are drafting and read every tag in it, with the syntax a receiver would discard it for.
Free, no accountIn your browser
Paste the whole TXT value. Quotes, a record name or a whole "IN TXT" line are fine - they are stripped before parsing. Nothing is looked up or stored.
Result
Nothing pasted yet
Paste a DMARC TXT value and every tag in it is explained as you type.
What this is
This DMARC record parser takes the TXT value you paste - a record you are drafting, or one a vendor sent you that nobody has published yet - and explains every tag in it, naming the syntax errors that would make a receiver throw the whole record away. No domain, and no lookup.
A DMARC record is a semicolon-separated list of tag=value pairs, and RFC 7489 section 6.3 registers eleven of them. Two are compulsory and have to come in order: "v=DMARC1" first, then "p". The other nine have defaults, which is why a short record and a long one can ask for very nearly the same thing - and why a tag nobody set still has an effect worth reading.
Most of what goes wrong in a draft is not the policy but the grammar around it: a tag name with a typo, a report address written as a bare email address, a percentage with a "%" after it, a word where a single letter belongs. A receiver does not write back about any of that. It either applies a default you did not choose or discards the record entirely, and both look identical from the outside.
How to read the result
The table lists all eleven tags whether or not this record sets one, so the defaults are visible rather than implied: what is beside "adkim" when you never wrote an "adkim" tag is what a receiver will actually use. An unregistered tag name is listed under them, separately, because a receiver ignores it entirely.
A fail means a receiver would either discard the record or quietly substitute a default - the text is wrong, not just unwise. A warn means the record is valid and does less than it looks like it does: monitoring only, a percentage that enforces nothing, a reporting tag with nowhere to report to. An info is the tag explained, including the ones you left out.
This page checks a draft DMARC record’s tags, not why DMARC fails when SPF alone passes. For how SPF, DKIM and DMARC fit together, what order to fix them in, and what to do once one fails, see our guide How SPF, DKIM and DMARC work together, and what to do when one fails.
Common mistakes
What goes wrong most often, and how to tell.
- Treating a record that parses here as a record that is liveThis reads text, not DNS. A draft can be perfect in the box and absent from your domain, or a different record can already be published at the same name - which is worse, because the old one is what receivers act on.
- Writing a report address as a bare email addressA DMARC report destination is a URI, not an address: "[email protected]" on its own is not one, and RFC 7489 section 6.3 has a receiver ignore a URI whose scheme it does not support. The reports simply never start arriving.
- Spelling a single-letter value out as a wordAlignment is "r" or "s", not "relaxed" or "strict", and failure options are "0", "1", "d" and "s". A spelt-out value is not in the grammar, so the tag falls back to its default and the record is looser than it reads.
- Expecting an error when a tag name is misspeltRFC 7489 section 6.3 requires receivers to ignore a tag they do not recognise. "policy=reject" is not a complaint anywhere - it is a record with no policy at all, which is a very quiet way to enforce nothing.
Questions
What people ask about this tool.
- RFC 7489 section 6.3 says the "v" tag must be the first tag in the list and its value must match "DMARC1" precisely, and section 6.6.3 has a receiver discard any record that does not start that way. A record with the tags in a different order is not a lenient parse away from working - it is ignored.
- No. The grammar in RFC 7489 section 6.4 ends with an optional separator, so a trailing semicolon is part of the record format. This tool says so explicitly, because several checkers report it as an error and people then edit a working record to silence them.
- No, and that is the point of a parser rather than a checker: it makes no DNS query at all, so it can only judge the text you pasted. To see what is live at "_dmarc." plus your domain, including whether two records are published at once, use the DMARC checker instead.
- Nothing, in practice. Zero is inside the range RFC 7489 section 6.3 allows, but the sampling rule in section 6.6.4 only selects a message when a random number under 100 is below the percentage, which never happens at zero - so "p=reject; pct=0" behaves exactly like "p=none".
- Eleven, per RFC 7489 section 6.3: v and p are required, and sp, pct, rua, ruf, adkim, aspf, fo, ri and rf are optional with defaults. Anything else is an extension nobody has registered, and a receiver is required to ignore it rather than report it.
Sources
Every fixed value here comes from the provider’s own documentation. These pages change, so each says the day it was last read.
- IETF, “RFC 7489 §6.2 - DMARC URIs” read 13 October 2026
- IETF, “RFC 7489 §6.3 - General Record Format” read 13 October 2026
- IETF, “RFC 7489 §6.4 - Formal Definition” read 13 October 2026
- IETF, “RFC 7489 §6.6.3 - Policy Discovery” read 13 October 2026
- IETF, “RFC 7489 §6.6.4 - Message Sampling” read 13 October 2026
- IETF, “RFC 7489 §7.1 - Verifying External Destinations” read 13 October 2026
Use it from the API
The same check, as one request.