DMARC Inspector

Enter a domain and see the DMARC record it publishes, what that policy does to mail which fails, and which of its tags are wrong.

Secure server processingWeb & SEOWorkingNo account needed

What this tool does

DMARC Inspector sends the domain you enter to the OmniKitly service, which resolves the TXT records at _dmarc followed by that name — the one place a DMARC record is ever published. The record that comes back is then analysed in the page itself. The first line gives the policy on its own and what it does to failing mail; a table lists every tag as published with what that tag means; and rows are added for the defaults a record leaves out, so an absent sp shows as inherited from p and unset alignment shows as relaxed. Findings and Notes follow underneath, and the raw lookup — the exact name queried, every TXT string found at it and the service's own summary — stays downloadable as dmarc-yourdomain.json.

The policy tag is the whole point of the record, and its three values are nowhere near equivalent. A policy of none changes nothing about delivery: mail failing the check arrives exactly as it did before, and the record buys reports and nothing else. Quarantine asks receivers to file that mail as spam. p=reject asks them to refuse it during the SMTP conversation, and it is the only setting that actually stops a stranger sending as the domain. A record can carry every optional tag, look thoroughly considered, and still be doing nothing, because monitoring is where most rollouts stop and quietly stay.

Four things limit what a result can settle. The query is made against exactly the name you type and never climbs to the organisational domain, so asking about mail.example.com reports nothing even when example.com publishes a record its subdomains inherit. A resolver failure is not distinguished from an absent record — a timeout, a server failure and a domain publishing nothing all end at the same "No DMARC record published" note. When two DMARC records sit at the same name, a state receivers treat as having no usable policy at all, only the first is analysed and the second shows up solely in the downloaded JSON. And where aggregate reports go to an outside domain, the report names the authorisation record that domain must publish (yourdomain.example._report._dmarc.theirdomain) without ever querying it, so that check is left with you.

Whatever the input field says, this page can only run a hostname. The label reads "DMARC record — or a domain to look it up", the placeholder offers both, and Load sample fills the box with a complete record — but sending that record returns "That is not a valid hostname" from the service, because semicolons, spaces and equals signs are not a host name. The record parser those controls point at is real, and is exactly what analyses the record once the lookup has fetched it; it simply cannot be reached by pasting. Typing _dmarc.example.com out in full fails the same check, since an underscore is not accepted in the name you submit and the label is prepended for you anyway. The domain travels over an encrypted connection as a job setting, is stored alongside the job record, and goes when the JSON does at the end of the retention window — six hours after the run unless that default has been changed.

Enforcement is only ever as good as the alignment underneath it, and the analysis says so where the record asks for strict. With adkim=s or aspf=s, a signature or an envelope domain that merely shares the organisational domain no longer counts, so mail from a subdomain or from a sender that rewrites the return path fails DMARC while SPF and DKIM both report a pass. That combination, read next to quarantine or reject, is the usual explanation for a campaign disappearing into spam the week a record was tightened.

How to use it

  1. Enter the domain on its own. example.com, not _dmarc.example.com and not a full URL. The service prepends the _dmarc label itself and queries the TXT records at the resulting name.
  2. Read the first line of the report. It states the policy by itself, then what happens to mail that fails. The hint under the output box counts the errors and warnings found in the record.
  3. Work down the Findings list. Errors are the faults that break the record or an address inside it. Warnings are what weakens it: no rua, a pct below 100, ruf set without rua.
  4. Keep the JSON when tracking a rollout. The lookup downloads as dmarc-yourdomain.json, so a before-and-after pair becomes a diff rather than a memory of what the record said last month.

Processing & privacy

Secure server processing. This operation requires temporary server processing.

Common use cases

Judging whether a supplier can be impersonated

A domain sitting on a policy of none can be forged in mail that passes every filter the recipient has. One lookup answers that for a domain you do not control.

Confirming your own edit went live

DNS changes propagate on their own schedule. Querying the published name shows what receivers can see, rather than what the control panel form says was saved.

Moving from monitoring towards enforcement

A rollout stalled at monitoring for a year is the normal outcome. Running the lookup at each step records what was actually live when the change was made.

Explaining mail that lands in spam

The table shows what the domain published, so strict alignment sitting next to quarantine accounts for a subdomain or a bulk sender failing while SPF and DKIM pass.

Questions

Where does the domain I type end up?
On the OmniKitly processing service. DMARC Inspector runs there rather than in the browser. The domain travels there over an encrypted connection as a job setting, the DNS query is made from the service, and the report and its job record are deleted together when the retention window ends, six hours after the run by default. No file is involved in the job.
Why does it report no record when I know one exists?
Usually the name. The lookup queries _dmarc plus exactly the domain typed, with no walk up to the organisational domain, so a subdomain reports nothing even when its parent publishes a record it inherits. The other cause is that a failed query and a genuinely absent record produce the same line, so a resolver problem also reads as no record.
The field offers to take a pasted record — does that work?
Not from this page. Every run is dispatched to the service as a hostname, so a pasted record comes back as "That is not a valid hostname", and the Load sample button loads exactly the kind of text that fails. Enter the domain instead: what the lookup fetches goes through that same parser.
Does it tell me whether my record is correct?
It works through the record tag by tag. v has to come first and read DMARC1; p, sp and np have to be none, quarantine or reject; adkim and aspf have to be r or s; pct has to be a whole number no higher than 100; fo, ri and rf have to be well formed; rua and ruf have to be mailto: or https: URIs carrying a real address; and duplicate or unrecognised tags are named. What it cannot tell you is whether an outside reporting domain has authorised you, or that a second record is published beside the one it read.
Does p=reject stop everything pretending to be my domain?
It stops unauthenticated mail claiming your domain in the From header, at receivers that honour DMARC, which covers the large mailbox providers. It does nothing about a lookalike domain, a display name carrying someone else's address, or mail sent from a domain that never published a record.
How soon does a change to my record appear here?
The query goes through the service's own resolver, so an answer can be served from cache until the record's time to live expires. A change made minutes ago may not show yet, and the report does not include the TTL, so the wait is whatever your DNS host set on the record.
Does this check SPF and DKIM as well?
No. It reads the DMARC record and nothing else. SPF Inspector parses an SPF record and counts the DNS lookups it costs, and Email Header Analyzer shows what a receiving server recorded for SPF, DKIM and DMARC on a message that has already arrived.

Related tools