[ Standards & DMARCbis ]

Test legacy and updated DMARC interoperability

Design a versioned comparison that freezes inputs and separates discovery, alignment, testing, reporting and final receiver handling.

By the EmailAuth research team · 6 min read

[ Key points ]

  • Use equivalent controlled message, envelope, DNS and configuration inputs.
  • Diagnose the earliest differing protocol stage before interpreting delivery differences.
  • Aggregate and failure reporting are separate capabilities with independent coverage and privacy limits.
On this page

Make interoperability a reproducible comparison

A statement that a receiver supports updated DMARC is not an interoperability result. The useful question is whether identified implementations, given controlled equivalent inputs, produce the expected discovery, alignment, policy and reporting behavior. A comparison needs to preserve those stages rather than reducing the experiment to whether two messages reached an inbox.

Begin with a versioned case catalogue and a named test owner. Record the receiver software or service, configuration, accessible version information and any unknowns. A managed service may not disclose its implementation version; that limitation belongs in the matrix. Do not replace missing information with an adoption claim derived from a product announcement or a recent report timestamp.

Freeze the inputs that could change the result

For each case, retain the message bytes, envelope and connecting-source assumptions, relevant DNS data, observation timing and configuration profile. Make differences between two test runs intentional and visible. If one route modifies a signed message or uses a different envelope domain, the comparison is no longer solely about DMARC implementation behavior.

Use only authorized domains, receivers and controlled non-sensitive messages. Keep fictional design cases separate from executable fixtures and actual delivery samples. Write the expected result and its specification reference before running a test; otherwise a surprising outcome can be retroactively described as expected. An unrun case should remain explicitly not run, not receive a pass inferred from documentation.

The sender inventory also matters. Include representative legitimate routes, especially indirect and periodic services, when deciding whether laboratory coverage is relevant to a production change. A protocol case can be correct while omitting the business flow that will actually be affected.

Compare discovery and alignment before disposition

RFC 9989 section 4.10 describes DNS tree-walk behavior, while earlier implementations can use their supported legacy discovery method. Cases should cover an explicit Author Domain policy and controlled fallback arrangements. Add applicable subdomain and non-existent-domain policy cases only with clearly specified DNS conditions; a label saying subdomain is not enough to define the expected policy.

Capture the record selected and the authenticated identifiers used for alignment. Then record the selected p, sp or np policy and testing state. RFC 9989 section 4.4 defines the alignment relationship. Passing SPF or DKIM for an unrelated identity must not be mislabeled as successful DMARC merely because a receiver ultimately accepted the message.

Finally record local overrides and actual disposition as separate outcomes. Content filtering, routing and local decisions can create different delivery results even when the ordinary DMARC calculation agrees. Diagnose the earliest differing stage rather than attributing every mailbox difference to policy discovery.

Include the testing transition without assuming equivalence

A useful case compares how identified implementations process a record containing p=reject and t=y. Under RFC 9989 section 4.7, the testing treatment for a failing message is one level lower, quarantine. A legacy implementation that does not recognize t may follow different supported logic. This is an expected compatibility question to measure, not a reason to deploy that record as a universal safety switch.

Separate historical pct cases from t cases. A plan that once requested sampling should not be declared compatible merely because an updated receiver ignores the old control without a syntax error. The intended business effect, the specified mechanism and the observed result all need their own fields.

Retain unknown-tag, missing-policy and malformed-input cases within a controlled test scope. Do not use a production domain as an experimental target for deliberately ambiguous records. Test design itself should identify the relevant approval and recovery requirements before any operational execution.

Test reporting as a separate capability

RFC 9990 defines aggregate-report structure, including optional discovery_method and testing context. A report carrying those fields can support an observation about that report; an omitted optional field does not prove legacy behavior. Preserve the raw report and parser profile, because a consumer can lose information even when the receiver generated it correctly.

Report periods can include policy transitions, so one aggregate is not always a transcript of a single frozen policy. Align the comparison's time window and source evidence before using counts to explain a particular message. Deduplication and schema compatibility belong to the reporting test plan rather than being hidden in a dashboard.

