Multi-Domain DMARC Strategy: Managing DMARC Across a Portfolio of Domains (Production, Marketing, Parked, Acquired)
The strategic deep dive for operators managing DMARC across many domains - acquired companies, marketing subdomains, brand-defensive registrations, parked-but-not-deleted properties. Where the single-domain playbook walks one record through one rollout, this guide walks the portfolio: how to build a defensible inventory, classify each domain by usage taxonomy, apply the organizational domain rule (RFC 7489 §3.2 + the Public Suffix List), use the sp= subdomain inheritance tag and the RFC 9091 np= non-existent subdomain tag, consolidate aggregate reporting into one central pipeline, run an acquired-company DMARC integration playbook, harden parked domains with the canonical null-SPF + p=reject pattern that costs nothing and prevents brand impersonation, and answer the 8 most-searched portfolio-operator questions.
This portfolio-operator reference is provided in English. DMARC, SPF, DKIM, and the Public Suffix List are specified in English-language RFCs and registries, and the canonical vocabulary (sp=, np=, adkim=, aspf=, "organizational domain", "Public Suffix List", "null SPF", "RUA aggregate", "p=reject") does not translate. We keep the body in the source language so the configuration values and decision logic remain copy-paste safe across locales.
TL;DR
- One DMARC record per organizational domain.
Every organizational domain - the parent zone
under a
Public Suffix List
entry, per
RFC 7489 section 3.2 -
needs its own
_dmarcTXT record. Subdomains inherit viasp=from the apex; separate organizational domains do NOT. - Inventory before policy. Operators routinely under-count their own domains by 30-50% on first inventory. WHOIS + CMS asset register + DNS zone enumeration + registrar account audit + acquired-company carve-out audit. Map every domain BEFORE publishing policy.
- Classify every domain. Production sending / marketing subdomain / parked / acquired-company / brand-defensive registration / delegated to third party - each category gets a different rollout cadence and end-state policy.
- Use
sp=+np=aggressively.sp=reject(RFC 7489 section 6.3) hardens unused subdomains while the apex is still ramping;np=reject(RFC 9091) hardens NON-EXISTENT subdomains, closing the most common spoofing-of-random-subdomain attack. - Central RUA reporting.
Publish the same
rua=mailto:dmarc-rua@example.comon every organizational domain. Thepolicy_published.domainelement in the aggregate report XML attributes each report to its source domain - one pipeline for the whole portfolio. - Park hardening costs nothing.
v=spf1 -all+v=DMARC1; p=reject; sp=reject; np=reject; rua=mailto:...+ null MX (RFC 7505) on every parked domain turns the parked-domain liability into a brand-defensive asset. - Acquired-company playbook.
Inventory ->
p=nonewith reporting -> 14-30 day visibility window -> align legitimate senders -> rollout cadence -> consolidate reporting. Skipping the visibility window is the single most common acquired-company mistake.
1. The multi-domain DMARC problem
Single-domain DMARC playbooks - the typical
"publish
p=none, watch the reports, move to
p=reject" cadence - assume the
operator owns ONE domain that sends mail. Real
enterprises do not. The median 500-employee company
operates 6-12 organizational domains: the primary
brand domain, an acquired-company domain that has
not yet been migrated, 2-4 marketing landing-page
domains, a regional-localized domain (.de, .co.uk,
.jp), 1-2 brand-defensive registrations
(typosquat-protection), and a handful of
parked-but-not-deleted properties from prior
rebranding. The Fortune 500 median is 50-200
organizational domains. MSPs managing client
portfolios routinely touch thousands.
Each of those domains needs its own
_dmarc record, but the right policy
is NOT the same. A production-sending domain wants
a deliberate
none -> quarantine -> reject
rollout that depends on per-domain sender
inventory. A parked domain wants
p=reject from day one because it sends
no mail. An acquired-company domain wants a
visibility window before policy moves. A
brand-defensive typosquat registration wants the
same hardening as a parked domain. A
delegated-to-third-party domain (an outsourced
marketing landing page where a SaaS vendor controls
DNS) needs coordination with the third party. One
cadence does not fit all.
The portfolio-operator failure mode is uniform:
operators rush the production domain to
p=reject while parked and acquired
domains sit at the implicit
no DMARC record state - which means
NO DMARC enforcement at the receiver. Attackers
target the unprotected domains because they look
like the brand but are not behind the strict
policy. The portfolio-strategy guide closes that
gap: one strategy across the whole portfolio,
different per-category tactics within it.
2. Building the domain inventory
Operators routinely under-count their own domain portfolio by 30-50% on first inventory. Six sources, run all of them and reconcile.
2.1 WHOIS lookup against registrar accounts
The registrar account is the authoritative source of registered domains. Export the registrant list from every registrar account the company uses (often more than one: legacy IT migrations leave domains scattered across GoDaddy + Network Solutions + Namecheap + Gandi + corporate-grade MarkMonitor or CSC). Cross-reference against accounts-payable for registrar invoices to catch domains paid for but not in the centralized registrar.
2.2 DNS zone enumeration
For each registrar-listed domain, query the parent nameservers for active DNS records. A domain that has NO records at all is a dormant registration - still owned, still spoofable, needs hardening. A domain with active records is in some operational state.
2.3 Brand and trademark portfolio
The legal team's trademark portfolio names brands that should be defensively registered as domains. A brand without a corresponding registration is typosquat-exposed; that gap is part of the portfolio strategy even if the registration is pending.
2.4 CMS and marketing-asset register
Landing-page CMS instances (Webflow, WordPress multisite, HubSpot, Marketo, Mailchimp), CRM custom-domain configurations, and marketing-team custom-tracking domains routinely use organizational subdomains or entirely separate domains that the IT team did not register. Inventory the marketing-asset register.
2.5 Acquired-company carve-out audit
Mergers and acquisitions ship domains that were owned by the acquired entity. The acquisition documents list the assets transferred. The IT integration team often inherits a domain list without DMARC posture data.
2.6 Outbound mail audit
Inspect the company's sent mail headers for the last 30 days from the corporate gateway. The sender envelope-from domains reveal every domain actually used for production sending - including domains the IT team forgot existed. The DMARC Analyzer header analyzer (includes/EmailHeaderParser.php) surfaces SPF / DKIM / DMARC posture per envelope-from for quick triage.
3. Domain taxonomy - six categories
Every inventoried domain falls into one of six categories. Each category has a different DMARC strategy.
| Category | Sends mail? | DMARC end-state | Rollout pattern |
|---|---|---|---|
| Production sending | Yes (heavy) | p=reject; sp=reject; np=reject |
Deliberate none -> quarantine -> reject cadence with per-sender alignment |
| Marketing subdomain | Yes (ESP-relayed) | p=reject via parent apex inheritance OR per-subdomain record |
Inherits from parent organizational domain via sp= |
| Parked | No | p=reject; sp=reject; np=reject from day one |
One-shot hardening + null SPF + null MX |
| Acquired company | Yes (unknown) | p=reject after migration; pre-migration depends |
Visibility window first, then full rollout cadence |
| Brand-defensive registration | No | p=reject; sp=reject; np=reject from day one |
Treat as parked; one-shot hardening |
| Delegated to third party | Yes (SaaS-controlled) | Coordinated with third party | Joint rollout; SLA includes DMARC posture |
The two largest categories by count are usually "parked" and "brand-defensive registration" - these are also the two categories with the cheapest DMARC hardening because they send no mail. Hardening them is the highest-leverage portfolio-wide win.
4. The organizational domain rule (RFC 7489 §3.2)
RFC 7489 section 3.2
defines the
organizational domain as the zone
immediately above a Public Suffix List entry. The
DMARC lookup algorithm queries
_dmarc.<header-from-domain> for
a TXT record; if none exists, it falls back to
_dmarc.<organizational-domain>.
This is the mechanism that makes the apex
_dmarc record cover all subdomains.
4.1 Public Suffix List - the canonical reference
The
Public Suffix List
(PSL) is the authoritative list of effective TLDs
maintained by Mozilla and used by every major
receiver. For
marketing.example.com:
.com is the PSL entry; the
organizational domain is
example.com. For
marketing.example.co.uk:
.co.uk is a PSL entry; the
organizational domain is
example.co.uk, NOT
co.uk. The DMARC alignment guide
(help_dmarc_alignment.php)
has the full alignment walk; this page covers the
portfolio implication: every organizational
domain you own needs its own
_dmarc record.
4.2 Worked example: portfolio organizational-domain mapping
A portfolio with these domains:
example.com
shop.example.com
marketing.example.com
example.de
example.co.uk
acquiredco.com
brand-typosquat.io
example-parked.net
Has SIX organizational domains:
example.com,
example.de,
example.co.uk,
acquiredco.com,
brand-typosquat.io,
example-parked.net. The
shop. and marketing.
subdomains inherit from
example.com via sp=.
Each of the six organizational domains needs its
own
_dmarc TXT record.
4.3 Where this trips operators
- ccTLD organizational domain:
example.co.ukis the organizational domain, notexample.com. A_dmarc.example.comrecord does NOT covermarketing.example.co.uk- the UK domain needs its own_dmarc. - Subdomain delegation: if
marketing.example.comis delegated to an ESP via NS records, the ESP controls DNS and the apex_dmarc.example.comrecord still covers the subdomain (the lookup falls back up the tree). - Government and academic ccTLDs:
.ac.uk,.gov.uk,.edu.auare PSL entries; organizational domain is one label below.
5. Subdomain inheritance: sp= and np=
Two tags govern subdomain policy. The
sp= tag (RFC 7489 section 6.3)
overrides the apex p= for subdomains
that EXIST. The np= tag (RFC 9091
section 3.1) overrides for subdomains that do
NOT exist.
5.1 The sp= tag - subdomain inheritance override
If sp= is omitted, subdomains inherit
the apex p=. If present, the
sp= value takes precedence for any
subdomain that does not have its OWN
_dmarc record. The common deployment
pattern during rollout:
_dmarc.example.com. IN TXT "v=DMARC1; p=quarantine; sp=reject; rua=mailto:dmarc-rua@example.com"
Why: the apex is at
quarantine because production senders
on
example.com are still ramping and the
operator does not want false-positive rejects.
Subdomains - which legitimate senders rarely use
without explicit setup - get
sp=reject so attackers cannot spoof
noreply.example.com or
info.example.com or any other
unused-but-spoofable subdomain. Once apex senders
are clean, raise the apex to
p=reject and remove
sp= (it then inherits
reject from the apex).
5.2 The np= tag - non-existent subdomain policy (RFC 9091)
RFC 9091
(published July 2021) added the
np= tag for NON-EXISTENT subdomains.
Without
np=, some receivers do not apply the
apex
sp= to truly non-existent
subdomains - attackers can send from
xfgr.example.com that has zero DNS
records and slip through because the receiver
does not have an unambiguous policy lookup. Set
np=reject to close that gap:
_dmarc.example.com. IN TXT "v=DMARC1; p=reject; sp=reject; np=reject; rua=mailto:dmarc-rua@example.com"
For portfolio operators,
np=reject is the cheapest
portfolio-wide hardening - publish it alongside
p= and sp= on every
organizational domain, even on parked domains
where it costs nothing and prevents the most
common spoofing pattern. As of 2026, receiver
support for
np= is implemented by Google,
Microsoft 365, Yahoo, Proofpoint, Mimecast, and
the major receiver platforms.
5.3 Per-subdomain override
Any subdomain can publish its OWN
_dmarc.<subdomain>.<example.com>
record to override the inherited policy. This is
the pattern for a single subdomain that needs a
different cadence:
marketing.example.com at
p=none for visibility while
example.com apex is at
p=reject - publish
_dmarc.marketing.example.com
explicitly. The per-subdomain record wins over
inherited
sp=.
6. Per-category policy strategy
6.1 Production sending domains
Follow the canonical single-domain rollout
playbook (see
DMARC policy rollout):
none -> quarantine (with
pct= ramp) -> reject. Use
sp=reject during the quarantine phase
so unused subdomains are hardened immediately.
Final state:
p=reject; sp=reject; np=reject.
6.2 Marketing subdomains
Most marketing subdomains inherit from the parent
organizational domain. The exceptions are
subdomains delegated to an ESP via NS records
where the ESP-managed DNS does not include a
per-subdomain
_dmarc record - the parent's
_dmarc still applies via the
organizational-domain lookup. Verify by querying
_dmarc.<marketing-subdomain>
directly; if it returns NODATA, the parent
apex's policy applies.
6.3 Parked domains
One-shot hardening from day one. See section 9 for the canonical pattern.
6.4 Acquired company domains
Visibility-first playbook. See section 8 for the canonical 6-step integration sequence.
6.5 Brand-defensive registrations
Treat as parked. The defensive registration was
made to prevent a typosquat attacker from owning
the domain; hardening it with
p=reject +
sp=reject +
np=reject + null SPF + null MX
closes the spoofing vector even if the brand
never uses the domain. Add the registration to
the central RUA pipeline to detect spoofing
attempts.
6.6 Delegated-to-third-party domains
The third party controls DNS, which means they
control the
_dmarc record. Coordination
required: include DMARC posture as a contract
requirement and verify quarterly. If the third
party cannot publish
p=reject, reclaim DNS control.
7. Reporting consolidation - one central RUA
Publish the same
rua=mailto:dmarc-rua@example.com
on every organizational domain you own. RFC 7489
section 7.1 explicitly supports a single
reporting endpoint across many domains - the
aggregate report XML carries a
policy_published.domain element so
the receiver can attribute each report to its
source domain.
7.1 The internal-domain shortcut
When the
rua= mailto address shares an
organizational domain with the reporting domain
(e.g.
example.com publishes
rua=mailto:dmarc-rua@example.com),
no special authorization is needed. The receiver
sends reports directly.
7.2 The external-domain authorization (RFC 7489 §7.1)
When the
rua= address is on a DIFFERENT
organizational domain (e.g.
example.com publishes
rua=mailto:reports@third-party-analyzer.io),
the destination domain MUST publish an
authorization record:
example.com._report._dmarc.third-party-analyzer.io. IN TXT "v=DMARC1"
Without this authorization record, RFC 7489 compliant receivers refuse to send reports to the external domain (preventing reflection-DoS abuse). For portfolio operators using a third-party DMARC analyzer service, this means EACH of your organizational domains needs an authorization record at the analyzer's domain.
7.3 The DMARC Analyzer reference pipeline
The project ingests aggregate reports for any
number of domains under one user account via
includes/DmarcParser.php; the
forensic-report parser
includes/ForensicReportParser.php
handles
ruf= reports the same way. The
dashboard groups by reported domain so the source
of each report is unambiguous across the
portfolio. The IMAP fetcher
(includes/ImapFetcher.php) and
Microsoft Graph fetcher
(includes/GraphFetcher.php)
automate report ingestion from a single
monitoring mailbox - one mailbox for the entire
portfolio.
7.4 RUA volume scaling
A 100-domain portfolio receives 100-300 aggregate reports per day (each receiver sends one report per source domain per 24h). At 500-1500 domains the rate scales to 1500-5000 reports per day - inbox quota becomes a concern. Best practice: dedicated monitoring mailbox with at-least-100GB quota and a parser with periodic ingestion + delete (the project's IMAP fetcher implements this).
8. Acquired-company integration playbook
Acquired-company domains are the highest-risk
portfolio category because the IT team inherits
domains without knowing the senders. Skip the
visibility window and your first
p=reject will reject legitimate mail
you did not know existed. The canonical 6-step
sequence:
- Inventory the acquired domain DNS state.
Document existing SPF, DKIM selectors, DMARC
record (if any), MX, A/AAAA, mail-related TXT.
Use the Domain Security Checker (anchored
against
includes/DnsChecker.php) for the snapshot. - Publish
p=nonewith reporting. If no DMARC record exists, publishv=DMARC1; p=none; rua=mailto:dmarc-rua@<your-central-domain>. If the acquired company'srua=already points elsewhere, ADD your address as a second comma-separated destination so reporting flows to BOTH the legacy and your central pipeline during the transition. - Wait 14-30 days collecting reports. The aggregate reports map every legitimate sender the acquired company uses - including legacy SaaS the new IT team does not know about (a recurring discovery is long-forgotten payroll systems, expense-report tools, marketing-automation accounts).
- Align legitimate senders. Add the discovered senders to the acquired-domain SPF, configure DKIM at each sender, verify alignment via test sends.
- Move to
p=quarantinethenp=reject. Follow the canonical single-domain rollout cadence (DMARC policy rollout). Addsp=reject; np=rejectin the same record. - Consolidate reporting.
Once the acquired domain reaches
p=reject, remove the legacyrua=destination, keeping only your central pipeline. The acquired domain is now a fully-integrated portfolio member.
Common mistake: jumping from step 1 directly to
step 5 because "we know what senders the company
uses". Aggregate reports always reveal additional
senders - skip the visibility window and the
first
p=quarantine will quarantine
legitimate mail.
9. Parked domain hardening - the null-SPF + reject-DMARC pattern
Parked domains send no mail by definition but are the most attractive spoofing targets because they look like the brand. The canonical hardening pattern costs nothing and prevents the most common attack vector.
9.1 The four records
; SPF - authorize zero senders
example-parked.com. IN TXT "v=spf1 -all"
; DMARC - reject everything, report to central pipeline
_dmarc.example-parked.com. IN TXT "v=DMARC1; p=reject; sp=reject; np=reject; adkim=s; aspf=s; rua=mailto:dmarc-rua@example.com"
; Null MX (RFC 7505) - declare the domain accepts no mail
example-parked.com. IN MX 0 .
; Optional - DKIM with empty key (defensive)
*._domainkey.example-parked.com. IN TXT "v=DKIM1; p="
9.2 What each record does
- SPF
-all: any IP claiming to send from the parked domain FAILS SPF. The-allis hard-fail (not~allsoftfail) because no legitimate sender exists. - DMARC
p=reject; sp=reject; np=reject: receivers reject any mail from the parked domain. Apex, existing subdomains, and non-existent subdomains all covered. adkim=s; aspf=s: strict alignment - even if an attacker somehow gets SPF or DKIM to pass via a relaxed-alignment trick, the strict alignment will catch it.rua=mailto:: you SEE the spoofing attempts. Parked-domain RUA reports are often the first detection signal for active brand-impersonation campaigns.- Null MX (RFC 7505): the
single MX of priority 0 pointing to
.declares the domain accepts no mail. Sending MTAs see this and never even attempt delivery. - Empty DKIM wildcard: a
wildcard DKIM record with empty
p=revokes any selector the attacker might try; defense in depth.
9.3 Portfolio-wide automation
For a 100+ domain portfolio, automate the hardening via Terraform / Pulumi / API DNS management. The four-record bundle is identical across all parked domains except for the domain label - a templated apply across the portfolio is a single PR. The DNS Record Generator builds syntactically-correct DMARC + SPF + null MX records for one-shot copy-paste deployment.
10. Common multi-domain mistakes
- Hardening only the production domain.
Production at
p=reject+ parked and acquired domains at no-DMARC = attackers pivot to the unprotected domains. Inventory and harden every organizational domain in the portfolio, not just the flagship. - Forgetting the ccTLD organizational domain.
example.co.ukis its OWN organizational domain;_dmarc.example.comdoes NOT cover it. Each ccTLD registration needs its own_dmarcrecord. - Skipping the acquired-company visibility window.
Jumping from acquisition to
p=quarantinewithout 14-30 days of aggregate-report visibility quarantines legitimate mail you did not know existed. Always run the visibility window. - Reusing a DKIM key across organizational domains.
DKIM signatures are bound to the
d=tag domain; receivers query<selector>._domainkey.<d-domain>. You cannot share a key acrossexample.comandexample.net. Each organizational domain needs its own selector + key. - Missing the external-domain authorization record.
Using a third-party DMARC analyzer service:
each of your organizational domains needs
a
<your-domain>._report._dmarc.<analyzer-domain>TXT record. Without it, RFC 7489 compliant receivers refuse to send reports to the external analyzer. - Omitting
np=. Withoutnp=reject, attackers send from non-existent subdomains and slip past the apexsp=. RFC 9091np=support is widespread among major receivers in 2026; set it on every organizational domain. - Treating brand-defensive registrations as low-priority.
They are EXACTLY the registrations attackers
would target if uncontested. Same hardening
as parked domains - one-shot
p=rejectfrom day of registration. - No central reporting inventory.
Aggregate reports flow to multiple addresses,
no single dashboard, no portfolio view.
Consolidate into one
rua=address on every organizational domain.
11. Troubleshooting common multi-domain issues
11.1 "Our acquired-company domain is sending mail but I see no aggregate reports"
- Verify the acquired domain has a
_dmarcrecord published. Many acquired companies have no DMARC record at all, which means no reports. - If the record exists, verify the
rua=destination is on YOUR organizational domain OR has the_report._dmarcauthorization record at your domain. - Wait 24-48h after publishing - receivers batch reports daily.
11.2 "A subdomain I did not configure DMARC for is showing up as a spoofing target"
- Verify the apex has
sp=rejectorp=reject(which is inherited ifsp=omitted). - If the subdomain is NON-existent, verify
np=rejectis published on the apex. - Confirm the receiver supports
np=(Google, Microsoft 365, Yahoo, Proofpoint, Mimecast all do as of 2026).
11.3 "Receiver refuses to send aggregate reports to our third-party DMARC analyzer"
- Add the external-domain authorization record
at the analyzer's domain:
<your-domain>._report._dmarc.<analyzer>IN TXT"v=DMARC1". Without it, RFC 7489 compliant receivers refuse. - One authorization record PER organizational domain in your portfolio that uses the analyzer.
11.4 "Different domains in our portfolio get different DMARC pass rates - why?"
- Different senders. Each organizational domain has its own set of legitimate senders; alignment and DKIM coverage vary per-domain.
- Check per-domain in the dashboard - the DMARC Analyzer dashboard groups aggregate reports by reported domain so per-domain pass-rate trends are visible.
- Investigate the lowest-pass-rate domain first - it has the most operational gap.
11.5 "An acquired domain hit p=reject and now legitimate mail is bouncing"
- The visibility window was insufficient. Move
the apex back to
p=quarantineimmediately - this is reversible with a TTL-bounded propagation window. - Inspect the aggregate reports for the failing source IPs - they are the senders that were missed during the visibility phase.
- Add the missing senders to SPF + DKIM,
verify alignment, then re-attempt
p=reject.
12. Frequently asked questions
- Do I need a separate DMARC record for every domain I own?
- Yes. DMARC is published per organizational domain. Every organizational domain that sends or could send mail needs its own _dmarc TXT record. Subdomains inherit the parent organizational domain policy via the sp= subdomain inheritance tag, but separate organizational domains - example.net, acquiredcompany.com, brand-defensive-registration.io - each need their own _dmarc record.
- What is the sp= tag and how does subdomain inheritance work?
- The sp= tag specifies the DMARC policy for subdomains separately from the apex domain. If sp= is omitted, subdomains inherit p= from the apex. The common pattern during rollout is p=quarantine sp=reject: apex at quarantine because production senders are ramping, subdomains get the stricter reject so attackers cannot spoof unused subdomains.
- What is the np= tag and why does it matter for multi-domain operators?
- The np= tag (RFC 9091) specifies the DMARC policy for NON-EXISTENT subdomains. Without np=, attackers can send mail from random-named subdomains that have no DNS footprint and slip through. np=reject closes that gap and is the cheapest portfolio-wide hardening.
- How do I consolidate DMARC reporting for many domains into one pipeline?
- Publish the same rua= mailto address on every organizational domain. The aggregate report XML carries policy_published.domain so each report is attributable. For external analyzer destinations, publish a domain._report._dmarc.analyzer authorization record per organizational domain.
- What should I do with parked domains that send no mail?
- Apply the null-SPF + p=reject + sp=reject + np=reject hardening pattern. v=spf1 -all, v=DMARC1; p=reject; sp=reject; np=reject; rua=, plus null MX (RFC 7505). Costs nothing and prevents the most common brand-impersonation attack vector.
- How do I handle DMARC for a newly acquired company domain?
- Use the 6-step acquired-company playbook: inventory, publish p=none with central reporting, 14-30 day visibility window, align legitimate senders, move to p=quarantine then p=reject, consolidate reporting. The visibility window is the most commonly skipped step and the most common cause of false-positive rejects.
- Why does my DMARC report show records for a domain I did not register?
- Two common causes. An attacker is spoofing a look-alike domain (typosquat) and your aggregate reports surface failure attempts from neighbouring zones. Or a receiver attributed a report to your address by mistake; verify by checking policy_published.domain in the report XML against domains you actually own.
- Can I use the same DKIM key across multiple domains?
- No. DKIM signatures are bound to the d= tag domain. Receivers query selector._domainkey.d-domain so you cannot share a key across example.com and example.net. You CAN reuse a key across subdomains of one organizational domain (mail.example.com signs with d=example.com) but cross-organizational-domain sharing is prevented by the DKIM record location semantics.
14. Audit your portfolio
DMARC Analyzer's free Domain Security Checker
performs live DMARC + SPF + DKIM + MTA-STS +
BIMI + DNSSEC lookups against any domain - run
it against every domain in your portfolio
inventory to surface the current posture per
domain in one pass. The DNS Record Generator
builds syntactically-correct DMARC records with
sp= + np= + null SPF
+ null MX bundles for one-shot parked-domain
hardening. Imported DMARC aggregate reports
(via
includes/DmarcParser.php) plus
parsed forensic reports (via
includes/ForensicReportParser.php)
drive the dashboard that groups by reported
domain for portfolio-level visibility.