[ DMARC & policy ]

DMARC record syntax: active tags, values and failure handling

Use a current RFC 9989 reference for DMARC policy tags, validate the complete record set, and understand defaults and error handling before publishing.

By the EmailAuth research team · 9 min read

On this page

A DMARC TXT record can be visible in DNS and still fail to express the policy its owner intended. Correct evaluation depends on the publishing name, record set, tag grammar, active registry and the receiver's implementation.

This guide uses RFC 9989 for the core protocol. Reporting formats and transport are specified separately in RFC 9990 and RFC 9991.

Publish at the correct owner name

For an ordinary domain, receivers discover DMARC policy under an applicable _dmarc name. A TXT value placed only at the domain root is not a substitute. Policy discovery can also involve fallback rules and domain-boundary processing, so do not derive the organisational domain by simply taking the last two labels.

At the selected owner name, validate the complete TXT record set. Do not assume receivers will merge two DMARC policy records. Correct duplicate or competing candidates rather than adding another record.

Start with the version tag

The record is a semicolon-separated list of tag-value pairs. The version tag is:

TagPurposeCurrent value rule
vIdentifies the DMARC recordv=DMARC1 and first in the record

RFC 9989 retains DMARC1. Do not publish v=DMARC2.

Use the registered lower-case tag names, the exact version value DMARC1 and each tag's defined value rules. Do not rely on changing the case of a registered name to produce an equivalent recognised tag.

Understand the policy tags

TagPurposeValues or formDefault or fallback
pRequested handling for the policy domainnone, quarantine, rejectSee the conditional discovery fallback below
spPolicy for applicable subdomainsnone, quarantine, rejectFalls back to p when absent
npPolicy for non-existent subdomains in its defined scopenone, quarantine, rejectFalls back to sp, then p
tTesting flagy or nn
adkimDKIM alignment moder or sr
aspfSPF alignment moder or sr
ruaAggregate report destination listURI listNo aggregate destination when absent
rufFailure report destination listURI listNo failure destination when absent
foFailure-report request options0, 1, d or s, combined as permitted by the grammar0; ignored without ruf
psdPublic-suffix-domain indicatoru, y or nu

This table summarises RFC 9989 section 4.7; it is not a recommendation to publish every tag. Omit optional tags when their defined default matches the intended policy and the omission has been tested against the receivers that matter.

Read policy defaults precisely

RFC 9989 recommends p but does not make its presence mandatory. Its policy-discovery rules in section 4.10.1 specify the fallback precisely: if p is missing or invalid, or sp or np has an invalid value, the receiver continues as if p=none was retrieved only when rua contains at least one syntactically valid reporting URI. Otherwise, no DMARC processing is applied to that message.

For operational change control, make the intended policy explicit unless a reviewed use case requires otherwise. Test legacy and current fixtures if your environment depends on receivers with different implementations. Record which specification assumption supports the expected result.

These are synthetic parsing fixtures, not published records:

Single candidate valueCurrent discovery interpretation
v=DMARC1; p=none; rua=mailto:reports@example.comExplicit none policy with an aggregate reporting request
v=DMARC1; p=invalid; rua=mailto:reports@example.comInvalid p with a syntactically valid rua URI: continue as p=none
v=DMARC1; p=invalidInvalid p without a qualifying rua URI: no DMARC processing for the message

The presence of a syntactically valid URI establishes the fallback condition. It does not prove that the destination is authorised where required, reachable or collecting reports.

sp applies to relevant subdomain policy discovery. np addresses non-existent subdomains under the updated specification. A domain with no MX record is not automatically a non-existent domain; DNS existence is a separate question.

The default psd=u means the domain is not a public suffix, while its organisational-domain status is determined through the DNS tree walk. An explicit psd=n states that it is the organisational domain for itself and its subdomains. psd=y identifies a public suffix domain. Omitting psd is therefore not equivalent to explicitly publishing psd=n.

The default fo=0 requests a DMARC failure report when every underlying authentication mechanism fails to produce an aligned pass. Without ruf, fo is ignored; the request also does not guarantee that a receiver will generate a report.

Use the testing flag as defined

The t tag is not a percentage. With t=y, the declared p, sp or np policy assessment is reduced by one level: reject becomes quarantine and quarantine becomes none. A declared none assessment is unchanged. The tag does not disable validation or reporting.

Receiver support must still be observed. Do not promise a uniform delivery outcome based only on the presence of t=y.

Treat alignment tags as trust decisions

adkim=s requires exact DKIM-domain alignment. adkim=r permits the applicable organisational-domain relationship. aspf works similarly for the authenticated SPF domain.

Relaxed alignment is not a textual suffix comparison and does not allow an arbitrary service domain. Strict alignment can narrow the accepted relationship, but it can also expose legitimate subdomain variation. Choose the mode from actual identity architecture rather than from a preference for stricter-looking syntax.

Configure reporting destinations deliberately

rua and ruf contain report destination URIs, commonly mailto addresses. An external destination can require destination-side authorisation. Publishing an address does not guarantee that every receiver will send a report or that the destination can safely ingest it.

Aggregate and failure reporting have distinct privacy, operational and format considerations. Validate size, access, retention, parsing and escalation. A mailbox that silently discards reports does not make the policy invalid, but it defeats the intended evidence workflow.