Failure reporting is another independent dimension. RFC 9991 leaves generation subject to receiver willingness and privacy constraints. No failure report is not sufficient evidence of a failed interoperability test. Record whether reporting was requested, supported, authorized, received and interpretable without collecting unnecessary message content.

Fictional matrix with no observed outcome cells

A fictional worksheet names Receiver A as a current-semantics reference and Receiver B as a legacy profile. Both are assigned the same invented message and DNS snapshot for the p=reject;t=y case. The expected-policy column for A is derived from the specification. B's implementation and all actual outcomes still require evidence; no product is presumed to behave like the label.

The planned matrix also includes a direct aligned control, an unrelated authenticated-domain case, a fallback discovery case and aggregate-format cases. Every execution cell remains not run. This makes the worksheet useful preparation without manufacturing proof of conformance or receiver adoption.

Preserve the exact release requirement

The original evidence gate is: Keep a versioned interoperability matrix with identical input cases and full observed outcomes. The commissioning requirement is: Validate current primary specifications and retain a worked example before drafting. The retained fictional matrix satisfies neither live observation nor production readiness. Named implementation evidence, controlled results, human SME review, business rollout approval and publication authorization remain open. This manuscript has performed no receiver test, DNS change or message transmission.

[ Takeaway ]

An interoperability claim needs identified implementations and observed outcomes, not an announcement or a filled-in expectation column.

[ By role ]

What this means for you

Choose your role for practical next steps.

Test owner

Freeze cases before execution

Expected behavior must not be reconstructed after seeing the result.

Next steps

  1. Version the input case and specification reference.
  2. Label all unrun and inaccessible observations explicitly.

Receiver operator

Expose the relevant implementation context

Product identity alone is insufficient to explain protocol behavior.

Next steps

  1. Record configuration and available software-version evidence.
  2. Separate local overrides from ordinary protocol calculations.

Rollout approver

Connect lab coverage to business routes

Correct synthetic cases can still omit an important legitimate sender.

Next steps

  1. Check periodic and indirect routes against the inventory.
  2. Require observed results and recovery evidence before release.

[ FAQs ]

Frequently asked questions

Does a vendor announcement establish that a particular receiver uses RFC 9989?

No. Record implementation and configuration evidence where available, and mark managed-service version uncertainty explicitly.

Which inputs need to be preserved for a fair comparison?

Retain message bytes, envelope, connecting-source assumptions, relevant DNS state, timing and configuration profile. Make intentional differences visible.

Why compare discovery before final disposition?

A different selected policy can explain downstream differences. Local filtering can also change final handling when the ordinary DMARC calculation agrees.

What does the current specification expect for failing mail with p=reject and t=y?

The testing treatment is quarantine, one level below reject. A legacy implementation’s behavior still needs its own evidence.

Does an omitted discovery_method prove the report came from a legacy receiver?

No. It is optional in the current aggregate format. Absence alone cannot establish implementation version.

Can one aggregate report be treated as a transcript of one unchanged policy?

Not necessarily. Policy transitions can produce mixed observations within a reporting period. Retain timing and source context.

Should missing failure reports automatically fail an interoperability case?

No. Reporting can be limited or absent for receiver-policy and privacy reasons. Record request, support, authorization and receipt separately.

Are the worksheet’s expected cells actual results?

No. All execution cells remain not run. A versioned matrix with identical cases and full observed outcomes is still required.

[ Sources ]

Sources

  1. RFC 9989: Domain-Based Message Authentication Reporting and Conformance
  2. RFC 9990: DMARC Aggregate Reporting
  3. RFC 9991: DMARC Failure Reporting

[ Glossary ]

Glossary

Interoperability matrix
A versioned record of equivalent inputs, expected protocol behavior and actual outcomes across implementations.
Frozen input
The preserved message, DNS and configuration context used to make a comparison reproducible.
Discovery result
The policy record and domain context selected before later DMARC assessment.
Expected outcome
A prediction derived from the relevant specification and declared case, distinct from a measured result.
Not run
An explicit execution state indicating that no observation has been collected for the case.

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