Tutorial

DMARCbis RFC 9989: what changes for your mail server

Business Email8 min read8 steps

In May 2026, the IETF published RFC 9989, 9990 and 9991 — collectively known as DMARCbis — replacing RFC 7489 after eleven years. These RFCs are on the Standards Track, meaning they now carry full IETF authority. If you manage a VPS running Postfix or Exim, three concrete changes affect your DNS records and configuration before major MTA operators begin enforcing the new rules.

Contents· Why DMARCbis and why now1/5
  1. 01Why DMARCbis and why now
  2. 02Prerequisites before making changes
  3. 03Troubleshooting common scenarios
  4. 04RFC 7489 vs RFC 9989: the differences that matter
  5. 05Adapt now or deal with it later

Why DMARCbis and why now

RFC 7489, published in 2015 as an Informational document, left three gaps: the pct tag allowed policies to apply to only X% of messages, diluting protection and making receiver behavior unpredictable; the absence of a dedicated policy for non-existent subdomains left a gap exploitable for phishing; and reliance on the Public Suffix List (PSL) to identify the organizational domain created inconsistencies between MTA implementations, since the PSL is maintained outside the IETF. RFC 9989 (core DMARC), RFC 9990 (aggregate reporting) and RFC 9991 (failure reporting) address each of these gaps, elevating DMARC to Proposed Standard status.

  • RFC 9989 (core DMARCbis) — obsoletes RFC 7489 and RFC 9091; introduces the np tag, removes pct, replaces it with the t tag (test mode), and defines Tree Walk DNS to identify the parent domain without relying on the PSL
  • RFC 9990 (aggregate reporting) — extracts and modernises the aggregate reporting section of RFC 7489; XML reports compressed as GZIP remain the format but external destination verification is strengthened
  • RFC 9991 (failure reporting) — extracts failure reporting; emphasises privacy risks and mandates rate limiting at generators to prevent DoS abuse
  • Removal of pct — any existing DMARC record carrying pct=50 (or any other value) must be reviewed; RFC 9989-compliant receivers may ignore this tag or apply the policy to 100% of messages
  • Tree Walk DNS — the receiver climbs the DNS tree via successive queries (capped at 8) to find the applicable policy, removing the PSL dependency and improving cross-implementation consistency

Prerequisites before making changes

Before any modification, confirm your infrastructure meets the basics: SPF and DKIM must be correctly configured on your sending domain — DMARCbis adds nothing to these mechanisms but depends entirely on them. Also ensure your audit tools (dig, nslookup, SSH access to your VPS) are available and that you have access to your DNS zone. Finally, gather your current DMARC aggregate reports (via rua) to establish a baseline of legitimate traffic before tightening policy.

  1. Audit your current DMARC record

    Run dig TXT _dmarc.example.com from your VPS or terminal. Note the exact value of each tag: v, p, sp, pct, rua, ruf, adkim, aspf. If pct is present with a value below 100, plan its removal.

  2. Remove or replace the `pct` tag

    In RFC 9989, pct is deprecated. Its progressive deployment role moves to the t tag: t=y instructs the receiver to treat the message as if the policy were p=none, without applying quarantine or rejection. To migrate smoothly from pct=50, replace with t=y, validate over a few weeks via your aggregate reports, then drop t=y. Migration example: v=DMARC1; p=quarantine; t=y; rua=mailto:[email protected]

  3. Add the `np` tag for non-existent subdomains

    The np tag defines the policy to apply to messages claiming to come from a subdomain that does not exist in your DNS. Without np, RFC 9989 falls back to sp or p. To block phishing via non-existent subdomains, add np=reject. Full example: v=DMARC1; p=quarantine; sp=quarantine; np=reject; rua=mailto:[email protected]

  4. Understand Tree Walk DNS and publish at the right levels

    With Tree Walk, a receiver processing a message from mail.app.example.com queries _dmarc.mail.app.example.com, then _dmarc.app.example.com, then _dmarc.example.com, stopping at the first valid response (maximum 8 DNS queries). Audit your DNS zones to detect unintentional _dmarc.* records that could override your root policy.

  5. Update your final DNS record

    Once tags are reviewed, publish the updated record. Full example for a domain in hardening phase: v=DMARC1; p=quarantine; sp=quarantine; np=reject; adkim=s; aspf=s; rua=mailto:[email protected]; ruf=mailto:[email protected]; fo=1

  6. Check DKIM alignment in Postfix

    Ensure adkim=s (strict) does not conflict with subdomains signing under a different key. In strict mode, the From: header domain must exactly match the DKIM d= domain. If in doubt, temporarily use adkim=r (relaxed) and analyse aggregate reports.

  7. Check DKIM alignment in Exim

    Verify in your Exim configuration that dkim_domain exactly matches the domain published in your DMARC record. Any mismatch under adkim=s causes a DKIM failure and may trigger quarantine or reject policy.

  8. Test and validate reports

    Wait 24 to 48 hours and parse the aggregate XML reports received at your rua address. The <policy_evaluated><dkim> and <policy_evaluated><spf> fields show whether your messages pass alignment. Tools like MXToolbox DMARCAnalyzer or mail-tester.com can parse these reports without requiring you to write code.