Avoid obsolete copy-and-paste tags

The current IANA registry is the operational reference for active parameters. pct, rf and ri are historical rather than active RFC 9989 policy controls. Do not carry them into a new record merely because they appear in an old example.

Removing an obsolete tag does not replace a deployment plan. Compare receiver behaviour, record the change and verify that current tags express the intended outcome.

Validate four layers

A dependable review checks:

  1. DNS owner: Is the record published at the exact applicable _dmarc name?
  2. Record set: Is there one coherent DMARC policy record rather than competing candidates?
  3. Grammar: Is v=DMARC1 first, with valid separators, names and values?
  4. Semantics: Do p, sp, np, t, alignment and reporting destinations represent the approved decision?

Then send representative messages. A DNS lookup proves only what was observed in DNS at that time. It does not prove that outbound mail receives an aligned pass.

Work through a synthetic record

Consider this fictional record:

TagValueIntended decision
vDMARC1Identify the record
pquarantineRequest quarantine assessment for failure
sprejectUse a different requested policy for applicable subdomains
nprejectAddress non-existent subdomains in scope
tyReduce each declared assessment by one level for testing
adkimsRequire exact DKIM alignment
aspfrUse relaxed SPF alignment
ruamailto:dmarc-agg@example.comRequest aggregate reports

With t=y, the declared quarantine assessment is reduced to none and each declared reject assessment is reduced to quarantine when a compliant receiver applies the tag. This is a testing interpretation, not a prediction of final placement.

Before publication, verify that the reporting mailbox and any external authorisation work, that exact DKIM alignment is realistic for legitimate signatures, and that subdomain ownership supports the requested policies.

Keep a versioned policy record

Store the approved record, owner name, resolver observations, evidence date, owner and rollback value. Recheck after DNS propagation and after material sender or specification changes.

Syntax is only the first gate. A record is operationally sound when its semantics match the identity architecture, reporting destinations are governed and representative mail confirms the intended aligned paths.

[ By role ]

What this means for you

Choose your role for practical next steps.

IT / Mail Admin

Validate owner, record set, grammar and semantics.

A visually plausible string can still be published at the wrong name, conflict with another record or express the wrong fallback.

Next steps

  1. Query the exact owner name.
  2. Check the current IANA registry.
  3. Test representative received messages.

CISO / SecOps

Govern trust boundaries and report data.

Alignment modes, subdomain policies and report destinations create distinct security and privacy decisions.

Next steps

  1. Review delegated subdomains.
  2. Authorise external reporting destinations.
  3. Record receiver-support assumptions.

Founder / Non-technical

Treat syntax as an executable policy decision.

A short TXT value can affect legitimate business mail when its semantics do not match real sending routes.

Next steps

  1. Require an accountable policy owner.
  2. Approve subdomain and reporting scope.
  3. Keep a verified rollback value.

[ FAQs ]

Frequently asked questions

Must v=DMARC1 appear first?

Yes. The version tag identifies the record and must be first. RFC 9989 retains the value DMARC1.

Is p required to appear in every current record?

No. RFC 9989 recommends p. Its discovery fallback treats missing or invalid p, or invalid sp or np, as p=none only when rua contains a syntactically valid reporting URI; otherwise it applies no DMARC processing. Ordinary change control should state the intended policy explicitly.

What is the fallback for sp?

When sp is absent, the applicable subdomain policy falls back to p. A subdomain can also publish its own applicable policy under discovery rules.

What is the fallback for np?

When np is absent, its defined non-existent-subdomain assessment falls back to sp and then p. DNS existence is not the same as having an MX record.

Does t=y turn enforcement off?

No. It reduces a declared reject assessment to quarantine and quarantine to none. It does not disable validation or reporting, and receiver implementation matters.

Can two DMARC records be combined?

Do not assume so. Multiple candidate policy records can prevent a valid policy from being used. Correct the complete record set instead of adding another policy TXT value.

Should new records include pct, rf or ri?

No. They are historical rather than active RFC 9989 policy controls. Use the current IANA registry and current specifications.

Does a valid DNS record prove real mail passes DMARC?

No. It proves a DNS observation. Test a representative received message to inspect authentication and alignment for the actual route.

[ Sources ]

Sources

  1. RFC 9989: DMARC core protocol
  2. RFC 9990: DMARC aggregate reporting
  3. RFC 9991: DMARC failure reporting
  4. IANA DMARC parameters registry
  5. RFC 1034: DNS concepts and facilities
  6. RFC 2308: DNS negative caching

Enterprise provenance

Why top financial institutions and governments retired their email security dashboards.

Traditional email authentication platforms sell you a dashboard and ask your engineers to do the labour. In high-stakes environments, manual oversight means delayed enforcement, configuration drift and unmonitored shadow domains.

EmailAuth is the agentic email provenance platform. Our agents enforce p=reject, keep third-party senders aligned and move your domains to full RFC 9989 compliance, the new DMARC standard,, with human-in-the-loop auditability.

Governments Large enterprises Tier-1 financial institutions

SaaS · Dedicated tenancy · Air-gapped on-prem · BYOK encryption

Knowledge Base