[ Transport security ]

MTA-STS policy caching and delayed changes

Plan policy changes around the sender’s fetched-policy lifetime as well as DNS TTL, rather than expecting one edit to update every sender.

By the EmailAuth research team

[ Key points ]

  • Separate DNS TTL, fetched-policy max_age and hosting freshness.
  • A new shorter policy does not shorten copies already held by senders.
  • Diagnose the actual old state instead of calling every delay propagation.
On this page

MTA-STS policy caching is not ordinary browser caching. The policy's max_age governs its lifetime from the last successful fetch. The discovery TXT has its own DNS TTL. Those clocks can differ substantially and explain why two senders apply different policy versions at the same time.

Record the policy that a sender could still hold

References: RFC 8461 §3.2, RFC 8461 §3.3.

Keep each published policy body, discovery id, publication time and max_age. A current endpoint screenshot cannot tell you what a sender fetched yesterday. During an incident, ask for the applied policy and fetch time from sender logs where available instead of assuming the newest body is universal.

RFC 8461 says senders should cache a policy for up to max_age and should proactively refresh before expiration, suggesting a daily refresh. These recommendations are not a guarantee of synchronized updates. Implementations may check for updates at different times, and a sender can continue applying a valid cached policy when live discovery or fetching fails.

Separate the two expiry calculations

References: RFC 8461 §3.2, RFC 8461 §5.1.

In a labelled arithmetic fixture, a policy fetched at epoch time 1000000 with max_age 86400 has an expiry boundary of 1086400. A DNS TTL of 300 does not change that calculation. If the operator publishes a new body with max_age 3600, the already cached old body does not acquire the new lifetime retroactively.

The new bounded offline fixture calculates that boundary. The retained historical transport-lab record additionally documents a deep copy of the old cache, a shorter-lived policy fetch and an assertion that the old snapshot and its expiry remain unchanged until explicit replacement. The cache portion is an explicit state/arithmetic model, not a real MTA, DNS cache or refresh scheduler; the separately retained loopback DNS/HTTPS exchanges do not broaden that cache claim. To extend the test, configure a controlled sender with an inspectable policy cache and preserve its actual fetch, refresh and delivery logs.

Update in the safe order

References: RFC 8461 §8.1, RFC 8461 §8.2.

Publish the new HTTPS body, verify it, then change the DNS id. RFC 8461 advises keeping old policies compatible with delivery while both endpoints update and the TXT TTL passes. For planned routing changes, also allow for senders that retain the old policy until its lifetime ends or a successful refresh occurs.

Keep protocol policy caching distinct from a CDN's origin cache. Senders must not use HTTP caching for policy retrieval. RFC 8461 §8.2 nevertheless permits origin-side reverse-proxy caching; verify its freshness and publication behavior rather than treating every proxy cache as prohibited. Verify the actual body from the public endpoint and ensure the hosting publication workflow exposes the intended revision.

Diagnose a delayed change without guessing

References: RFC 8461 §3.3.

Compare DNS answers, HTTPS response bytes, cached policy metadata and the sender's failure logs. A new id with an old body suggests publication ordering or hosting freshness trouble. An old id in a recursive answer may reflect DNS cache state. An old but valid cached policy during a fetch outage can be expected protocol behavior.

Do not declare every delay to be propagation. Identify which cache or dependency holds the old state, repair that component and retain a compliant receiving path throughout the transition. No live sender-cache experiment was executed for this article.

Retained historical evidence and remaining scope

The following describes preserved 7 November 2026 observations, not a network experiment rerun for this review. Newly executed offline checks are recorded separately.

The captured logical cache fixture preserves A1 fetched at 1000000 with expiry 1086400. The lab publishes B2, announces B2 through an actual UDP DNS answer and fetches B2 over HTTPS with max_age 3600. It then asserts that a deep-copied A1 snapshot still equals its original contents and retains expiry 1086400. A separate last-served ledger computes the maximum possible A1 expiry as 1000300 + 86400 = 1086700, later than B2 at 1000600 + 3600 = 1004200 and C3 at 1000900 + 3600 = 1004500. The expiry values are emitted calculations using explicit logical times; the cache-preservation comparison is an executed assertion. Neither is an emulation of an MTA refresh scheduler. An actual sender’s choice to refresh, retry or retain state remains an implementation test.

[ Takeaway ]

Diagnose the actual old state instead of calling every delay propagation.

[ By role ]

What this means for you

Choose your role for practical next steps.

IT / Mail Admin

Record actual fetch metadata

The current public policy alone cannot explain an older delivery decision.

Next steps

  1. Compare DNS and policy cache state.
  2. Record actual fetch times.
  3. Check public body freshness.

CISO / SecOps

Preserve compatibility

A valid cached policy remains important during refresh failures.

Next steps

  1. Keep old-policy compatibility.
  2. Review refresh failure monitoring.
  3. Separate cache evidence from assumptions.

Founder / Non-technical

Budget for old state

A distributed cache prevents instant universal policy replacement.

Next steps

  1. Budget transition overlap.
  2. Retain revision history.
  3. Avoid promising instant changes.

[ FAQs ]

Frequently asked questions

Does DNS TTL equal policy lifetime?

No. TXT caching and fetched-policy max_age are separate.

RFC 8461 §3.2 RFC 8461 §8.1

When does max_age begin?

At the policy fetch time in the sender’s cache.

RFC 8461 §3.2

Does lowering max_age update old copies?

No. Existing cached policies retain their old values.

RFC 8461 §5.1

Must all senders refresh daily?

Daily refresh is suggested, not a synchronized universal guarantee.

RFC 8461 §3.3

Can failed fetching leave enforce active?

Yes, when the sender still has a valid cached enforce policy.

RFC 8461 §3.3

Can HTTP cache headers replace policy max_age?

No.

RFC 8461 §3.3

What should revision history preserve?

Body bytes, id, publication time and each published lifetime.

What proves which policy affected a delivery?

Sender cache and delivery logs, when available, rather than the current public body alone.

[ Sources ]

Sources

  1. RFC 8461

    Sections §3.2 · §3.3 · §5.1 · §8.1 · §8.2

  2. RFC 8767

    Sections §4

[ Glossary ]

Glossary

Policy cache
Sender storage of a fetched policy and its validity metadata.

RFC 8461 §3.2

DNS TTL
The DNS freshness interval before the source must be consulted again; standards permit bounded stale serving when authoritative refresh fails. It is separate from MTA-STS policy max_age.

RFC 8767 §4

Refresh
A new policy retrieval before or after a cached copy ages.

RFC 8461 §3.3

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