To quickly validate your DMARC record from your VPS, run dig TXT _dmarc.example.com +short then paste the value into MXToolbox's DMARC checker (mxtoolbox.com/dmarc.aspx). It detects unknown tags, pct/t conflicts, and reports whether the record is syntactically valid under RFC 9989. To simulate a Tree Walk, run dig TXT _dmarc.subdomain.example.com and dig TXT _dmarc.example.com in sequence and compare the policies returned at each level.

Troubleshooting common scenarios

Most issues have a deterministic root cause — here are the most common ones and how to fix them.

  • pct ignored by a receiver — If RFC 9989-compliant MTAs ignore your pct=50 and apply the policy to 100% of messages, your aggregate reports will show a sudden increase in rejections or quarantines. Add t=y immediately to switch to test mode while you adapt your infrastructure.
  • np policy too strict — If a legitimate service sends from a subdomain not published in DNS, np=reject will block those messages. Start with np=quarantine and analyse reports before moving to reject.
  • Tree Walk produces an unexpected policy — If you find an orphaned _dmarc.app.example.com record left over from a former service, Tree Walk receivers will apply it first. Delete unused _dmarc.* records after a full DNS zone inventory.
  • Aggregate reports empty or missing — Verify that the rua address is reachable and your MX accepts XML reports compressed as GZIP. Some spam filters block .gz attachments. Also check the maximum message size accepted by your report reception server.
  • adkim=s mismatch with multi-domain Postfix — If you use one Postfix instance for several domains and the DKIM key signs under example.com while From: contains newsletter.example.com, strict alignment will fail. Either add a dedicated DKIM key per subdomain or switch to adkim=r for those domains.

RFC 7489 vs RFC 9989: the differences that matter

The table below summarises the structural differences between the two specifications.

Scroll the table

PointRFC 7489 (2015)RFC 9989 (2026)
`pct` tagPresent — applies policy to X% of messages for progressive rolloutRemoved — replaced by `t=y` (test mode); every compliant receiver applies policy to 100% of messages
Non-existent subdomainsNo dedicated tag — `sp` or `p` applies by default`np` tag introduced — distinct policy for subdomains absent from DNS
Parent domain discoveryBased on the Public Suffix List (PSL), maintained outside IETF, varies by implementerTree Walk DNS — climbs the DNS tree via successive queries, capped at 8, defined in the standard
ReportingAggregate and failure reporting in a single RFC 7489Three separate RFCs: 9989 (core), 9990 (aggregate), 9991 (failure) — better extensibility
StatusInformational — reference value but not on Standards TrackProposed Standard (Standards Track) — full IETF authority, basis for future MTA implementations

Adapt now or deal with it later

DMARCbis is not yet uniformly enforced by all MTAs — Google, Microsoft and Yahoo have announced Tree Walk testing phases but no hard cutoff date has been communicated. This is not a reason to wait: RFC 9989, 9990 and 9991 are on the Standards Track, progressive implementation is underway, and the first pct interpretation divergences between receivers are already appearing. Removing pct, adding np and auditing your DNS zones for Tree Walk are defensive steps that break nothing on receivers still on RFC 7489 — np is ignored by older MTAs, and removing pct only has an effect if the receiver already enforces RFC 9989. The cost of adapting is low; the cost of a policy partially applied by a mixed receiver population is not.

A VPS to host your mail server

Postfix, Exim, Dovecot or a full stack like Stalwart or Mailcow — deploy your mail infrastructure on a Linux VPS with full root access, port 25 available on request and configurable reverse DNS.

Need help?

Browse our help center and FAQ, or reach our team — callback, WhatsApp or email. Support in French, English and Arabic.

Message us on WhatsAppopens in a new tab