DMARC Reporting Pipeline: End-to-End RUA + RUF Ingestion, Format Detection, Parsing, Storage, Retention, and Alerting Reference
The operator-implementation reference for building a working DMARC reporting pipeline: six pipeline stages (ingestion, format detection, parsing, storage and deduplication, retention, analysis and alerting) anchored against the DMARC Analyzer project reference implementation in includes/DmarcParser.php + ForensicReportParser.php + TlsRptParser.php + ImapFetcher.php + GraphFetcher.php. Where the aggregate-reports page documents the RUA XML SCHEMA and the forensic-reports page documents the RUF MIME format, this page answers the question "I have a rua=mailto: address; what does the software behind it actually do?"
This pipeline reference is provided in English. The operational vocabulary (rua=, ruf=, AFRF, MIME envelope, IMAP4rev1, Microsoft Graph, Mail.Read, OAuth 2.0 client-credentials, magic bytes, gzip / zip / tar.gz extension semantics, INSERT IGNORE, ON CONFLICT DO NOTHING, AES-256-GCM, application/feedback-report) is standardised RFC / vendor terminology that does not translate. We keep the body in the source language so the configuration values and code references remain copy-paste safe across locales.
TL;DR
- A DMARC reporting pipeline turns
rua=aggregate andruf=forensic reports landing in a monitoring mailbox into queryable database records and operational alerts. It has six stages: ingestion, format detection, parsing, storage, retention, and analysis/alerting. - Three ingestion patterns are canonical:
direct SMTP delivery to the
rua=mailto:address, IMAP4rev1 polling of a monitoring mailbox, and Microsoft Graph polling of an Entra ID mailbox via the Mail.Read application permission. - Format detection uses magic bytes, not
filename extensions. gzip starts with
0x1f 0x8b; zip starts withPK\x03\x04; tar.gz is gzip wrapping a tar archive; raw XML starts with<?xmlor<feedback. The DMARC Analyzer project implementation lives inincludes/DmarcParser.php. - RUA aggregate reports use the RFC 7489
Appendix C XML schema with four blocks:
<report_metadata>,<policy_published>, one or more<record>s, each with<row>+<identifiers>+<auth_results>. - RUF forensic reports use the RFC 6591
AFRF MIME format with
multipart/reportcontaining a human-readable text section, amessage/feedback-reportkey-value block, and amessage/rfc822ormessage/rfc822-headersattachment. The DMARC Analyzer parser lives inincludes/ForensicReportParser.php. - Deduplicate on the tuple
(org_name, report_id)via a database UNIQUE constraint; INSERT IGNORE or ON CONFLICT DO NOTHING handles concurrent ingestion. Add a SHA-256 content hash as a secondary key for senders that reuse report_id across date ranges. - Typical retention: 365 days for RUA records, 90 days for RUF records with message-content fields purged after 30 days. GDPR Article 4(1) treats source IPs as potentially personal data; data minimisation argues for time-bounded retention.
- Six alert categories close the loop: ingestion-health, alignment-regression, volume-anomaly, sender-inventory drift, reporter-coverage, and policy-disposition shift. See the DMARC Monitoring page for the dashboard discipline that consumes these alerts.
- The DMARC Analyzer project ships
reference implementations of every
stage:
includes/DmarcParser.php(XML + gzip + zip + tar.gz detection and parsing per RFC 7489),includes/ForensicReportParser.php(AFRF MIME envelope per RFC 6591),includes/TlsRptParser.php(JSON TLS-RPT per RFC 8460 for the related TLS reporting pipeline),includes/ImapFetcher.php(IMAP4rev1 mailbox polling), andincludes/GraphFetcher.php(Microsoft Graph mailbox polling via OAuth 2.0 client-credentials).
1. What this guide covers
This is the operator-implementation reference for
building a working DMARC reporting pipeline. Where
the
aggregate
reports deep dive documents the RUA XML schema
and the
forensic
reports deep dive documents the RUF AFRF MIME
format, this page covers the END-TO-END PIPELINE
that ingests, decompresses, parses, deduplicates,
stores, analyses, and alerts on those reports. It
is the answer to the question "I have a
rua=mailto: address; what does the
software behind it actually do?"
The page anchors against the DMARC Analyzer
project's own reference implementation in
includes/DmarcParser.php,
includes/ForensicReportParser.php,
includes/TlsRptParser.php,
includes/ImapFetcher.php, and
includes/GraphFetcher.php, so readers
can map each documented pipeline stage onto a
working code path. The pipeline stages are
protocol-agnostic; the design generalises to any
stack (Python, Go, Ruby, Node.js, .NET, Java) that
can speak SMTP, IMAP4rev1, or HTTPS.
Reading order: start with the architecture overview in Section 2 to internalise the six pipeline stages, then walk through each stage in Sections 3 through 8. Sections 9 and 10 cover the two recommended ingestion-source integrations (IMAP and Microsoft Graph). Section 11 covers the monitoring-mailbox operational concerns that every pipeline depends on. Sections 12 and 13 cover troubleshooting and common mistakes. Section 14 is an 8-question FAQ.
2. Pipeline architecture
A DMARC reporting pipeline has six discrete stages, each with well-defined inputs, outputs, and failure modes. The stages are pipelined - a single attachment flows through every stage exactly once - but each stage can be unit-tested in isolation against a canonical fixture set.
+---------------+ +-------------+ +-------------+
| 1. Ingestion |--->| 2. Format |--->| 3. Parse |
| SMTP / | | Detection | | RUA XML / |
| IMAP / | | XML/gz/zip | | RUF MIME |
| Graph | | /tar.gz | | |
+---------------+ +-------------+ +-------------+
|
v
+---------------+ +-------------+ +-------------+
| 6. Analysis & |<---| 5. Retention|<---| 4. Store + |
| Alerting | | GDPR / cost| | Deduplicate|
| KPIs / SLO | | 365d RUA | | UNIQUE |
| | | 90d RUF | | (org_name, |
| | | | | report_id)|
+---------------+ +-------------+ +-------------+
Each arrow represents a hand-off where the
pipeline can be paused, retried, or audited. The
DMARC Analyzer project implements this exact shape
with upload.php as the manual ingestion
entrypoint, imap_fetch.php as the
automated IMAP + Graph ingestion entrypoint,
includes/DmarcParser.php as the
format-detection-plus-XML-parser, and the
dmarc_reports + dmarc_records
+ dmarc_forensic_reports tables as
the storage tier.
Designing for the six-stage shape pays off in three ways. (1) Operational observability: each stage emits metrics (records-ingested, records-failed-parse, records-deduplicated, records-stored, records-retained, alerts-fired) so failures are localised. (2) Retry safety: stages are idempotent on the deduplication tuple, so a daemon that crashes mid-batch can safely re-ingest the same emails without producing duplicate records. (3) Vendor portability: a stack that ingests via IMAP today can swap to Graph tomorrow without touching Stages 2-6.
3. Stage 1: Ingestion sources
Three canonical patterns deliver DMARC reports to the pipeline. Pick one as the primary; many programs run two in parallel for redundancy.
3.1 Direct SMTP delivery to the rua=mailto: address
The simplest pattern: the rua=mailto:
address in the DMARC TXT record is a real SMTP
inbox that receives reports as the mail server
delivers them. Receivers send aggregate reports
every 24 hours (RFC 7489 §7.2.1) and forensic
reports as failures occur (§7.3). The inbox must
be DMARC-compliant itself - if the mailbox's own
domain has p=reject and the reporter
is sending from an unaligned sender, the report
bounces and the inbox sees zero traffic. This is
the canonical "your DMARC reports stopped arriving
because you enforced DMARC on the rua= domain"
chicken-and-egg failure.
Implementation: publish the rua= address pointing at a mailbox on a domain you fully control; ensure the mailbox's own DMARC alignment is correct; monitor the mailbox for inbound-mail volume as a reporter-coverage KPI (see Section 8). Direct SMTP is fine for low-volume programs but does not scale to multi-tenant pipelines because each rua= address needs its own mailbox.
3.2 IMAP4rev1 polling
Most production pipelines run an IMAP poller that
periodically connects to the monitoring mailbox,
fetches new messages, processes attachments, and
marks messages as Seen or moves them to a processed
folder. The protocol is RFC 3501 IMAP4rev1; the
canonical PHP integration is the
imap_open() family of functions from
the IMAP PECL extension. The DMARC Analyzer project
ships includes/ImapFetcher.php as the
reference implementation (see Section 9).
Operational concerns: (1) authentication credentials should be encrypted at rest (the DMARC Analyzer project encrypts IMAP passwords with AES-256-GCM using a key derived from the DB_PASS environment variable - see the project's CLAUDE.md security patterns); (2) the poller must handle partial-batch failures by marking only successfully-processed messages as Seen; (3) connection rate limits at the mailbox provider mean the poll interval must be at least 5 minutes for most providers; (4) Microsoft 365 mailboxes are progressively disabling Basic Authentication so the Graph pattern in Section 10 is preferred there.
3.3 Microsoft Graph polling
For Microsoft 365 monitoring mailboxes, the
Microsoft Graph API is the preferred ingestion path.
Graph exposes
/v1.0/users/{user-id}/messages for
reading mailbox messages with attachments, uses
OAuth 2.0 client-credentials (no mailbox passwords),
and does not require Basic Authentication. The
DMARC Analyzer project ships
includes/GraphFetcher.php as the
reference implementation (see Section 10).
Setup requires registering an Entra ID (Azure AD)
application with the Mail.Read
application permission (NOT delegated), tenant
admin consent, and either a client secret or a
certificate for the OAuth flow. Each access token
is valid for 1 hour by default; the fetcher
refreshes tokens on-demand.
4. Stage 2: Format detection and extraction
DMARC aggregate reports arrive as one of four container shapes:
- Raw XML - rare, typically
only from misconfigured reporters.
Content-Type: application/xmlortext/xml. - gzip - the most common shape.
Content-Type: application/gziporapplication/x-gziporapplication/octet-stream. Filename extension.xml.gz. - zip - common from Microsoft
and certain older Yahoo reporters.
Content-Type: application/zip. Filename extension.zip. - tar.gz - rare but seen from a
handful of academic mailbox operators. gzip
wrapping a tar archive. Filename extension
.tar.gzor.tgz.
Filename extensions disagree across reporters, so
robust pipelines detect by MAGIC BYTES (the first
few bytes of the attachment). The DMARC Analyzer
project implementation in
includes/DmarcParser.php walks
attachments through gzip > zip > raw-XML detection
in that order.
// Magic-byte detection (the canonical pattern):
gzip: first 2 bytes are 0x1f 0x8b
zip: first 4 bytes are 0x50 0x4b 0x03 0x04 ("PK\x03\x04")
tar.gz: gzip header followed by tar archive at decompressed offset 0;
tar marker "ustar" appears at byte 257 of the decompressed payload
xml: first non-whitespace bytes are "<?xml" or "<feedback"
(allow optional UTF-8 / UTF-16 BOM before the first <)
Extraction proceeds in two steps. First, the
pipeline decompresses to a raw byte buffer
containing the XML payload (or the AFRF MIME for
RUF reports). Second, character-encoding detection
handles the UTF-8 / UTF-16 / ASCII variants that
reporters emit; XML parsers consume the encoding
declaration from the
<?xml version="1.0" encoding="..."?>
prologue if present.
Failure modes: corrupted attachments (gzip CRC mismatch, zip central-directory truncation), nested archives (zip-inside-tar, gzip-inside-zip - rare but seen in the wild), and content-type spoofing where the attachment is text but declared binary. The pipeline must log every parse failure with the source mailbox, message ID, and the first 32 bytes of the attachment so operators can audit a misbehaving reporter.
5. Stage 3: Parsing (RUA XML and RUF MIME)
5.1 RUA XML parsing per RFC 7489 Appendix C
DMARC aggregate (rua) reports use the
XML schema defined in
RFC
7489 Appendix C. The root element is
<feedback> with four top-level
children:
<feedback>
<report_metadata>
<org_name>google.com</org_name>
<email>noreply-dmarc-support@google.com</email>
<report_id>1234567890</report_id>
<date_range>
<begin>1716163200</begin>
<end>1716249600</end>
</date_range>
</report_metadata>
<policy_published>
<domain>example.com</domain>
<adkim>r</adkim>
<aspf>r</aspf>
<p>reject</p>
<sp>reject</sp>
<pct>100</pct>
</policy_published>
<record>
<row>
<source_ip>192.0.2.1</source_ip>
<count>42</count>
<policy_evaluated>
<disposition>none</disposition>
<dkim>pass</dkim>
<spf>pass</spf>
</policy_evaluated>
</row>
<identifiers>
<header_from>example.com</header_from>
</identifiers>
<auth_results>
<dkim>
<domain>example.com</domain>
<selector>default</selector>
<result>pass</result>
</dkim>
<spf>
<domain>example.com</domain>
<scope>mfrom</scope>
<result>pass</result>
</spf>
</auth_results>
</record>
</feedback>
Parser design rules:
- Use a DOM or SAX parser, not regex.
DMARC reports are well-formed XML; PHP's
SimpleXMLElement, Python'sxml.etree.ElementTree, or any equivalent SAX parser is the right tool. The DMARC Analyzer project usesSimpleXMLElementwithLIBXML_NONET | LIBXML_NOENT | LIBXML_NOCDATAflags to disable external entity resolution (defence against XXE). - Ignore unknown elements.
Reporters extend the schema with non-standard
elements (Google adds
<extra_contact_info>, Microsoft occasionally adds organization-specific annotations). Robust parsers ignore unknown children rather than rejecting the report. - Coerce date_range values to UTC
timestamps. The begin / end fields are
Unix epoch seconds in UTC per RFC 7489 §7.2.1.1;
store them as
BIGINTfor queryability. - Normalise the disposition value.
Disposition is one of
none,quarantine,reject; normalise to lowercase for consistency. - Accept multiple
<dkim>and<spf>blocks inside<auth_results>. Multi-domain DKIM signing is increasingly common; the parser must collect all sub-blocks rather than overwriting on each iteration.
5.2 RUF AFRF MIME parsing per RFC 6591 + RFC 7489 §7.3
DMARC forensic (ruf) reports use the
Abuse Reporting Format (AFRF) defined in
RFC
6591, with DMARC-specific extensions in
RFC
7489 §7.3. The container is a
multipart/report; report-type=auth-failure
MIME envelope with three parts:
- A
text/plainhuman-readable section describing the failure; - A
message/feedback-reportmachine-readable key-value section with the canonical AFRF fields (Feedback-Type, Version, User-Agent, Original-Mail-From, Arrival-Date, Source-IP, Reported-Domain, Auth-Failure, DKIM-Domain, DKIM-Selector, Identity-Alignment, Delivery-Result); - A
message/rfc822ormessage/rfc822-headersattachment with the headers (and optionally the body) of the failing message.
The DMARC Analyzer project parser
(includes/ForensicReportParser.php)
uses PHP's mailparse extension to walk
the MIME tree, extracts the AFRF key-value block as
a normalised array, and stores the originating
message-headers fragment as a TEXT field for
operator review. Forensic reports are far more
privacy-sensitive than aggregate reports (they
contain message content); pipelines must surface
this to operators via storage-tier access controls.
6. Stage 4: Storage and deduplication
6.1 The canonical schema shape
The DMARC Analyzer project schema separates the report-level metadata from the per-record rows:
-- dmarc_reports: one row per ingested aggregate report
CREATE TABLE dmarc_reports (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
org_name VARCHAR(255) NOT NULL,
email VARCHAR(255),
report_id VARCHAR(255) NOT NULL,
date_begin BIGINT NOT NULL,
date_end BIGINT NOT NULL,
domain VARCHAR(255) NOT NULL,
policy_p VARCHAR(32),
policy_sp VARCHAR(32),
policy_adkim CHAR(1),
policy_aspf CHAR(1),
policy_pct SMALLINT,
raw_xml_hash CHAR(64), -- SHA-256 for content-hash dedup
ingested_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uq_report (org_name, report_id)
);
-- dmarc_records: one row per <record> inside a report
CREATE TABLE dmarc_records (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
report_id BIGINT NOT NULL,
source_ip VARCHAR(45) NOT NULL,
message_count INT NOT NULL,
disposition ENUM('none','quarantine','reject') NOT NULL,
dkim_eval ENUM('pass','fail') NOT NULL,
spf_eval ENUM('pass','fail') NOT NULL,
header_from VARCHAR(255),
dkim_domain VARCHAR(255),
dkim_selector VARCHAR(255),
dkim_result VARCHAR(32),
spf_domain VARCHAR(255),
spf_result VARCHAR(32),
FOREIGN KEY (report_id) REFERENCES dmarc_reports(id) ON DELETE CASCADE,
INDEX idx_source_ip (source_ip),
INDEX idx_dkim_eval (dkim_eval),
INDEX idx_spf_eval (spf_eval)
);
-- dmarc_forensic_reports: one row per ingested RUF report
CREATE TABLE dmarc_forensic_reports (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
feedback_type VARCHAR(64) NOT NULL,
arrival_date BIGINT,
source_ip VARCHAR(45),
reported_domain VARCHAR(255),
auth_failure VARCHAR(255),
dkim_domain VARCHAR(255),
original_headers TEXT,
ingested_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uq_forensic (feedback_type, arrival_date, source_ip)
);
Decisions to lock in: source_ip as
VARCHAR(45) accommodates IPv6 textual
forms; BIGINT for Unix timestamps
survives the 2038 problem; per-record FK on
dmarc_reports.id with
ON DELETE CASCADE makes retention
cleanup atomic.
6.2 Deduplication strategies
A DMARC report is uniquely identified by the tuple
(org_name, report_id, date_range_begin,
date_range_end). The same report can arrive
multiple times due to mailbox retries, poller
crashes mid-batch, or sender-side reissues. Three
deduplication strategies, in increasing robustness:
- Database UNIQUE constraint on
(org_name, report_id). Combined withINSERT IGNORE(MariaDB / MySQL) orON CONFLICT DO NOTHING(PostgreSQL), this handles duplicates atomically without any application-side bookkeeping. The most-recommended baseline. - SHA-256 content hash stored in
the reports table, checked before insert.
Useful when a misbehaving sender reuses
report_id across different date ranges (rare
but seen). The DMARC Analyzer project schema
includes a
raw_xml_hashcolumn for this purpose. - Idempotency-key middleware in the ingestion daemon, with a short-TTL cache (Redis, Memcached) of recently-seen (org_name, report_id) tuples. Useful when the deduplication must happen BEFORE any database write (high-volume pipelines where rejected inserts are still expensive).
Most production pipelines combine (1) and (2) for defence in depth.
7. Stage 5: Retention policies
Four considerations drive DMARC report retention.
- Operational utility. 90-day rolling aggregate reports support quarterly trend analysis, alignment-pass-rate regression detection, and sender-inventory drift detection. Reports older than 90 days rarely surface in operational queries.
- Compliance. Most security frameworks (SOC 2, ISO 27001, PCI-DSS) treat DMARC reports as security-monitoring artifacts and require minimum retention of 12 months. The DMARC Analyzer project defaults RUA retention to 365 days for this reason.
- GDPR / data minimisation. Aggregate reports contain source IPs that may qualify as personal data under GDPR Article 4(1); apply data minimisation by deleting records older than the operational + compliance minimum. Forensic (RUF) reports contain message content and headers and are far more privacy-sensitive; retain only as long as needed for the specific investigation.
- Storage cost. At enterprise volumes (10,000+ messages per day across all reporters), aggregate-record rows accumulate at ~100 MB per month; cap retention at 365 days for most programs to keep the storage tier cost-bounded.
A typical retention policy: RUA records
kept 365 days; RUF records kept 90 days with
message-content fields purged after 30 days.
Implement via a nightly cron that issues
DELETE FROM dmarc_reports WHERE date_end <
UNIX_TIMESTAMP() - 31536000 and the
equivalent for the forensic table. The
ON DELETE CASCADE on
dmarc_records.report_id means
per-record cleanup is automatic.
8. Stage 6: Analysis and alerting
Analysis turns stored records into the KPIs documented in the DMARC Monitoring deep dive (authenticated volume, alignment pass rate, SPF / DKIM pass rates, distinct sending sources, disposition distribution, reporter coverage). Alerting turns threshold breaches into actionable operator notifications.
Six categories of alert close the operational loop:
- Ingestion-health alerts: rua= mailbox unreachable, IMAP authentication failure, Graph token refresh failure, attachment parse failure rate above 5 percent.
- Alignment-regression alerts: alignment pass rate for any enforced domain drops more than 5 percentage points below the 7-day rolling average.
- Volume-anomaly alerts: authenticated message volume drops more than 20 percent day-over-day or spikes more than 5x against the prior 14-day median.
- Sender-inventory drift alerts: a new source IP appears with more than 100 messages from an IP not seen in the past 30 days.
- Reporter-coverage alerts: count of distinct reporting organizations drops below 5 per day for a high-volume sender.
- Policy-disposition shift alerts: an enforced domain shows quarantine or reject disposition above 1 percent of total volume from a previously-aligned receiver.
The DMARC Analyzer dashboard surfaces all six categories via the source-IP detail view, the reporter breakdown, and the per-domain alignment trend - see reporter detail and source-IP detail in the running application.
9. IMAP mailbox setup (ImapFetcher.php)
The DMARC Analyzer project ships
includes/ImapFetcher.php as the
reference IMAP4rev1 polling integration. The
fetcher connects to a monitoring mailbox over
IMAPS (TLS-encrypted port 993), iterates the INBOX
for unread messages with attachments, extracts the
attachment bytes, hands them off to
DmarcParser, and marks the message as
Seen on successful ingestion.
Per-user configuration (encrypted at rest via
AES-256-GCM in the users table):
imap_host = "imap.example.com" imap_port = 993 imap_username = "dmarc-reports@example.com" imap_password = "<encrypted>" // AES-256-GCM imap_use_ssl = 1 imap_inbox = "INBOX" imap_processed = "INBOX.Processed" // optional: move-after-ingest imap_poll_minutes = 15
Authentication strategies vary by provider. Generic
IMAP servers accept Basic Authentication (username
+ password); Gmail requires an
application
password when 2FA is enabled; Microsoft 365
has progressively disabled Basic Authentication so
the Microsoft Graph path (Section 10) is preferred
there. The fetcher logs each ingestion attempt to
the api_requests table for audit.
10. Microsoft Graph setup (GraphFetcher.php)
The DMARC Analyzer project ships
includes/GraphFetcher.php as the
reference Microsoft Graph polling integration. The
fetcher uses OAuth 2.0 client-credentials grant
(no mailbox passwords) and the
Mail.Read application permission.
Tenant administrator setup:
- In the Entra ID admin centre, register a new application. Record the Application (client) ID and the Directory (tenant) ID.
- Add the API permission
Microsoft Graph > Application permissions > Mail.Read. Click "Grant admin consent" on the consent flow. - Generate a client secret OR upload a certificate in Certificates & secrets. Record the secret value at generation time - the portal does not show it again.
- Provide the tenant ID, client ID, and secret to the fetcher via the per-user configuration (encrypted at rest):
graph_tenant_id = "11111111-1111-1111-1111-111111111111" graph_client_id = "22222222-2222-2222-2222-222222222222" graph_client_secret = "<encrypted>" // AES-256-GCM graph_mailbox = "dmarc-reports@example.com" graph_poll_minutes = 15
The fetcher requests an access token from
https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token
with grant_type=client_credentials and scope=https://graph.microsoft.com/.default,
caches the token until expiry (1 hour), and uses
it to GET
/v1.0/users/{mailbox}/messages?$filter=hasAttachments+eq+true&$expand=attachments.
Each returned message has its attachments as
base64-encoded contentBytes fields;
the fetcher decodes, decompresses, parses, and
stores via the same Stage 2-4 pipeline used by
IMAP. After successful ingestion, the fetcher
PATCHes the message with
isRead: true.
11. Monitoring mailbox best practices
A dedicated, single-purpose monitoring mailbox is the load-bearing component of a DMARC reporting pipeline. Eight best practices:
- Dedicated address per program.
Do not use a personal inbox; route to
dmarc-reports@<your-domain>. This keeps DMARC reports out of personal mail and provides clean access boundaries for ingestion daemons. - The mailbox's own domain must be
DMARC-compliant. If your reporting
domain has
p=rejectand a reporter sends from an unaligned address, the report bounces and never lands. Verify with the domain checker before going live. - No catch-all. Spam routing
rules at the receiving server should not
intercept DMARC reports. Whitelist the most
common reporter sources
(
noreply-dmarc-support@google.com,dmarcreport@microsoft.com,postmaster@yahoo.com) as belt-and-braces. - Accept large attachments. Aggregate reports from high-volume senders regularly exceed 1 MB compressed; raise the mailbox attachment ceiling above the default 25 MB if hitting limits.
- Plain-text content disposition. Disable any inbox-side rich-content rewrite (HTML stripping, link wrapping); DMARC reports are application/xml / application/gzip / application/zip and should pass through untouched.
- Retain raw emails for at least 90 days. Even after parsing succeeds, the raw email lets operators re-process if the parser is later updated to extract additional fields. Store at the mail-server tier (cheap) or in a separate raw-archive table.
- Monitor the mailbox volume as a reporter-coverage KPI. A sudden drop in daily inbound volume signals a broken DMARC TXT, a bouncing mailbox, or a dropped sending relationship.
- Encrypt mailbox credentials at rest.
IMAP passwords, Graph client secrets, refresh
tokens: all must be encrypted at rest (the
DMARC Analyzer project uses AES-256-GCM with a
key derived from
DB_PASS).
12. Pipeline troubleshooting
The four most-common pipeline failure modes and their diagnostic steps:
12.1 Reports arrive but parser fails on every one
Symptom: the IMAP fetcher logs records
ingested = 0 while the mailbox shows
inbound traffic. Diagnosis: the format-detection
stage is failing. Capture the first 32 bytes of a
failed attachment via the parse-error log; compare
against the magic-byte table in Section 4. Common
cause: a reporter is sending a new container shape
(e.g., zstd compression seen from one experimental
operator); add detection for it OR exclude that
reporter from the polling glob.
12.2 Reporter coverage drops to zero
Symptom: aggregate-report volume goes from
10 reporters/day to 0 within 24 hours. Diagnosis:
the rua= mailbox is bouncing OR the DMARC TXT
record is malformed OR the reporting domain itself
has p=reject and the reporter is
sending from an unaligned address. Check inbox
bounces; re-validate the DMARC TXT via the domain
checker; verify the rua= mailbox's own DMARC
alignment.
12.3 Deduplication is failing - duplicate records
Symptom: the same source IP appears with double
the expected count for a single day. Diagnosis:
the UNIQUE constraint on
(org_name, report_id) is missing OR
the constraint is present but the parser is
extracting different report_id values for the
same logical report. Verify the schema; check
that the parser is reading the
<report_id> element rather than
falling back to a per-message hash.
12.4 OAuth token refresh fails (Graph)
Symptom: Graph fetcher logs
HTTP 401 - invalid_client at every
poll. Diagnosis: the client secret has expired
(the portal default is 24 months), the application
has lost its Mail.Read permission, OR a tenant
Conditional Access policy is blocking
client-credentials grants from the daemon's IP.
Re-issue the client secret in Entra ID; verify
the permission grant; whitelist the daemon IP in
the Conditional Access policy if applicable.
13. Common pipeline mistakes
- Relying on filename extensions for format detection. Use magic-byte detection; extensions disagree across reporters.
- Using regex to parse the XML. Use a DOM or SAX parser; regex fails on unexpected whitespace, CDATA sections, and nested elements.
- Resolving external entities during
XML parse. XXE injection risk; always
disable external-entity resolution
(
LIBXML_NONET | LIBXML_NOENTin PHP). - No UNIQUE constraint on report_id. Duplicate ingestion produces inflated KPIs and confused operators.
- Marking messages as Seen before parse succeeds. A daemon crash mid-batch loses the messages permanently. Mark as Seen only AFTER successful storage.
- No retention policy. Tables grow without bound; query performance degrades; GDPR exposure accumulates.
- Polling too fast. Most mailbox providers rate-limit IMAP connections at one per 5 minutes; poll less often.
- Storing IMAP passwords in plaintext. Always encrypt at rest. The DMARC Analyzer project uses AES-256-GCM with a DB_PASS-derived key.
- Treating RUA and RUF identically. RUF contains message content and is far more privacy-sensitive than RUA; apply tighter retention and access controls.
- Ignoring parse errors. Each parse failure indicates a misbehaving reporter OR a pipeline gap. Log every failure with the source mailbox + message ID + first 32 bytes.
14. FAQ
- What is a DMARC reporting pipeline?
- A DMARC reporting pipeline is the end-to-end software workflow that turns DMARC aggregate (RUA) and forensic (RUF) reports landing in a monitoring mailbox into queryable database records and operational alerts. It has six stages: ingestion, format detection, parsing, storage, retention, and analysis / alerting.
- How do I ingest DMARC aggregate reports automatically?
-
Three canonical patterns. Direct SMTP delivery
to the rua= mailbox; IMAP4rev1 polling of a
monitoring mailbox (the DMARC Analyzer project
ships
includes/ImapFetcher.php); or Microsoft Graph polling via the Mail.Read application permission and OAuth 2.0 client-credentials (the DMARC Analyzer project shipsincludes/GraphFetcher.php). - How does the pipeline detect whether a DMARC report attachment is XML, gzip, zip, or tar.gz?
-
Magic-byte detection. gzip starts with
0x1f 0x8b; zip starts withPK\x03\x04; tar.gz is gzip wrapping a tar archive; raw XML starts with<?xmlor<feedback. Filename extensions are advisory only. - What XML schema do DMARC aggregate reports use?
-
RFC 7489 Appendix C. The root element is
<feedback>containing<report_metadata>,<policy_published>, and one or more<record>blocks with<row>+<identifiers>+<auth_results>. - How does pipeline deduplication work for DMARC reports?
-
A DMARC report is uniquely identified by
(org_name, report_id, date_range_begin, date_range_end). Deduplicate via a database UNIQUE constraint on(org_name, report_id)withINSERT IGNORE/ON CONFLICT DO NOTHING. Add a SHA-256 content hash as a secondary key for senders that reuse report_id across date ranges. - What retention policy should I apply to DMARC reports?
- Typical: 365 days for RUA records, 90 days for RUF records with message-content fields purged after 30 days. Driven by operational utility (90-day rolling window), compliance (12-month minimum for SOC 2 / ISO 27001 / PCI-DSS), GDPR data minimisation, and storage cost at enterprise volumes.
- How do I poll a Microsoft 365 mailbox for DMARC reports via the Graph API?
-
Register an Entra ID application, grant the
Mail.Readapplication permission with tenant admin consent, generate a client secret or certificate, then use OAuth 2.0 client-credentials to GET/v1.0/users/{mailbox}/messages?$filter=hasAttachments+eq+true. See the DMARC Analyzer project'sincludes/GraphFetcher.phpfor the reference implementation. - What alerts should the pipeline fire?
- Six categories: ingestion-health, alignment-regression, volume-anomaly, sender-inventory drift, reporter-coverage, and policy-disposition shift. See Section 8 and the DMARC Monitoring deep dive for the dashboard discipline that consumes them.
15. Related guides
- Email Authentication overview - the cluster-intro pillar covering SPF + DKIM + DMARC + BIMI + MTA-STS + TLS-RPT + CAA + ARC in one end-to-end reference.
- DMARC primer (help hub) - the top-level DMARC pillar; the entry point for new readers.
- DMARC Aggregate Reports (RUA) - the RFC 7489 Appendix C XML schema deep dive. The schema-level companion to this pipeline-level page.
- DMARC Forensic Reports (RUF) - the RFC 6591 AFRF MIME format deep dive. Documents what Stage 3 sees when it parses a forensic report.
- DMARC Monitoring - the operational dashboard discipline that consumes the analysis output from Stage 6.
- DMARC Troubleshooting - the diagnostic loop for specific failures observed in the pipeline output.
- ARC (Authenticated Received Chain) explained
— the RFC-8617-ARC-CHAIN-PER-ROW-AUTH-
RESULTS-AGGREGATE-REPORT-EVIDENCE-AS-
PIPELINE-STAGE-3-INGEST-AND-STAGE-6-ANALYSIS-
INPUT companion to this seven-stage DMARC
RUA/RUF reporting pipeline reference. Where
THIS page documents the seven-stage end-to-end
pipeline (Stage 1 publisher rua= /
ruf= mailbox publication, Stage 2 receiver
per-day evaluation aggregation, Stage 3 DNS
URI resolution + MIME-attached SMTP send,
Stage 4 inbound mailbox / webhook receipt,
Stage 5 schema-conformant parsing, Stage 6
per-source-IP per-day aggregation + analysis,
Stage 7 dashboard surface for operator
consumption), the ARC spoke documents the
RFC 8617 three-header sealing protocol whose
per-forwarder per-hop AAR/AMS/AS attestation
chain is the cryptographic-chain-of-custody
evidence stream the pipeline's per-row
ingestion at Stage 3 and per-row analysis at
Stage 6 must distinguish from original-hop
per-row evidence at FOUR per-stage-vs-ARC-
chain-evidence coupling dimensions: (i)
Stage 3 ARF/XML parsing of per-row
ARC-chain-evaluation field — the
per-message RFC 7489 §C.1 aggregate-report
XML emitted by the receiver includes the
per-row
<auth_results>block whose ARC-chain evaluation field surfaces the per-hop chain-validity outcome (ARC=pass / ARC=fail / ARC=none) the pipeline parser must extract alongside the per-row SPF and DKIM verdicts; the ARC spoke documents the per-row ARC field-grammar the Stage 5 parser interprets; (ii) Stage 6 analysis distinguishing ARC-honoured rows from original-hop-pass rows — the per-source-IP per-day aggregation Stage 6 produces must correctly attribute ARC- honoured rows (where the per-hop chain-of- custody preserved the original-hop verdict across forwarder boundaries) separately from original-hop-pass rows (where the connecting-MTA-IP IS the original sender), because per-source-IP reputation analysis depends on this distinction — the ARC spoke documents the per-row ARC-evaluation discipline that informs the per-source-IP reputation-attribution decision; (iii) per-row ARC-chain-failure as operationally-distinct verdict class from per-row DKIM-fail and per-row SPF-fail classes — when the per-row ARC evaluation surfaces ARC=fail (chain-of- custody broken at some intermediate hop) while the per-row DKIM and SPF evaluations independently surface dkim=fail and SPF=fail (because the forwarder modified the message body invalidating DKIM AND the connecting MTA is the forwarder invalidating SPF), the per-row evidence stream the pipeline produces carries THREE failure verdicts on the same row; the Stage 6 analyser must attribute the per-row failure cause class correctly — the ARC spoke documents the per-row ARC-failure-mode catalogue (signing- key publication defect, intermediate-hop chain-break, per-receiver ARC-trust configuration mismatch) the Stage 6 analyser consumes; (iv) Stage 1 publisher ruf= / rua= mailbox publication discipline vs Stage 2 receiver ARC-chain-honour policy as upstream-vs-downstream operational boundary — Stage 1 documents the publisher-side rua= / ruf= mailbox publication discipline; Stage 2 documents the receiver-side per-day aggregation discipline; the receiver's ARC-chain-honour policy (Gmail honours valid ARC chains from trusted ARC-signers per Google's documentation; Microsoft EOP honours conditionally) determines whether per-row verdicts in the rua= stream that the pipeline ingests reflect the ARC-honoured elevated verdict OR the unsigned original verdict — the ARC spoke documents the per-receiver ARC-trust-configuration discipline that shapes the per-row evidence stream THIS page's Stage 2 aggregation produces. Read the ARC spoke when designing the pipeline's per-row analysis discipline whose per-source-IP attribution and per-forwarder cohort isolation depends on the per-row ARC-chain-evaluation evidence the receiver-side ARC-honour policy produces at the per-row aggregation boundary. - DMARC deployment checklist
— the PIPELINE-STAGE-1-VS-PHASE-1-RUA-
MAILBOX-PREREQUISITE-AND-PIPELINE-STAGE-6-
VS-PHASE-EXIT-CRITERIA-VERIFICATION companion
to this seven-stage end-to-end DMARC
reporting-pipeline architecture. Where THIS
page documents the architecture-of-record
(Stage 1 ingestion via IMAP / Microsoft Graph,
Stage 2 format-detection-and-extraction,
Stage 3 RUA XML / RUF MIME parsing, Stage 4
storage-and-deduplication, Stage 5 retention
policies, Stage 6 analysis-and-alerting,
Stage 7 operator-dashboard surfacing), the
deployment-checklist page documents the
FOUR-PHASE operator-side rollout that
STRUCTURALLY DEPENDS on this pipeline as
the evidence-of-record for every per-phase
entry and exit gate. Four PIPELINE-STAGE-VS-
DEPLOYMENT-PHASE cross-correlation axes the
deployment-checklist documents:
(i) Phase 1 (Discovery,
p=none) STRUCTURALLY DEPENDS on Stage 1 (RUA mailbox ingestion) as the Phase 1 PREREQUISITE-VERIFICATION evidence — the deployment-checklist Phase 1 gates require the publisher to publishv=DMARC1; p=none; rua=mailto:dmarc- rua@example.comAND verify that Stage 1 (IMAP polling or Microsoft Graph ingest fromdmarc-rua@) is delivering aggregate reports to the pipeline's mailbox — a Phase 1 deployment with no Stage 1 ingestion produces no empirical evidence stream, blocks the sender inventory enumeration, and STRUCTURALLY PREVENTS the operator from advancing past Phase 1 because there is no Phase 1 exit criteria evidence to read; (ii) Phase 2 (Triage, alignment- fixing) STRUCTURALLY DEPENDS on Stages 3 / 4 / 6 (parsing, storage-and- deduplication, analysis) as the Phase 2 per-sender misalignment-backlog evidence stream — the deployment-checklist Phase 2 backlog enumerates every misaligned legitimate sender from the Phase 1-collected aggregate reports, requiring Stages 3 / 4 / 6 of THIS pipeline to parse the RUA XML, deduplicate per-source-IP rows, and emit the per-source-IP-per-day alignment-rate aggregate verdict the operator reads in the dashboard to enumerate the backlog; (iii) Phase 3 (Quarantine,p=quarantine pct=N) STRUCTURALLY DEPENDS on Stage 6 (analysis-and-alerting) as the Phase 3 PER-PERCENTAGE-RAMP-EXIT- CRITERIA evidence — the deployment- checklist Phase 3 ladder (pct=10->pct=25->pct=50->pct=100on a per-week cadence) STRUCTURALLY DEPENDS on Stage 6's alignment-rate KPI emission to confirm the 99-percent-floor exit criteria before advancing to the next ramp step; without Stage 6's per-week alignment-rate aggregate verdict, the operator has no empirical evidence the ramp is safe to advance — Stage 6 is the FEEDBACK-LOOP-INPUT to the per-percentage Phase 3 ramp; (iv) Phase 4 (Enforcement,p=reject) STRUCTURALLY DEPENDS on Stage 6 (analysis-and-alerting) and Stage 7 (operator-dashboard surfacing) as the Phase 4 ROLLBACK-DECISION-TRIGGER evidence stream — the deployment- checklist Phase 4 contract maintains DNS TTL at 300-3600 seconds for fast rollback precisely because Stage 6 / Stage 7 might surface a false-positivedmarc=rejectdisposition on legitimate mail; the rollback procedure (lowerp=rejectback top=quarantineon the same TTL cycle) is triggered by Stage 7's operator-facing per-source-IPdmarc=reject-on-legitimate- traffic alert — without Stage 6 / Stage 7, the operator has no signal to fire the rollback procedure. Pair this pipeline page (the architecture-of-record for the evidence stream) with the deployment- checklist page (the four-phase operator rollout that consumes the evidence stream) for the complete pipeline-architecture- AND-operator-execution-discipline posture every operator needs to ramp DMARC fromp=nonetop=rejectwith empirical-evidence-backed per-phase decisions instead of blind ramp gambles. - DKIM failures explained
— the DKIM-FAILURE-MODE-CATALOGUE-AS-STAGE-6-
ANALYSIS-JOIN-DIMENSION companion to THIS
DMARC reporting pipeline. Where THIS page
documents the seven-stage end-to-end pipeline
from receiver-side aggregation through XML-
gzip-MIME packaging through SMTP transport
through your RUA= mailbox through Stage 1
ingestion through Stages 2-7 parsing /
normalisation / analysis / alerting, the
DKIM-failures-explained spoke documents the
STRUCTURAL FAILURE-MODE TAXONOMY that the
pipeline's per-message DKIM-result column
(Stage 3 XML schema field
<auth_results><dkim><result>) decomposes into at the Stage 6 analysis layer. The aggregate XML report's per-record<result>field carries a FOUR-VALUE enumeration (none/pass/fail/policy/neutral/temperror/permerrorper RFC 7489 §A.2.3 — receiver-side reporter verdict), but EVERYfail-class result subdivides into the DKIM-failures- explained spoke's per-failure-mode catalogue: body-hash mismatch (in-transit body modification by gateway / forwarder), signature-tag-syntax invalidity (publisher- side authoring error or DNS-publication truncation), header-list signature-scoping omission (publisher-side configuration drift post-header-rewriter introduction), canonicalization mismatch (simple-vs-relaxed c14n disagreement), public-key DNS-resolution failure (selector NXDOMAIN, TXT-record publication failure, 255-byte character-string boundary violation), RSA- key-too-small (RFC 8301 BCP 18 / RFC 8463 modern-receiver floor rejection), l= body- length-limit drift, multi-signature verifier- precedence ambiguity, replay-protection rejection. Stage 6 analysis is the pipeline layer that joins per-record DKIM-fail observations against this failure-mode catalogue to surface ROOT-CAUSE CLASSIFICATION downstream of raw verdict counts — without the failure-mode catalogue, Stage 6's output is reduced to domain-aggregate pass/fail counts; with the catalogue, Stage 6 can route per-failure- mode alerts (e.g., "selector NXDOMAIN burst on 2026-05-22T14:00Z affecting 100% of M365 outbound") to the operator responsible for that specific failure mode. Pair this page (the pipeline-architecture reference) with the DKIM-failures-explained spoke (the failure-mode-catalogue analysis- join-dimension) when designing Stage 6 analysis-layer alerting rules — the spoke is the canonical per-failure-mode taxonomy the pipeline's analysis layer presupposes when producing operator-actionable per- failure-mode incident classifications. - DKIM troubleshooting (symptom-driven debugging)
— the PIPELINE-STAGE-6-DKIM-FAIL-
AGGREGATE-VERDICT-TO-PER-SELECTOR-
DIAGNOSTIC-PLAYBOOK companion to THIS
DMARC reporting pipeline. Where THIS
page documents the seven-stage end-to-end
pipeline (Stage 1 IMAP / Microsoft Graph
ingestion of receiver-emitted aggregate
XML, Stage 2 format-detection-and-
extraction from GZ / ZIP, Stage 3 RUA
XML parsing into per-record rows, Stage 4
normalisation against reporter-emitted
format variance, Stage 5 deduplication
across the per-domain-per-reporter
cardinality matrix, Stage 6 analysis-
and-join-against-failure-catalogues with
per-source-IP / per-selector / per-d=
aggregation, Stage 7 alerting on the
per-domain DKIM-fail-rate trend), the
DKIM-troubleshooting spoke is the
SYMPTOM-DRIVEN OPERATOR PLAYBOOK that
runs IMMEDIATELY downstream of Stage 6's
per-domain DKIM-fail-rate aggregate
breaching the alerting threshold. The
four-axis PIPELINE-STAGE-VS-DKIM-
TROUBLESHOOTING-DRILL-DOWN comparison
exposes the structurally-distinct
DRILL-DOWN-PATHWAYS the operator runs
on the pipeline output: (i)
Stage 6 surfaces a per-sending-infrastructure
DKIM-fail spike — the
DKIM-troubleshooting spoke documents the
per-sending-infrastructure identification
playbook (cross-reference Stage 6's
per-source-IP aggregate against the
operator's sending-infrastructure
inventory, identify the responsible
operator team, route the symptom-driven
diagnostic to that team's runbook);
(ii) Stage 6 surfaces a per-
selector DKIM-fail concentration
— the DKIM-troubleshooting spoke
documents the per-selector
<selector>._domainkey.<d=domain>DNS-lookup verification + thev=DKIM1/k=rsa/p=public-key payload decode + theRFC 8301RSA key-size verification + the empty-p=emergency-revocation detection — the per-selector diagnostic ladder the operator runs to route the per-selector failure-class to the right remediation; (iii) Stage 6 surfaces a per-aggregate-report DKIM-fail outlier — the DKIM-troubleshooting spoke documents the message-level diagnostic (cross-reference the aggregate-report's per-recordauth_results/dkim/resultwith the receiver-emittedAuthentication-Resultsheader on a sample message, identify the body-hash-vs-signature-tag-vs-key- resolution failure class, route the per-class diagnostic to the right remediation playbook); (iv) Stage 7 alerting fires on a sustained DKIM-fail-rate trend — the DKIM-troubleshooting spoke is the on-call operator's first-responder runbook the alerting system links into the alert payload (a properly-instrumented Stage 7 alerting payload includes a deep-link into the per-domain DKIM-troubleshooting spoke's symptom- classified diagnostic ladder so the on-call operator can route the alert to the per-failure-class remediation without manual lookup). Read the DKIM-troubleshooting spoke alongside this pipeline reference when designing the Stage 7 alert-payload deep-link targets and when writing the on-call runbook the DKIM-fail alert-firing operator follows downstream of the pipeline's analytic output — the symptom-driven diagnostic ladder is the load-bearing operator-side companion that converts the pipeline's per-domain DKIM-fail-rate aggregate into per-cause root-cause-attributed remediation actions. - SPF permerror vs temperror
— the PIPELINE-STAGE-3-XML-SPF-RESULT-
FIELD-DECODE-AS-PER-RESULT-CODE-
AGGREGATION-DIMENSION companion to this
seven-stage RUA-aggregate-report
pipeline reference. Where THIS page
documents the canonical seven-stage
pipeline (Stage 1 RUA-mailbox ingest /
Stage 2 IMAP-or-Graph fetch / Stage 3
XML decode / Stage 4 ForensicReportParser
body-handle / Stage 5 per-row dispatch /
Stage 6 per-domain aggregation / Stage 7
alerting), the SPF permerror-vs-
temperror spoke is the RFC 7208 §2.6
SPF result-code catalogue companion
whose per-result-code values feed this
pipeline's Stage 3 XML decode and
Stage 6 per-result-code aggregation
dimensions. The PIPELINE-STAGE-3-SPF-
RESULT-FIELD-DECODE cross-reference
establishes FOUR structurally-distinct
pipeline-stage-vs-SPF-result-code
attribution dimensions: (i)
Stage 3 XML decode of
<auth_results><spf> <result>field — the RFC 7489 §A.2 aggregate-report XML schema embeds the receiver-side per-message SPF result-code via the<spf><result>sub-tree; the spoke documents the canonical RFC 7208 §2.6 enumeration (none / neutral / pass / fail / softfail / permerror / temperror) whose receiver-side per-message emission this pipeline's Stage 3 XML decoder must parse correctly into the per-row SPF-result-code field for downstream stages; (ii) Stage 6 per-result-code per-source-IP per-day aggregation as DMARC-leg-attribution evidence stream — the pipeline's Stage 6 analysis joins per-result- code rows into per-source-IP per-day cohort-aggregates that operators consume as the canonical SPF-leg- failure-attribution evidence stream; the spoke documents the per-result- code semantic (permerror = publisher- side-budget exceedance; temperror = transient-DNS failure; fail = receiver-side -all hardfail; softfail = receiver-side ~all graded; neutral = ?all bypass; pass = aligned authentication; none = no SPF record published) that the Stage 6 aggregation surface attribution depends on; (iii) Stage 7 alerting thresholds calibrated against per- result-code per-day baseline — the pipeline's Stage 7 alerting layer fires per-result-code rate deviations against per-day baseline (per-day-spf=permerror-rate spike as publisher-side-budget-exceedance regression early-warning; per-day- spf=temperror-rate spike as authoritative-nameserver-outage early-warning; per-day-spf=fail- rate spike as cohort-onboarding- gone-wrong early-warning); the spoke documents the per-result-code canonical operational-failure-class semantic that calibrates each Stage 7 threshold-trigger rule; (iv) per-publisher-side-vs- receiver-side fix-discipline attribution at Stage 6 root-cause- attribution surface — the pipeline's Stage 6 per-domain analysis emits per-source-IP per-day SPF-result-code attribution that operators consume as the publisher-side-budget-recovery operator-runbook (flatten-the- nested-include cascade, audit void- lookups, fix malformed mechanism syntax) for permerror VS receiver-side authentication-policy- cohort attribution operator-runbook (qualifier-tuning, cohort-onboarding rollback) for fail/softfail/neutral; the spoke documents the canonical per-result-code fix-discipline attribution that the Stage 6 surface publishes to operators. Pair this page (the RUA-aggregate-report seven-stage pipeline architecture) with the SPF permerror-vs-temperror spoke (the SPF result-code RFC-7208-§2.6 reference) when designing per-stage SPF-leg attribution dashboards — both this pipeline's per-stage instrumentation AND the spoke's per-result-code semantic share the canonical publisher-side-vs-receiver-side classification discipline that underpins SPF-leg-failure forensic attribution at Stage 6. - DKIM selectors explained
— the PIPELINE-STAGE-3-XML-SELECTOR-
FIELD-DECODE-AS-PER-SELECTOR-NAMESPACE-
AGGREGATION-DIMENSION-AT-STAGE-6
companion to THIS DMARC reporting
pipeline. Where THIS page documents the
seven-stage end-to-end pipeline (Stage 1
IMAP / Microsoft Graph ingestion, Stage 2
format-detection-and-extraction, Stage 3
RUA XML parsing into per-record rows,
Stage 4 normalisation, Stage 5
deduplication, Stage 6 analysis-and-join,
Stage 7 alerting), the DKIM-selectors-
explained spoke is the PER-PROVIDER
SELECTOR-NAMESPACE CATALOGUE companion
documenting the receiver-emitted
<auth_results><dkim><selector>XML field's per-platform canonical values that the operator's Stage 6 per-selector aggregation-dimension consumes for every sender-platform-attribution forensic investigation. The four-axis PIPELINE- STAGE-VS-SELECTOR-NAMESPACE cross- correlation framework: (i) Stage 3 XML<selector>field decode — every per-record block in the aggregate XML carries the<selector>sub-element the receiver's verifier extracted from the DKIM-Signature header'ss=tag at verification time; the selectors-explained spoke documents the canonical per-platform selector-name catalogue that lets the operator IMMEDIATELY attribute a per-row selector value (e.g.selector1on ad=tenant.onmicrosoft.comrecord decodes as a Microsoft 365 tenant signing pair;google._domainkeydecodes as Workspace's DKIM default; a randomly-generated 16-char hex selector on ad=<esp-domain>decodes as an ESP-shared-domain rotation cohort) without requiring out-of-band sender-inventory lookup; (ii) Stage 6 per-selector aggregation- dimension — the operator's Stage 6 analysis-and-join layer groups per-record rows by (source_ip, selector, d= domain) tuples; the selectors- explained spoke documents the canonical SELECTOR-NAME-SPACE convention that ensures the Stage 6 aggregation-dimension actually attributes correctly across the publisher's rotation cycle (active selector vs deprecated selector vs newly- published selector) — without the selector-namespace catalogue, the Stage 6 per-selector aggregate becomes opaque because the operator cannot correlate the receiver-emitted selector value back to a publisher-side rotation-discipline event; (iii) Stage 6 per- selector permerror detection — when the Stage 6 aggregate surfaces adkim=permerroron a specific selector, the selectors- explained spoke documents the canonical SELECTOR-LOOKUP-PERMERROR root-cause catalogue (rotated-but-still-referenced selector, retired-and-deleted selector, typo-in-Outlook-DKIM-Signature-emit selector, ESP-customer-onboarding- delegation-not-yet-published selector) the operator runs to attribute the per-row permerror to a specific publisher-side configuration regression; (iv) Stage 7 per-selector rotation-cohort alerting — when Stage 7 fires on a selector-rotation cohort anomaly (sustained dkim=fail on a selector that historically passed, sudden burst on a never-before-seen selector), the selectors-explained spoke documents the canonical operator response playbook (publisher-side rotation validation, ESP-customer notification, out-of-band signing-key-custody audit). Pair this pipeline page (the architecture- of-record) with the selectors-explained spoke (the per-provider selector-namespace catalogue) when designing the Stage 6 per-selector aggregation-dimension and the Stage 7 per-selector-rotation-cohort alerting — the selectors-explained spoke is the load-bearing namespace-vocabulary substrate every per-selector aggregate in the pipeline's output depends on for operator-side interpretation. - How attackers bypass DMARC
— the PIPELINE-STAGE-6-AGGREGATE-VERDICT-
AS-BYPASS-ATTEMPT-DETECTION-LAYER companion
to this seven-stage DMARC reporting-pipeline
architecture. Where THIS page documents the
Stage 1 IMAP / Microsoft Graph ingestion,
Stage 2 format-detection-and-extraction,
Stage 3 RUA XML parsing, Stage 4
normalisation, Stage 5 deduplication, Stage 6
analysis-and-join-against-failure-catalogues,
and Stage 7 alerting pipeline as the
ingestion-and-analytic substrate, the
attacker-bypass spoke documents the
STRUCTURED 22-TECHNIQUE BYPASS CATALOGUE the
publisher's blue-team consults when triaging
whether an OBSERVED STAGE-6-AGGREGATE-VERDICT
ANOMALY constitutes campaign-level attacker-
bypass activity vs benign deployment drift.
The pipeline's Stage 6 analytic-join surfaces
FOUR structurally-distinct anomaly signatures
that map ONTO the attacker-bypass catalogue's
4 classes: (i) per-source-IP per-day spike
in
dkim=fail aligned=falseverdict-rows concentrated on adjacent selector-names from a single previously- unseen Source-IP frequently indicates DKIM-replay-attack class bypass per attacker-bypass §6 (matches the dkim_replay_attacks spoke's TTP signature); (ii) per-source-IP per-day spike inspf=pass aligned=falserows concentrated on cousin-domainHeader-From:values frequently indicates COUSIN-DOMAIN-IMPERSONATION class bypass per attacker-bypass §3.3 (matches the T1566.001 spearphishing-attachment ATT&CK TTP); (iii) per-source-IP per-day spike indmarc=fail Disposition=nonerows from sub-organizational-domainHeader-From:values frequently indicates SUBDOMAIN-POLICY-WILDCARD class bypass per attacker-bypass §5.1 (thesp=none-and-p=rejectpublisher-side downgrade); (iv) per-source-IP per-day spike inarc=pass-but-dmarc=failrows from a single receiver frequently indicates ARC-TRUST- CHAIN-FORWARDER-RESIGNING-EXPLOIT class bypass per attacker-bypass §6.1. Read the attacker-bypass spoke when properly- instrumented Stage 7 alert payloads should deep-link into the attacker-bypass spoke's threat-actor-TTP-mapped triage playbook — the catalogue maps each Stage-6-aggregate- verdict-anomaly signature onto a concrete attacker capability (T1078 valid-accounts compromise, T1566.001 spearphishing- attachment, T1556.006 multi-factor- authentication-bypass) so the on-call first-responder routes anomalies into the appropriate incident-response runbook instead of clearing them as benign forwarder-drift. - Email spoofing taxonomy
— the PIPELINE-STAGE-6-AGGREGATE-VERDICT-
AS-PER-SPOOFING-TECHNIQUE-EVIDENCE-CHANNEL
companion to THIS seven-stage DMARC
reporting-pipeline architecture. Where
THIS page documents the Stage 1 IMAP /
Microsoft Graph ingestion through Stage 7
alerting pipeline as the ingestion-and-
analytic substrate, the email-spoofing
spoke documents the SEVEN-TECHNIQUE
spoofing taxonomy whose PER-TECHNIQUE
per-source-IP-and-disposition RUA-row
signature THIS pipeline's Stage 6
analysis-and-join phase materialises as
operator-facing forensic evidence across
FOUR canonical pipeline-output-to-
spoofing-technique attribution mappings:
(i) From: header rewrite spoofing
→
policy_evaluated.dkim=fail+policy_evaluated.spf=fail+disposition=quarantine/rejectRUA row — the canonical signature in Stage 6 output for direct-domain From: header rewrite attempts where the attacker sends from infrastructure with no authentication relationship to the victim's domain; (ii) display- name + look-alike-domain spoofing → no RUA row at all for the victim domain — the canonical signature is the ABSENCE of any RUA evidence in Stage 6 output for the victim, because the message is evaluated against the look-alike or attacker-controlled domain, not the impersonated victim — a Stage-6 diagnostic blind-spot the email- spoofing spoke explicitly catalogues; (iii) compromised-legitimate- sender spoofing →policy_evaluated.dkim=pass+policy_evaluated.spf=pass+disposition=noneRUA row with attacker-source_ip — the canonical signature when an attacker compromises legitimate signing infrastructure: Stage 6 surfaces the attacker-controlled source_ip alongside legitimate sender source_ips in the same per-domain aggregate, with cryptographic-verdict pass-pass camouflage that demands operator-side source_ip-vs-sender-inventory diff analysis to surface; (iv) ARC-trust-forgery spoofing → ARC-awarepolicy_evaluated.dkim=fail+policy_evaluated.local_policy=passoverride row — the canonical signature when a malicious intermediate ARC seal compensates for broken SPF / DKIM under forwarding: Stage 6 surfaces the ARC-trust-induced override that operator-side ARC-trust-list audit discipline must catch. Read the email- spoofing spoke WITH this reporting- pipeline page when conducting Stage 7 alerting-threshold tuning: the seven- technique taxonomy is the canonical operator-facing reference for understanding WHICH RUA-row signatures correspond to WHICH spoofing variants, and which Stage 6 analytics output rows are evidence vs noise vs blind- spot. - Phishing protection (defense-in-depth catalogue)
— the PIPELINE-STAGE-6-AGGREGATE-VERDICT-
AS-PHISHING-DEFENSE-IN-DEPTH-EFFICACY-
FEEDBACK-LOOP companion to THIS seven-stage
DMARC reporting-pipeline architecture. Where
THIS page documents the Stage 1 IMAP /
Microsoft Graph ingestion, Stage 2 format-
detection-and-extraction, Stage 3 RUA XML
parsing, Stage 4 normalisation, Stage 5
deduplication, Stage 6 analysis-and-join-
against-failure-catalogues, and Stage 7
alerting pipeline as the ingestion-and-
analytic substrate, the phishing-protection
spoke documents the LAYERED DEFENSE-IN-
DEPTH CONTROL CATALOGUE the
publisher's security team operates
upstream of the pipeline AND whose
efficacy the pipeline's Stage 6 per-
domain alignment-rate aggregate verdict
measures-of-record. FOUR structurally-
distinct PIPELINE-STAGE-6-VS-PHISHING-
CONTROL operational classes the spoke
catalogues that THIS pipeline reference
intentionally elides: (i) per-
domain DMARC
p=rejectenforcement-tier as authentication-layer phishing-protection control — the publisher-side policy-tier progression fromp=noneobservation throughp=quarantineramp top=rejectenforcement is the SINGLE LOAD-BEARING upstream control whose efficacy this pipeline's Stage 6 per-domain disposition-rate aggregate (per-IPDisposition=rejectcount divided by total per-IP message count) measures as a per-day time-series; (ii) per-message SPF / DKIM authentication-pass-rate at receiver as transport-layer phishing- protection control — the per- receiving-organisation aggregate per- source-IP per-dayspf=pass aligned =trueANDdkim=pass aligned= truerate that this pipeline's Stage 6 per-source-IP-per-day join produces directly measures the upstream SPF-record- publication-and-DKIM-signing-discipline deployment whose absence phishing- attackers exploit via cousin-domain impersonation and look-alike-sender spoofing; (iii) per-message BIMI sender-brand-indicator display eligibility as user-awareness-layer phishing-protection control — the publisher-side BIMI logo display prerequisite REQUIRES per-message DMARC- at-enforce-pass plus per-message cryptographically-verified VMC, so the Stage 6 aggregate verdict's per-domain DMARC-enforce-pass rate gates the user- visible brand-indicator that the receiving organisation's user-awareness training teaches recipients to look for in the inbox; (iv) per-incident phishing- campaign retrospective forensic-evidence chain from Stage 4 normalised verdict rows back to per-receiver original RFC 822 envelope — the incident- response team consults the phishing- protection spoke's defense-in-depth catalogue when constructing the post- incident retrospective that maps each Stage 6 aggregate-verdict-anomaly to the defensive-control-layer (authentication, transport, content-scanning, URL- rewriting, user-awareness) that failed- open during the phishing campaign. Read the phishing-protection spoke alongside this pipeline reference when designing the Stage 7 alert-payload deep-link targets that route per-domain alignment- rate drops into the security team's defense-in-depth-control-tuning workflow, when writing the on-call runbook the DMARC-fail alert-firing operator follows downstream of the pipeline's analytic output, and when constructing the executive-level phishing-protection efficacy dashboard whose canonical KPI is the per-domain Stage 6 alignment-rate time-series this pipeline produces. - Business email compromise (BEC) defence
— the PIPELINE-STAGE-6-AGGREGATE-
VERDICT-AS-BEC-CAMPAIGN-DETECTION-
FEEDBACK-LOOP companion to this
seven-stage aggregate-reporting
pipeline. Where the phishing-
protection spoke documents the
layered-control efficacy
dashboard at the generic-phishing
level, the business-email-
compromise spoke is the
financial-loss-quantified,
human-engineering-amplified,
multi-stage-attack-pattern
companion documenting the FBI
IC3-tracked BEC attack class
whose 2024 reported loss was
$2.9B globally — and whose
per-campaign forensic evidence
THIS pipeline's Stage 6
analysis-and-join phase emits at
FOUR pipeline-stage-vs-BEC-
attack-stage cross-correlation
dimensions: (i) Stage 6
per-domain dkim=none-fail-rate
anomaly aligns with BEC stage-1
exact-domain From-header
impersonation campaign
signatures — the BEC
spoke's stage-1 catalogue
documents the attacker's
characteristic exact-domain
impersonation of the victim
organisation's senior executive
(CEO / CFO / finance lead),
which produces a forged
RFC5322 From: header whose
d= tag the attacker cannot
cryptographically sign; THIS
pipeline's Stage 6 per-domain
DKIM-fail-rate aggregate
verdict surfaces the campaign
as an anomalous spike in
dkim=none rows from previously-
unseen source_ip cohorts
targeting the publisher's
domain — the BEC spoke's
stage-1 catalogue is the
attack-pattern reference that
OPERATIONALLY INTERPRETS the
anomaly THIS pipeline's
aggregation surfaces; (ii)
Stage 6 per-domain
cousin-domain visibility gap
motivates parallel out-of-
band lookalike-domain
monitoring stream alongside
the publisher's RUA URI
— the BEC spoke's stage-2
catalogue documents the
lookalike-domain variant where
the attacker registers
company-llc.cominstead of impersonatingcompany.com; cryptographic alignment passes for the LOOKALIKE (attacker owns the cousin's DKIM private key and DNS), so THIS pipeline NEVER receives a DMARC aggregate row for the cousin campaign (the cousin is a different publisher with a different rua= URI) — the BEC spoke's stage-2 catalogue documents the COMPLEMENTARY out-of-band monitoring stream (per-tenant SaaS-platform lookalike-domain intelligence feeds, new-domain- registration alerts via passive-DNS feeds, SOC-side homoglyph-permutation enumeration) that the BEC defender must run IN PARALLEL to the publisher's RUA URI because THIS pipeline's cryptographic-alignment- verdict scope ends at the publisher's own d= identifier; (iii) Stage 6 per-domain dkim=pass+aligned=true baseline-deviation surfaces BEC stage-3 reply-chain- hijack from a thread-internal compromised account at the publisher's own organisation — the BEC spoke's stage-3 catalogue documents the most sophisticated variant, where the attacker compromises an in-thread participant's mailbox via separate credential-theft attack and pivots at message N+1 to a social-engineering payload; in this variant the per- message DMARC verdict THIS pipeline's Stage 4 parser emits passes correctly at every message (the compromised user IS the legitimate signer), but the Stage 6 PER-USER deviation analysis (atypical-recipient signature, anomalous-send- volume signature, off- business-hours-send signature) surfaces the thread-pivot as a baseline- deviation event the BEC spoke's stage-3 catalogue provides the attack-pattern reference for; (iv) Stage 6 per-domain dkim=pass+aligned=true-from- UNFAMILIAR-source_ip signature surfaces BEC stage-4 post-compromise outbound-spoof from the publisher's OWN infrastructure — the BEC spoke's stage-4 catalogue documents the variant where the attacker has fully compromised a user account at the victim organisation and sends outbound BEC from the victim's OWN cryptographic perimeter under the publisher's own d= identifier with the publisher's own private key — in this case the per-message DMARC verdict THIS pipeline's Stage 4 parser emits passes CORRECTLY, but the Stage 6 per-domain source_ip-cohort analysis surfaces a dkim=pass+aligned=true row from a previously-unseen source_ip (compromised residential ISP IP, adversary-controlled VPS, compromised endpoint residential broadband) as the campaign signature the BEC spoke's stage-4 catalogue provides the attack-pattern reference for. Read the BEC spoke WITH this pipeline- architecture page when authoring the SOC-side analytics rules that consume THIS pipeline's Stage 6 output for an organisation in the FBI IC3 BEC-target categories (manufacturing, legal, finance, real-estate, construction) — the BEC spoke is the financial- loss-quantified, attack- stage-catalogued business-outcome threat-modelling reference, and THIS pipeline- architecture page is the evidence-channel architecture reference cataloguing WHICH stage produces WHICH evidence for WHICH attack stage of the BEC attack chain. - DMARC
Records tag-by-tag - covers the
rua=,ruf=, andfo=tags that drive Stage 1. - DMARC policy modes
— the PIPELINE-STAGE-6-AGGREGATE-
VERDICT-DISPOSITION-ATTRIBUTION-RESOLVES-
TO-PER-TIER-PUBLISHER-CONTRACT companion
to THIS seven-stage DMARC reporting-
pipeline architecture. Where THIS page
documents the Stage 1 IMAP / Microsoft
Graph ingestion, Stage 2 format-
detection-and-extraction, Stage 3 RUA XML
parsing, Stage 4 normalisation, Stage 5
deduplication, Stage 6 analysis-and-
join-against-failure-catalogues, and
Stage 7 alerting as the ingestion-and-
analytic substrate, the DMARC-policy-
modes spoke documents the PER-TIER
DISPOSITION CONTRACT each aggregate-
report row's
dispositionXML element materialises at Stage 4 normalisation: per-tier disposition enumeration (none / quarantine / reject) the publisher'sp=tag contractually entitles each receiver to apply, per-tier RUA-aggregate-report visibility budget the Stage 1-2 ingestion layer fans-out, per-tier Stage 6 verdict- attribution the analytic layer joins each normalised disposition row against, and the canonical p=none → p=quarantine pct=10 → p=quarantine pct=100 → p=reject pct=10 → p=reject pct=100 ramp ladder this pipeline's per-source-IP-per-day Stage 6 time-series witnesses materialise during a publisher's phased rollout. Without the policy-modes spoke a reader knows WHICH stage processes the disposition row, but not WHAT contract the publisher's per-tier p= tag obligates each receiver to apply at the disposition-emission layer — this link closes that contract-resolution gap. Read the policy-modes spoke alongside this pipeline reference when designing the Stage 6 per-domain disposition-rate- per-tier dashboard, when constructing the Stage 7 alert-payload deep-link targets that fire on disposition-tier ramp transitions (p=none → p=quarantine observable in RUA within ~24h), and when writing the on-call runbook the DMARC-rollout-anomaly alert-firing operator follows downstream of the pipeline's per-source-IP-per-day per- tier disposition-rate time-series. - DMARC for transactional email
— the TRANSACTIONAL-EMAIL-WORKLOAD-AS-RUA-
INGESTION-DIVERSITY-DRIVER companion to THIS
DMARC reporting pipeline architecture. Where
THIS page documents the seven-stage end-to-end
pipeline (Stage 1 IMAP / Microsoft Graph
ingestion, Stage 2 format-detection-and-
extraction, Stage 3 RUA XML parsing, Stage 4
normalisation, Stage 5 deduplication, Stage 6
analysis-and-join-against-failure-catalogues,
Stage 7 alerting), the
dmarc_for_transactional_email spoke documents
the TRANSACTIONAL-SENDER-CLASS WORKLOAD
PROFILE that drives the pipeline's per-
source-IP-per-day row fan-out: every
password-reset / order-receipt / invoice /
shipping-notification / account-verification
/ 2FA-code / billing-receipt / appointment-
reminder transactional email message emitted
from SendGrid / Mailgun / Amazon SES /
Postmark / Mailjet / SparkPost / Mandrill /
Resend / Loops / Plunk produces an aggregate-
report row at every receiving organisation
worldwide that the Stage 1 ingestion layer
then absorbs and Stages 2-7 process. Three
structurally-distinct ingestion-diversity
operational classes the spoke covers that
THIS pipeline-architecture reference
intentionally elides: (i) per-ESP
shared-IP-pool per-source-IP cardinality
explosion at Stage 4 normalisation
— transactional ESPs rotate outbound IPs
across customer-tenant boundaries (SendGrid
Marketing's "On-Demand IP" pool, Amazon SES
IP-warmup pools, Mailgun rotating-IP pools)
producing a per-source-IP fan-out at
Stage 4 normalisation that exceeds the
per-source-IP cardinality of provider-side
senders like M365 / Google Workspace by
an order of magnitude; (ii) per-
transactional-class per-RUA-row analysis
cohort segmentation at Stage 6 —
Stage 6 analysis-layer alerting rules must
distinguish transactional-class senders
(password-resets / receipts / 2FA-codes) from
marketing-class senders from system-class
senders because each class has a different
latency-sensitivity SLA, a different DMARC-
pass-rate floor, and a different forward-
through-mailing-list operational tolerance;
(iii) per-transactional-domain
sub-domain-segmentation pattern
— transactional senders typically use a
dedicated sub-domain (
txn.example.com,mail.example.com,notifications.example.com) to isolate transactional reputation from marketing reputation; Stage 6 analysis joins per-sub-domain aggregate counts against the Public Suffix List organisational-domain boundary, producing a per-sub-domain alerting granularity the analysis-layer rule-base must accommodate. Pair this page (the pipeline-architecture reference) with the transactional-email spoke (the per-sender- class workload-profile reference) when designing Stage 4 normalisation rules or Stage 6 analysis-layer alerting thresholds for transactional-class RUA traffic. - DMARC for cPanel
- the CPANEL-TENANT-RUA-INGESTION-
WORKLOAD-PROFILE companion to THIS DMARC
reporting pipeline architecture. Where the
sibling transactional-email and mx-records
entries above document the ESP-class-
ingestion-cardinality profile and the
RUA-mailbox MX-RR-delivery-foundation
respectively, the dedicated cPanel-tenant
spoke documents the STRUCTURALLY-DISTINCT
cPanel-shared-hosting-tenant RUA-ingestion
profile that NEITHER the ESP-cardinality
spoke NOR the MX-RR-delivery-foundation
spoke covers. The four-axis CPANEL-TENANT-
VS-PIPELINE-STAGE-INTERACTION comparison
exposes the structurally-distinct CPANEL-
RUA-COORDINATION roles: (i) cPanel-
tenant uses an EXTERNAL third-party RUA-
mailbox (DMARC Analyzer, dmarcian, Postmark
DMARC Monitoring, Valimail, EasyDMARC) as
the Stage 1 ingestion endpoint because the
shared-hosting tenant does NOT have access
to the WHM-level Exim configuration needed
to provision an in-account RUA mailbox at
Stage 1 ingestion scale - the
cPanel operator's
rua=mailto:URI points at a third-party DMARC-analytics provider's domain, NOT at the cPanel- managed@cpanel-domain; the cPanel deep-dive documents the third- party-RUA-mailbox-as-Stage-1-ingestion- endpoint pattern and the per-third-party- provider RUA-URI authoring discipline; (ii) per-Addon-Domain aggregate-row segregation at Stage 4 normalisation - when a cPanel account hosts N Addon Domains all publishing the SAME third-party RUA-mailbox URI, the Stage 4 normalisation layer receives aggregate rows for ALL N Addon Domains in a single ingestion stream and must distinguish per-Addon-Domain rows by the<header_from>field rather than by ingestion-stream identity - the multi-Addon-Domain cPanel cohabitation produces a single-tenant ingestion stream with multi-organisational-domain aggregate rows the operator must scope per-domain at consumption time; the cPanel deep- dive documents the per-Addon-Domain Stage-4-normalisation segregation discipline; (iii) shared-egress-IP single-source-IP RUA-row profile at Stage 6 analysis-and-join - because all N cohabiting cPanel Addon Domains egress from the SAME WHM-managed shared-Exim host IP, the Stage 6 per-source_ip aggregation produces a single dominant source_ip row per Addon Domain (the shared-host's IP) rather than the ESP-cardinality-explosion profile the sibling transactional-email entry above documents - the cPanel-tenant aggregate report consumption profile is structurally LOW-CARDINALITY per-source_ip rather than the high-cardinality ESP profile, making per-source_ip threshold-based alerting in Stage 7 easier to author but third-party- sender envelope-MAIL-FROM-vs-Header-From misalignment harder to attribute because all third-party-vendor-via-cPanel-relay outbound mail shares the same source_ip with cPanel-Exim-direct mail; the cPanel deep-dive documents the shared- egress-IP RUA-row profile and its Stage 6 per-source_ip aggregation consequences; and (iv) cPanel-operator Stage-7 alerting consumption ceiling - cPanel- tenant operators typically consume the third-party DMARC-analytics provider's UI dashboard for Stage-7 alerting rather than integrating Stage 7 alerts into Slack / PagerDuty / OpsGenie / on-call rotation infrastructure because the cPanel-tenant SMB does NOT have a dedicated SRE / SecOps function - the cPanel deep-dive documents the Stage-7-alerting-consumption ceiling and the per-cPanel-tenant operator- review cadence (typically weekly review of the third-party DMARC-analytics dashboard rather than real-time alert response) the Stage 7 alerting layer's per-tenant SLA- floor must accommodate. Read the dedicated cPanel spoke when scoping the RUA-ingestion pipeline for a cPanel-hosted SMB tenant - the spoke is the authoritative per- cPanel-account ingestion-workload-profile reference whose four cPanel-tenant-specific Stage-1-to-Stage-7 coordination boundaries this seven-stage pipeline page is the ingestion-architecture companion for. - MX records explained — the RUA-mailbox MX RR that governs whether DMARC aggregate-report deliveries actually arrive at the Stage 1 ingestion endpoint
— the RUA-MAILBOX-MX-DELIVERY-FOUNDATION
companion to THIS DMARC reporting pipeline.
Where THIS page documents the seven-stage
end-to-end pipeline from receiver-side
aggregation through XML-gzip-MIME packaging
through SMTP transport through your RUA=
mailbox through Stage 1 ingestion through
Stages 2-7 parsing / normalisation /
analysis, the MX-records spoke documents
the DNS-RR-MECHANICS-LAYER foundation the
ENTIRE pipeline depends on at the
SMTP-transport hop: the RUA= URI's
mailbox-domain MX RR is what the
sending receiver's MTA resolves to
determine WHERE on the public Internet to
attempt the aggregate-report delivery. A
missing, mis-prioritised, or NXDOMAIN
MX RR on the RUA= mailbox domain causes
Stage 1 ingestion to silently receive
ZERO reports despite the operator's
confidence that the
rua=mailto:dmarc@example.comtag is correctly published. Covers thedig MXdiagnostic workflow for verifying RUA-mailbox MX publication, the per-MX preference-value semantics, the0 ."null MX" RFC 7505 anti-pattern that silently kills aggregate-report delivery, and the RFC 1035 §3.3.9 MX wire format. Read the MX-records spoke alongside this pipeline page when Stage 1 ingestion shows ZERO inbound reports despite a correctly-published DMARC TXT record and the operator must verify the RUA-mailbox MX delivery path. - MTA-STS policy-file byte syntax (RFC 8461 §3.2 policy-file grammar)
— the DMARC-RUA-PIPELINE-RECEIVES-TRANSPORT-FAILURE-CORRELATIONAL-EVIDENCE-FROM-RECEIVERS-WHOSE-MTA-STS-POLICY-FETCH-FAILED-AT-INBOUND-SMTP-BOUNDARY
companion documenting the per-field byte-level
grammar (
version: STSv1/mode: enforce|testing|none/mx: <hostname>/max_age: <seconds>) of the MTA-STS policy file whose publication-byte-correctness directly affects the per-receiver authentication-result records that populate the DMARC RUA aggregate XML this page's ingestion pipeline processes, across FOUR DMARC-RUA-pipeline MTA-STS-policy byte-correlation dimensions: (1) RUA record-rowrow/source_ip+auth_results/dkim+spf/resultcorrelation with publisher-side MTA-STS policy-fetch failure rate — when the publisher domain's MTA-STS policy file has byte-syntax errors (malformedmx:-list, CRLF line endings, missingversion: STSv1prefix), receivers fall back to opportunistic-TLS and a portion of inbound traffic delivers over cleartext; the RUA aggregate row's per-source-IP rates over the 24-hour window correlate (negatively) with the operator's MTA-STS-policy-fetch success rate at the receiver; (2) per-RUA-window DMARC-pass-rate divergence between MTA-STS-enforced and opportunistic-TLS receiver populations as policy-file byte-correctness verification signal — when the operator publishes a correctmode: enforcepolicy-file (correctmx:-list +max_age:+ line-endings), the per-RUA-window DMARC-pass-rate from MTA-STS-supporting receivers (Gmail / Yahoo / Microsoft) should match non-MTA-STS-supporting receivers; any receiver-class divergence in the RUA XML aggregate is a leading indicator of policy-file byte-misconfiguration AT THE PUBLISHER; (3) RUApolicy_evaluated/policybyte-token consistency under MTA-STS policy-filemode:ramp transitions — when the publisher transitions themode:-field byte-token fromtestingtoenforcein the MTA-STS policy file, the DMARCpolicy_evaluated/policyXML byte-output at receivers SHOULD remain consistent with thepolicy_published/pfield per RFC 7489 §7.2.1.4 — divergence is a leading indicator of receiver-side MTA-STS-policy-fetch parse failure that affected DMARC verdict-classification; (4) RUA-pipeline Stage 1 SPF-aligned / DKIM-aligned per-source-IP rate consumer of MTA-STS policy-fileid=-tag-rotation cadence on the sibling_mta-sts.<domain>TXT-record — when the operator rotates the MTA-STS policy by bumping theid=-tag byte-token on the_mta-sts.<domain>TXT-record, receivers fetch the new policy file; the RUA pipeline's Stage 1 ingestion pattern (per-source-IP aligned-pass-rate per-RUA-window after the rotation timestamp) is the load-bearing correctness signal for verifying the new policy-file byte-content actually propagated to receivers. Byte-syntax correctness of the MTA-STS policy file across these four dimensions is the load-bearing publisher-side prerequisite for the cross-protocol application-layer (DMARC) + transport-layer (MTA-STS) correlational analytics the RUA-pipeline this page documents enables at the per-receiver per-RUA-window granularity. - TLS-RPT
report format (RFC 8460 §4 JSON schema deep dive)
- the cross-protocol-cluster sibling
of the DMARC RUA pipeline documented
on THIS page. Where the DMARC
reporting pipeline is the
XML-gzip-MIME-SMTP-receiver-side
ingestion path for the
AUTHENTICATION-LAYER feedback
(RFC 7489 §7.2 aggregate-report XML),
the TLS-RPT report-format spoke
documents the parallel
JSON-gzip-MIME-SMTP-or-HTTPS
ingestion path for the
TRANSPORT-LAYER feedback
(RFC 8460 §4 JSON schema). The two
pipelines share five of six Stage
primitives - DNS resolution of the
reporter destination
(
rua=for DMARC,_smtp._tls.<domain> rua=for TLS-RPT), MIME-attached SMTP delivery to the operator's inbox (DMARC) or HTTPS POST upload (TLS-RPT optional channel), gzip-or-zip decompression of the attached payload, schema-validation against the canonical RFC schema, row-by-row ingestion into the analyzer's per-record table. The delta: Stage 4 schema-validation uses RFC 7489 Appendix C XSD for DMARC vs RFC 8460 §4.4 JSON Schema for TLS-RPT; Stage 5's per-record decomposition reads<source_ip>from DMARC XML vssending-mta-ipfrom TLS-RPT JSON. Operators running BOTH report streams typically extend the DMARC ingestion pipeline to also handle TLS-RPT, reusing the MIME-decompression-validation Stages 2-4 verbatim and parameterising Stage 5 onapplication/tlsrpt+gzipvsapplication/zip/application/gzipContent-Type. - Email security & privacy glossary
— the PIPELINE-STAGE-2-VS-PII-EXPOSURE-
LAWFUL-PROCESSING-VOCABULARY companion to
this six-stage RUA / RUF ingestion pipeline
reference. Where THIS page documents the
end-to-end RUA / RUF infrastructure path
(Stage 1 receiver-side report generation,
Stage 2 publisher-side
rua=/ruf=tag addressing, Stage 3 mailbox-side IMAP / Microsoft Graph ingestion viaImapFetcher+GraphFetcher, Stage 4 parser- sideDmarcParser/ForensicReportParserXML + MIME decompression-and-decode, Stage 5 dashboard delivery with per-source-IP attribution + per-domain alignment-rate aggregation, Stage 6 anomaly detection + on-call alert routing), the email-security- glossary spoke is the SINGLE-SENTENCE TERM-OF-ART DEFINITION CATALOGUE for the security-and-privacy vocabulary every stage of this pipeline either implements, defends against, or surfaces as a per- report evidence row the operator's downstream incident-response workflow consumes. Four structurally-distinct PIPELINE-STAGE-VS-SECURITY-GLOSSARY- VOCABULARY operational classes the spoke covers that THIS pipeline reference intentionally elides: (i) Stage 2-3 RUF-channel PII / GDPR vocabulary → glossary single-sentence definition resolution — the publisher-sideruf=mailto:publication decision documented in Stage 2 plus the Stage 3 mailbox-side ForensicReportParser ingestion path that processes embedded- body PII resolves to the glossary's single-sentence PII, GDPR data-subject-rights, lawful-processing-basis, data-minimisation, purpose-limitation, storage-limitation, processor-relationship (GDPR Art 28), and controller-controller joint-controllership (GDPR Art 26) term-of-art definitions — the GDPR analysis the operator MUST complete BEFORE publishing aruf=tag, and the privacy-by-design alternative (aggregate-only RUA consumption with no RUF tag published) the glossary's data-minimisation definition implies; (ii) Stage 4 attribution-vocabulary → glossary single-sentence definition resolution — the parser-side DmarcParser per-row decode that produces the source_ip, identifier-alignment, SPF result, DKIM result, DMARC verdict, policy_evaluated.dkim/spf, and auth_results/dkim/d= evidence rows resolves to the glossary's single-sentence definitions of those vocabulary terms — pairing the pipeline-stage-4 byte-level decode this page documents with the operator-side incident-response- playbook vocabulary the glossary defines; (iii) Stage 6 anomaly-detection vocabulary → glossary threat-class single-sentence definition resolution — the Stage 6 anomaly-detection + alert- routing workflow this page documents resolves to the glossary's single- sentence threat-vocabulary entries (direct-domain spoofing, display-name spoofing, lookalike-domain attacks, Punycode / IDN homograph, Reply-To injection, envelope-MAIL-FROM forgery, Received-chain tampering, BEC / CEO-fraud variants, brand impersonation, spear-phishing) — pairing the pipeline's anomaly-alert telemetry with the threat-class single-sentence catalogue the operator's incident- response triage workflow needs; (iv) cross-tenant RUA / RUF delegation vocabulary → glossary external-domain-delegation single- sentence definition resolution — the Stage 2 publisher-siderua=/ruf=mailto:external- domain delegation per RFC 7489 §7.1 (the cross-domain_report._dmarcauthorization record) resolves to the glossary's single-sentence external-domain delegation, cross-tenant authorisation, RUA recipient delegation, and processor-of-record threat-and-compliance vocabulary entries — pairing the pipeline-stage- 2 publisher-side discipline this page documents with the cross-tenant compliance / lawful-processing vocabulary the glossary defines. Required reading once an operator deploying RUA / RUF ingestion per THIS pipeline reference needs to translate the per-stage technical narrative into the security-and- privacy term-of-art vocabulary the glossary defines for incident- response playbook authoring, GDPR Article 30 record-of-processing composition, cross-team security communication, and external auditor compliance-evidence narrative. - Email Authentication Glossary - definitions for every term used in the pipeline.
- Email deliverability
- the SIX-STAGE-PIPELINE-AS-DELIVERABILITY-
OBSERVABILITY-FOUNDATION companion to THIS
rua-ingestion pipeline reference. Where THIS
page documents the canonical six-stage rua-
report ingestion pipeline (per-receiver report
generation → SMTP delivery to rua-mailbox →
IMAP / Graph mailbox fetch → ZIP / GZ
decompression → XML schema validation → per-
record per-source-IP per-disposition row
ingestion into the analyzer's data model)
as the OPERATOR-SIDE EVIDENCE-INGESTION-
PIPELINE, the deliverability spoke documents
the BUSINESS-OUTCOME contract (legitimate
messages reach the recipient's primary inbox
rather than the spam folder or the
receiver-side reject pile) whose evidence-
based root-cause attribution depends on the
pipeline's per-stage data integrity. Four
PIPELINE-STAGE-VS-DELIVERABILITY-OUTCOME
axes the deliverability spoke documents that
THIS page is the evidence-ingestion
foundation for: (1) per-source-IP
reputation segmentation — the
deliverability spoke's "per-source-IP
reputation distribution at Microsoft / Gmail
/ Yahoo" remediation depends on the per-
record
<source_ip>element this pipeline ingests at stage 6 to partition the sender population by sending IP and attribute deliverability degradation to specific IPs (shared-tenant cPanel / ESP-pool drift / IPv6 vs IPv4 reputation divergence); (2) per-receiver rua-delivery-coverage diagnosis — the deliverability spoke's "no rua reports from Microsoft / Gmail" coverage-gap symptom traces the per-stage failure (stage 1 receiver-side rua-generation opt-out / stage 2 SMTP-delivery failure / stage 3 IMAP-fetch authentication failure) through this pipeline's per-stage failure mode catalogue to attribute the coverage- gap root cause; (3) per-disposition legitimate-message-loss diagnosis — the deliverability spoke's "legitimate- message-in-spam-folder" complaint traces the per-record<policy_evaluated>dispositionsub-element this pipeline ingests at stage 6 to attribute the per-receiver quarantine-decision- root-cause; (4) per-reporter SLO- timeliness diagnosis — the deliverability spoke's "rua data lags 72-hours behind real-time delivery" symptom traces the per-receiver<report_metadata><date_range>element this pipeline ingests at stage 6 to attribute the per-reporter SLO timing drift (Microsoft 24h batch / Gmail 7-day-historical-batch / Yahoo per-day batch). Read THIS page to UNDERSTAND the rua-ingestion pipeline; read the deliverability spoke to UNDERSTAND how per-stage rua-stream evidence drives the per-receiver inbox-placement remediation decisions the rua data this pipeline ingests makes evidence-based. - DMARC policy rollout
— the SEVEN-STAGE-PIPELINE-AS-PER-RAMP-
STAGE-EVIDENCE-FEEDBACK-INSTRUMENTATION
companion to this DMARC reporting-
pipeline reference. Where THIS page
documents the seven-stage rua-stream
ingestion architecture (Stage 1 receive
/ Stage 2 IMAP+Graph ingest / Stage 3
XML decode / Stage 4 ForensicReportParser
embedded-body handling / Stage 5
normalisation+upsert / Stage 6 analysis-
and-join aggregate verdict / Stage 7
operator-facing surfacing+alerting), the
DMARC policy rollout spoke is the per-
ramp-stage publisher-side OPERATOR-
FACING COMMITMENT-CURVE whose per-stage
decision-gates consume the per-stage
rua-stream evidence THIS pipeline
emits. The four-axis SEVEN-STAGE-
PIPELINE-VS-PER-RAMP-STAGE-RAMP-GATE
comparison exposes the structurally-
distinct per-pipeline-stage-vs-per-
ramp-stage feedback-loop dimensions:
(i) per-publisher per-ramp-
stage
p=nonemonitoring- stage commitment publishes the rua= TXT-RR address that THIS pipeline's Stage 1 receive boundary consumes — making the DMARC policy-rollout spoke's monitoring-stage publisher- side rua= TXT-RR publication commitment the PUBLISHER-SIDE ACTIVATION TRIGGER for this pipeline's Stage 1 receive boundary to start emitting per-source-IP evidence into Stage 2 and beyond — the DMARC policy rollout spoke documents the per- publisherp=nonemonitoring-stage commitment that every Stage 1 ingestion endpoint this pipeline documents structurally depends on as the operator-side- activation publisher-side prerequisite; (ii) per- publisher per-ramp-stagep=quarantine pct=<n>partial-enforcement ramp gate consumes THIS pipeline's Stage 6 per-domain per-source-IP per- disposition aggregate-verdict evidence as the OPERATOR-FACING RAMP-CHECKPOINT — the publisher's decision to advance frompct=10→pct=25→pct=50→pct=100at every ramp-gate decision is gated on Stage 6 evidence showing legitimate per-source-IPdmarc=pass-rate convergence and Stage 7 operator-side alerting NOT firing — the DMARC policy rollout spoke documents the per-stagepct=-ramp-gate decision-discipline that EACH ramp-stage publisher-side commitment depends on the per- stage Stage 6 + Stage 7 evidence THIS pipeline produces; (iii) per-publisher per-ramp- stagesp=-tag subdomain-coordination commitment consumes the per- subdomain per-source-IP aggregate-verdict evidence THIS pipeline's Stage 6 emits keyed by the per-message<header_from>XML element — making the per- subdomain<header_from>decode at Stage 3 the OPERATOR-FACING DIAGNOSTIC SURFACE every per- subdomainsp=-tag rollout- coordination decision depends on — the DMARC policy rollout spoke documents the per-subdomainsp=-tag rollout-coordination discipline that consumes the per-subdomain evidence THIS pipeline's Stage 3 + Stage 6 emits keyed by the per-message<header_from>decode; and (iv) per- publisherp=rejectfull- enforcement-stage commitment consumes THIS pipeline's Stage 6 + Stage 7 operator-facing evidence as the LAST-MILE LEGITIMATE-MAIL-LOSS-RISK DIAGNOSTIC SURFACE — the publisher's decision to flip fromp=quarantine pct=100top=rejectat the terminal ramp-stage gate depends on Stage 6 evidence showing the per-source-IPdmarc=pass-rate convergence thep=rejectcommitment will not destructively impact — the DMARC policy rollout spoke documents the terminal-stagep=rejectcommitment-decision discipline that consumes THIS pipeline's Stage 6 + Stage 7 evidence as the LAST-MILE OPERATOR-SIDE DECISION SURFACE. Read the DMARC policy rollout spoke WITH this pipeline reference when DESIGNING the per-stage publisher-side commitment- curve (read THIS pipeline page to UNDERSTAND the evidence-emission architecture the rollout decisions consume), and read THIS pipeline reference WITH the DMARC policy rollout spoke when DIAGNOSING a per-stage ramp-checkpoint failure (correlate the per-stage Stage 6 evidence with the per-ramp-stage commitment the operator is about to advance through). - DMARC multi-domain strategy
— the PER-ORG-DOMAIN-EVIDENCE-
EMISSION-INSTRUMENTATION companion to
this pipeline reference. Where THIS
page documents the SINGLE-org-domain
seven-stage evidence-emission pipeline
(publisher publishes RUA at Stage 1,
receiver emits per-row XML at Stage 2,
DmarcParser decodes at Stage 3,
DmarcStorage persists at Stage 4,
DashboardCache aggregates at Stage 5,
UI surfaces at Stage 6, Alerting fires
at Stage 7), the multi-domain-strategy
spoke is the PER-ORG-DOMAIN
COORDINATION REFERENCE documenting
how the same seven-stage pipeline
multiplies across every distinct
Friendly-From-header org-domain a
multi-brand publisher emits under.
Concretely the spoke documents FOUR
per-RUA-aggregate-stream vs per-org-
domain-publication-discipline
dimensions: (i) Stage 1
publisher-side
rua=mailto:TXT-RR publication discipline runs PER-ORG-DOMAIN at every apex_dmarc.<org-domain>TXT-RR — every distinct Friendly-From-header organisational domain the multi-brand publisher emits under requires its OWN per-org- domain Stage 1 RUA-publication commitment, and per-receiver per-org- domain cross-domain authorisation TXT- RR at<org-domain>._report._dmarc.<recipient-domain>per RFC 7489 §7.1 must be published per-org-domain — the multi-domain- strategy spoke documents the per-org- domain Stage 1 publication-discipline coordination the multi-brand publisher must apply; (ii) Stage 2 receiver-side per-row XML emission is keyed by per-<header_from>-org- domain attribution and split into per-org-domain RUA streams — receivers emit one RUA per-org- domain per-receiver per-day, so the multi-brand publisher receives N parallel per-org-domain RUA streams each consumed independently by the Stage 3 DmarcParser ingestion path, and the per-org-domain Stage 3 parse- success rate is per-org-domain evidence the multi-domain-strategy spoke documents as the multi-brand publisher's pipeline-health KPI across every Friendly-From-header org-domain; (iii) Stage 6 UI- layer aggregate per-domain breakdown decomposes the per-org-domain aggregate evidence into per-source-IP per-disposition diagnostic surface the multi-brand publisher consults per-org-domain INDEPENDENTLY — the per-org-domain Stage 6 evidence convergence rate gates the per-org-domain phased-enforcement ramp-stage commitment-curve advancement INDEPENDENTLY per-org- domain, and the multi-domain-strategy spoke documents the per-org-domain ramp-stage independence contract a multi-brand publisher must apply because per-org-domain legitimate- sender inventory closure runs at per-org-domain pace; and (iv) per-subdomain Stage 2<header_from>attribution within each per-org- domain RUA stream feeds the per-org- domainsp=-tag publication-discipline decision — per-subdomain RUA evidence within the per-org-domain stream surfaces per-subdomain authentication coverage gaps the per-org-domain apexsp=-tag publication decision must close, and the multi- domain-strategy spoke documents the per-subdomain inheritance vs override coordination the multi- brand publisher must coordinate across every operator-published org-domain. Read the multi-domain- strategy spoke ALONGSIDE this pipeline reference when authoring the multi-brand publisher's per-org- domain coordination playbook — the spoke documents how this seven-stage evidence-emission instrumentation feeds the per-org-domain coordination decisions every multi- brand publisher must sequence. - BIMI explained
- the BIMI-DISPLAY-ELIGIBILITY-GATE-AS-
DOWNSTREAM-CONSUMER-OF-DMARC-REPORTING-
PIPELINE-PASS-RATE-TELEMETRY companion to
this seven-stage DMARC reporting pipeline
reference. Where THIS page architectures
the seven-stage telemetry-emission
pipeline (report-generator at the
receiver, rua/ruf scheduling, transport,
ingestion, parsing, aggregation,
dashboard surfacing), the BIMI-explained
spoke documents the BIMI-supporting
mailbox-provider 90-day rolling DMARC
pass-rate gate as the LOAD-BEARING
downstream consumer of the per-rua
aggregate-report telemetry this pipeline
produces. Concretely, the spoke
documents FOUR per-rua-pass-rate-gate-
consumer dimensions for the brand
publisher tracking BIMI eligibility:
(i) the per-receiver 90-day
rolling pass-rate computation as the
BIMI-display-eligibility primary
gate — the spoke documents how
Gmail, Yahoo, and Apple Mail compute
per-org-domain rolling DMARC pass-rate
from their OWN inbound traffic
(independent of the rua-aggregate-
report telemetry surfaced in publisher
dashboards) but the publisher's only
VISIBILITY into this per-receiver gate
is via the rua-aggregate-report
pipeline this page documents — making
the seven-stage pipeline the publisher-
side BIMI-eligibility EARLY-WARNING
surface; (ii) the per-receiver
rua-aggregate-report
policy_evaluated.dkim/spfverdict ratio as the publisher's BIMI- gate-proxy signal — the spoke documents how the publisher's BIMI readiness dashboard MUST consume the per-receiver pass-rate ratio computed from the parsed rua aggregate reports this pipeline's stage-5 (parsing) and stage-6 (aggregation) emit, because the receiver-side BIMI gate is not externally observable except via this publisher-side telemetry proxy; (iii) the per-rua-report sub-org- domain pass-rate decomposition as the per-subdomain BIMI-publication decision dimension — the spoke documents how the per-rua aggregate-report sub-org-domain decomposition this pipeline's stage-6 produces feeds the publisher's per- subdomain BIMI-publication decision (whether to publishdefault._bimi.marketing. <org>independently of the parent-domain BIMI publication) because the marketing sub-org- domain's pass-rate may diverge significantly from the parent org-domain's; and (iv) the per-rua-report BIMI-publication- regression early-warning signal as the SOC-dashboard subscriber dimension — the spoke documents how the rua-aggregate- report pipeline this page documents becomes the LEADING-INDICATOR telemetry for the BIMI-display- regression early-warning class (per-receiver pass-rate falling below the 90-day rolling threshold) WELL BEFORE the receiver-side BIMI gate suppresses the brand logo at end- user inboxes. Read the BIMI-explained spoke alongside this DMARC reporting pipeline reference when the brand- protection programme's BIMI-display eligibility is a load-bearing downstream consumer of the per-rua aggregate-report telemetry this pipeline architectures. - TLS-RPT explained
— the TLS-RPT-RFC-8460-JSON-FAILURE-
REPORT-STREAM-AS-LOAD-BEARING-TRANSPORT-
LAYER-TELEMETRY-PIPELINE-COMPLEMENT-TO-
DMARC-RUA-AGGREGATE-XML-EVIDENCE-STREAM
companion to this DMARC reporting
pipeline reference. Where THIS page
documents the receiver-side telemetry
infrastructure that emits, ingests, and
materialises the per-publisher per-day
DMARC
rua=aggregate-XML evidence stream into a normalised per-source-IP × per-d=-domain × per- receiver-coverage decomposition, the TLS-RPT-explained spoke is the per- publisher RFC 8460 SMTP TLS Reporting operational reference whose four CROSS-LAYER-RECEIVER-SIDE-TELEMETRY- PIPELINE dimensions parallel and complement the DMARC reporting pipeline this page documents: (i) per-publisher per-domain TLS- RPT TXT-record publication discipline parallel to DMARCrua=publication — the publisher's per-domain_smtp._tls.<d> IN TXT "v=TLSRPTv1; rua=mailto:tlsrpt@<d>"publication is the transport-layer receiver-side-telemetry-channel- publication primitive parallel to the per-domain_dmarc.<d> IN TXT "v=DMARC1; ... rua=mailto:..."message-layer telemetry channel THIS page documents; both are receiver- side opt-in telemetry endpoints the publisher elects to advertise via DNS TXT publication, and both depend on the per-publisher per-domain RUA ingestion endpoint operating an MX-RR- set + SPF + DKIM + DMARC self-aligned publication discipline to receive the per-receiver telemetry traffic; (ii) TLS-RPT-collector JSON ingestion pipeline parallel to rua-XML ingestion pipeline — the per-publisher TLS-RPT collector consumes per-receiver-day JSON-formatted TLS-failure reports (one report per receiver per day per failing recipient-MX) via the samemailto:SMTP transport and per-receiver per-day batching cadence as the rua-XML stream THIS page documents at Stage 1; the TLS- RPT-explained spoke documents the per-publisher pipeline (TLS-RPT endpoint → JSON parse → per-failure- class normalisation → per-receiver per-MX attribution) whose per-stage infrastructure parallels the rua-XML pipeline stages 1-6 THIS page catalogues; (iii) per- failure-class TLS-RPT report attribution parallel to per-failure- row rua attribution — the per-receiver TLS-RPT JSON report decomposes into per-failure-class rows (starttls-not-supported, certificate-host-mismatch, certificate-expired, certificate- not-trusted, validation-failure, sts-policy-fetch-error, sts-policy- invalid, sts-webpki-invalid, tlsa-invalid, dnssec-invalid, dane-required, etc.) whose per-failing-MX-host attribution is the transport-layer counterpart to the rua-XML per-failing-source-IP attribution THIS page documents at Stage 3; the TLS-RPT-explained spoke documents the per-failure- class taxonomy the publisher's TLS-RPT collector materialises into the per-recipient-MX per-day operational-signal stream parallel to the rua-XML per-source- IP per-day operational-signal stream THIS page architectures; and (iv) TLS-RPT-failure-rate as operational signal complementing DMARC-pass-rate — the per- publisher per-domain TLS-RPT failure-rate (rate of TLS-failed SMTP connection attempts per recipient-MX per day) is the transport-layer per-publisher operational-health signal complementing the message-layer DMARC-pass-rate the per-rua aggregate stream produces; both per-publisher rates must remain within tolerance before any publisher-sidep=reject+ MTA-STSmode:enforce+ DANE TLSA-RR enforcement rollout can safely advance — a degraded TLS-RPT-failure-rate without per-failure-class root-cause explanation structurally blocks per-publisher MTA-STS / DANE enforcement-discipline advancement the same way a degraded DMARC- pass-rate THIS page documents structurally blocksp=quarantine→p=rejectramp advancement. Read the TLS-RPT- explained spoke alongside this DMARC reporting pipeline reference when scoping the per-publisher cross-layer receiver-side telemetry stack — the per-publisher TLS-RPT JSON-failure-report stream is the transport-layer telemetry pipeline whose RFC 8460 publication + ingestion + attribution discipline is the load-bearing complement to the message-layer DMARC rua-XML evidence pipeline THIS page architectures. - SPF mechanisms explained
— the SPF-MECHANISM-EVALUATION-
OUTCOME-AS-LOAD-BEARING-PER-SOURCE-
IP-AUTH-RESULT-INPUT-TO-RUA-
AGGREGATE-XML-PIPELINE companion to
this DMARC reporting pipeline
reference. Where THIS page documents
the receiver-side rua-aggregate-XML
evidence pipeline that emits,
ingests, and materialises per-source-
IP × per-d=-domain authentication-
result evidence into a normalised
per-publisher operational signal,
the SPF-mechanisms-explained spoke
is the RFC 7208 §5 per-mechanism
operational reference whose four
PER-MECHANISM-PER-SOURCE-IP-RUA-
EVIDENCE dimensions catalogue the
per-mechanism input the pipeline
consumes: (i) per-source-IP
include:cascade evaluation evidence in rua-XML capture — when a per- publisher SPF record usesinclude:<ESP>to delegate authorisation to a per- ESP-published cascade, the per- receiver SPF evaluator walks the cascade and produces a per-source- IPspf=passverdict only when the per-source-IP matches a mechanism in the recursive resolution; the rua-XML<auth_results><spf><result> pass</result></spf>capture this pipeline materialises at Stage 3 documents the per- include-resolved authorisation outcome the SPF-mechanisms- explained spoke documents the protocol mechanics of; (ii) per-source-IPip4:/ip6:explicit-CIDR-match rua-row attribution — when a per- publisher SPF record usesip4:<cidr>orip6:<cidr>explicit-CIDR mechanisms (cost zero DNS lookups), the per- receiver SPF evaluator performs per-source-IP CIDR-block matching and emits a per-source-IPspf=passverdict in the rua-row; the SPF-mechanisms- explained spoke documents the per-CIDR matching semantics (RFC 7208 §5.6 evaluation algorithm) every per-source-IP rua-row'sspf=passcapture this pipeline ingests depends on, AND the per-CIDR publication-discipline (the publisher's flattened SPF publication is what produced the per-source-IP pass evidence the pipeline materialises); (iii) per-source-IPa:/mx:mechanism expansion rua- evidence — when a per- publisher SPF record usesaormxmechanisms (each cost 1 DNS lookup + per-target A/AAAA expansion budget), the per- receiver SPF evaluator resolves the per-domain apex A/AAAA RR- set (fora) or the per-domain MX RR-set + per-MX- target A/AAAA RR-set (formx) and matches per-source-IP against the resolved per-mechanism IP set; the SPF-mechanisms-explained spoke documents the per-a/ per-mxexpansion semantics that produced the per-source-IP rua-row attribution this pipeline materialises; and (iv) per-source-IP-all/~all/?allfinal- mechanism rua-result distribution — the per-publisher SPF record's trailing qualifier produces the per-receiver SPF evaluator's per-source-IPspf=fail(with-all),spf=softfail(with~all), orspf=neutral(with?all/ implicit) on per-source-IPs that did not match any prior mechanism; the per- source-IP per-qualifier rua-row distribution this pipeline materialises at Stage 3 is the load-bearing per-publisher SPF-publication-commitment evidence the SPF-mechanisms- explained spoke documents the per-qualifier semantics of — a per-publisher per-source-IP rua-row showingspf=faildistribution suggests the per- publisher SPF publication- commitment is producing dispositive per-source-IP rejection evidence the rua- stream materialises into per- source-IP operational signal. Read the SPF-mechanisms- explained spoke alongside this DMARC reporting pipeline reference when interpreting the per-source-IP<auth_results><spf>rua-row capture this pipeline materialises — the per- publisher per-mechanism publication topology is the load-bearing per-source-IP authentication-result input the receiver-side rua- aggregate-XML evidence pipeline THIS page architectures consumes for every per-source-IP operational signal it produces. - DMARC for Office 365 Hybrid
— the dual-mail-flow-per-tenant rua-
evidence-correlation-input companion
to this DMARC reporting-pipeline
reference. Where THIS page documents
the receiver-side per-tenant rua-
aggregate-XML evidence pipeline (the
per-receiver per-day per-publisher
aggregate-report generation, the IMAP/
Graph mailbox-ingestion paths into the
DMARC Analyzer
includes/DmarcParser.phppipeline, the per-row per-source-IP per-disposition aggregate-XML evidence materialisation), the Office-365- hybrid spoke documents the per-tenant DUAL-MAIL-FLOW-AS-DUAL-SOURCE-IP- TOPOLOGY deployment shape that STRUCTURALLY DOUBLES the per-tenant rua-evidence-correlation surface this reporting-pipeline page consumes. The per-Office-365-hybrid-tenant per- mailbox-routing decision produces TWO independent source-IP topologies the receiver-side aggregate-XML evidence pipeline must correlate per-row: (i) per-tenant Exchange-Online outbound source-IPs published viainclude:spf.protection.outlook.comappear in rua-aggregate rows with Microsoft cloud-leg source-IPs; (ii) per-tenant on-prem-Exchange outbound source-IPs (published via per-tenant IP literals ormxmechanism) appear in rua-aggregate rows with tenant-on-prem source-IPs; (iii) the per-tenant aggregate-XML evidence pipeline must correlate the per-row per-source-IP disposition verdict against the per-tenant cloud-vs-on-prem mail-flow leg the message traversed, which the<auth_results><dkim><selector>per-row capture distinguishes (selector1._domainkeyfor Exchange-Online-signed mail, per-tenant on-prem selectors for on-prem-Exchange-signed mail); (iv) per-tenant policy-rollout decisions across thep=none→p=quarantine→p=rejectspectrum must be sequenced against the slower of the per-tenant cloud-leg evidence coverage AND the per-tenant on-prem- leg evidence coverage that this reporting-pipeline page's rua- evidence-correlation surface materialises. Read the Office-365- hybrid spoke alongside this reporting- pipeline reference whenever per-tenant rua-aggregate-XML evidence shows TWO distinct per-tenant source-IP topologies in the per-row capture — the per-tenant hybrid mail-flow shape the Office-365-hybrid spoke documents is the structural reason for the per-row dual-source-IP evidence signature this reporting-pipeline page's per-tenant evidence- correlation surface produces. - DMARC for SaaS senders
— the per-SaaS-customer multi-tenant
rua-aggregate-evidence-correlation-
input companion to this DMARC
reporting-pipeline reference. Where
THIS page documents the receiver-side
per-tenant rua-aggregate-XML evidence
pipeline (the per-receiver per-day
per-publisher aggregate-report
generation, the IMAP/Graph mailbox-
ingestion paths into the DMARC
Analyzer
includes/DmarcParser.phppipeline, the per-row per-source-IP per-disposition aggregate-XML evidence materialisation), the SaaS-senders spoke documents the structurally- distinct PER-SAAS-PROVIDER-AS-MULTI- TENANT-PUBLISHER deployment shape in which a single SaaS provider's egress IP-pool sends mail on behalf of thousands of customer domains, each publishing its own per-customer_dmarcrecord with its own per-customerrua=mailbox — so the per-SaaS-provider per-egress-IP appears as a SHARED source-IP across thousands of per-customer rua-streams the receiver-side aggregate-XML evidence pipeline must correlate. The per-SaaS-customer multi-tenant rua- evidence-correlation surface produces FOUR distinct per-customer evidence- attribution challenges this reporting- pipeline page's pipeline architecture consumes: (i) per-SaaS-provider per- egress-IP appears in EACH per- customer rua-stream with the per- customer<source_ip>element but the per-customer<header_from>element identifies the per-customer domain, so the receiver-side aggregate-XML pipeline must group per-customer rua-rows by<header_from>NOT by<source_ip>; (ii) per-SaaS-customer<auth_results><dkim><domain>capture distinguishes per-customer DKIM-aligned-pass (signing-domain == Header-From-domain via per-customer CNAME-delegation) from per-SaaS- platform-default DKIM-pass-but- misaligned (signing-domain ==mail.sendgrid.netor equivalent shared-platform domain); (iii) per-SaaS-customer abandoned- sender detection requires the receiver-side aggregate-XML pipeline to compare per-customer per-month rua-row volume against per-customer per-month outbound-send-volume from the per-SaaS-platform's per-customer UI, flagging customers whose per- SaaS-platform-managedinclude:token still appears in the per-customer SPF record but produces zero per-month rua-rows (canonical sign of a cancelled per-customer SaaS-account whose SPFinclude:was forgotten); (iv) per-SaaS-customer subdomain- delegation publication (per-customer dedicated sending subdomainmail.<customer>ornews.<customer>) produces per-subdomain rua-streams with the per-subdomainsp=publication inheritance the receiver-side aggregate-XML evidence pipeline must attribute to the per-customer organizational domain via the per- receiver Public Suffix List boundary detection algorithm. Read the SaaS- senders spoke alongside this reporting-pipeline reference whenever per-tenant rua-aggregate-XML evidence shows per-SaaS-platform shared source- IPs in per-customer per-row capture — the per-SaaS-platform multi-tenant topology the SaaS-senders spoke documents is the structural reason for the per-customer shared-source-IP evidence signature this reporting- pipeline page's per-tenant evidence- correlation surface produces. - MTA-STS explained
— the TRANSPORT-LAYER-TLS-RPT-
JSON-REPORT-PIPELINE companion to
this DMARC rua-aggregate-XML
reporting-pipeline reference.
Where THIS page documents the
per-publisher RFC 7489 §7.2 rua-
aggregate-XML evidence-stream
ingestion + parsing + per-source-
IP per-Header-From-domain
attribution + per-row per-policy-
verdict correlation operating at
the MESSAGE-LAYER-AUTHENTICATION-
AND-POLICY-EVIDENCE layer (the
receiver-emitted XML report
capturing per-message
Authentication-Results +
DMARC-policy-verdict per-row
evidence), the MTA-STS-explained
spoke documents the per-publisher
RFC 8460 TLS-RPT-JSON-report
ingestion pipeline operating at
the TRANSPORT-LAYER-TLS-FAILURE-
OBSERVABILITY layer (the
receiver-emitted JSON report
capturing per-MX-host TLS-
handshake-failure + cert-
validation-failure + STARTTLS-
collapse per-receiver attribution
evidence), bridging the message-
layer evidence-pipeline this page
documents to the transport-layer
evidence-pipeline the MTA-STS
spoke documents at four cross-
layer receiver-emitted
observability-pipeline coupling
dimensions: (i) publisher-side
per-domain TXT-RR publication as
STRUCTURALLY-IDENTICAL evidence-
endpoint-publication primitive
across both observability
pipelines — DMARC publishes the
per-domain
_dmarc.<domain>TXT-RR carryingrua=mailto:endpoint-publication for aggregate-XML stream; MTA-STS publishes the per-domain_smtp._tls.<domain>TXT-RR carryingrua=mailto:/rua=https://endpoint-publication for TLS-RPT-JSON stream; the per- publisher publication-discipline this page documents for DMARC rua is the per-publisher evidence-endpoint-publication primitive the MTA-STS spoke documents at the transport-layer layer, both enforcing the same per-publisher-per-domain receiver-emitted-evidence- endpoint publication discipline operators consume; (ii) per-receiver evidence-emission cadence + grammar + per-row attribution as parallel receiver-side observability publication disciplines — DMARC rua-aggregate-XML cadence is per-day (per RFC 7489 §7.2.1 default 86400-secondri=interval) with XML-grammar per-row per-source- IP per-disposition attribution; TLS-RPT-JSON cadence is per-day (per RFC 8460 24-hour reporting interval) with JSON-grammar per- failure-class per-MX-host attribution; the same per- receiver per-day per- publisher-domain evidence- emission cadence applies to both pipelines, bridging the rua-XML-grammar per-row evidence the DmarcParser this page documents consumes to the TLS-RPT-JSON-grammar per- failure-class evidence the transport-layer counterpart consumes; (iii) per-failure- class root-cause attribution as parallel receiver-side evidence-diagnostic publication — DMARC rua- aggregate-XML rows surface per- source-IP per-disposition per- SPF-verdict per-DKIM-verdict evidence enabling the per- publisher diagnostic-correlation workflow this page documents (forwarder rewrite ↔ SPF-pass- but-misaligned signature, SaaS- sender ↔ shared-IP-cohort signature, mailing-list- expander ↔ DKIM-fail-but-SPF- pass signature); TLS-RPT-JSON reports surface per-MX-host per-failure-class evidence enabling the per-publisher transport-layer diagnostic- correlation workflow (STARTTLS- not-supported ↔ legacy MX, certificate-host-mismatch ↔ MX-rename, certificate-expired ↔ ACME-renewal-failure, sts- policy-fetch-error ↔ mta-sts-host-HTTPS-misconfig); the parallel-per-failure-class evidence-diagnostic publication discipline applies to both pipelines, bridging the per- receiver per-publisher-domain diagnostic-correlation workflow this page documents to the transport-layer diagnostic- correlation workflow the MTA-STS spoke documents; (iv) per- publisher cross-layer observability-pipeline stack coordination as per-publisher operational discipline scope — every per-publisher per-domain observability-pipeline catalogue (DMARC rua at layer-7 + DMARC ruf per-message AFRF at layer-7 + TLS-RPT at layer-4 + BIMI VMC AIA/CRL/OCSP at layer-7 + per-receiver Authentication- Results header at layer-7) consumes the same per-publisher per-domain DNS-TXT-RR-published rua= endpoint-publication discipline as the load-bearing evidence-endpoint primitive; the MTA-STS-explained spoke is the canonical per-publisher transport-layer observability- pipeline reference DMARC operators read alongside this reporting-pipeline page when scoping the per-publisher cross-layer evidence-pipeline- stack their per-domain operational posture consumes. Read the MTA-STS spoke alongside this DMARC reporting- pipeline reference when designing the per-publisher per-domain cross-layer observability-pipeline-stack whose message-layer DMARC rua- aggregate-XML evidence-pipeline this page documents is one layer of, alongside the transport-layer MTA-STS-paired TLS-RPT-JSON evidence-pipeline the MTA-STS spoke documents. - DKIM replay attacks
— the DKIM-REPLAY-ATTACK-COHORT-AS-
PER-RECEIVER-PER-SOURCE-IP-AGGREGATE-
XML-DISTRIBUTION-ANOMALY-DETECTABLE-IN-
THE-DMARC-REPORTING-PIPELINE companion
documenting how the DKIM-replay attack-
class catalogued in RFC 6376 §8.6
surfaces in the per-publisher per-
domain rua-aggregate-XML evidence
stream THIS reporting-pipeline
reference documents the receiver-
emission discipline of. Where THIS
page documents the per-publisher per-
domain rua-mailbox-ingested per-
receiver per-day aggregate-XML
evidence stream pipeline (per-receiver
per-source-IP
<source_ip>+<count>+<disposition>+<dkim>+<spf>+<policy_evaluated>+<auth_results>row grammar, per-receiver per-day SLO-bounded report cadence, per- publisher per-domain rua-mailbox ingestion + per-row parsing discipline), the DKIM-replay-attacks spoke is the per-message-replay- attack-class threat-model whose per- publisher per-receiver per-source-IP aggregate-XML row distribution is the canonical detection signal at four DKIM-replay-attack-cohort-to- aggregate-XML-evidence-stream- detection coupling dimensions: (i) per-publisher per-receiver per-source-IPdkim=pass- verdict aggregate-XML row originating from a per-source-IP NOT in the per- publisher per-domain authorised sending infrastructure → canonical DKIM-replay-attack-cohort signature in the per-publisher per-domain rua evidence stream — when the per-receiver-emitted per-day aggregate-XML report contains rows with<dkim><result>pass</result>for the publisher's per-selectord=-domain BUT<source_ip>outside the publisher's per-domain authorised egress IP set (per-SPF- record per-domain authorised IPs + per-publisher per-egress sender- infrastructure inventory), the per- publisher per-domain DMARC reporting- pipeline ingestion surfaces the per-source-IP cohort as a canonical DKIM-replay-attack-cohort signature — the per-receiver per-source-IP aggregate-XML row is the load-bearing evidence-class that DKIM-aligned-pass was obtained at an unauthorised per-source-IP via signed-bytes-replay rather than authorised per-source-IP signing; (ii) per-publisher per-domain rua-aggregate-XML per- receiver per-source-IP DKIM-aligned- pass-rate distribution as load- bearing per-publisher per-domain replay-attack-detection KPI — the per-publisher per-domain rua- aggregate-XML evidence stream this reporting-pipeline page documents the per-receiver per-source-IP partitioned view of is the canonical observability surface where per-source-IP DKIM- aligned-pass-rate distributions surface anomalous per-source-IP cohorts outside the per-publisher per-domain authorised sending infrastructure; the per-publisher per-domain monitoring KPI dashboard the rua-aggregate-XML stream feeds is the load-bearing downstream consumer that surfaces the per-source-IP replay-cohort signature as a per-receiver per-publisher per- source-IP DKIM-aligned-pass-rate distribution anomaly; (iii) per- publisher per-domain ruf-mailbox per-message AFRF forensic-evidence cohort as load-bearing per-message replay-attack-fingerprint capture complement to the per-source-IP aggregate-XML cohort signal — the per-publisher per-domain ruf- mailbox-ingested per-message AFRF evidence stream (RFC 6591) this reporting-pipeline page documents the per-publisher per-domain receiver- side-emitter discipline of carries per-message Original-Mail-From + Source-IP + Authentication-Results + DKIM-Signature evidence rows that per-message-replay-attack analysts consume as load-bearing per-message replay-attack-fingerprint capture complement to the per-source-IP aggregate-XML cohort signal; the per- publisher per-message AFRF evidence- capture pipeline is the per-message granular complement to the per-source- IP aggregate-XML cohort detection signal the per-publisher per-domain reporting-pipeline ingestion surfaces; (iv) per-publisher per-domain cross-receiver per-source-IP cohort emergence pattern as load-bearing per-publisher per-domain replay- attack-campaign-scope detection KPI — when the per-source-IP replay-cohort signature surfaces across MULTIPLE per-receiver per-day aggregate-XML reports (Gmail + Yahoo + M365 EOP + GMX simultaneously reporting per-publisher per-domain DKIM-aligned-pass at the same per- source-IP cohort outside the per- publisher per-domain authorised infrastructure), the per-publisher per-domain cross-receiver per-source- IP cohort emergence pattern is the load-bearing per-publisher per-domain replay-attack-campaign-scope detection KPI the per-publisher per-domain monitoring stack surfaces; the per-publisher per-domain rua- aggregate-XML evidence stream this reporting-pipeline page documents the ingestion-and-parsing discipline of is the load-bearing observability surface for per-publisher per-domain replay-attack-campaign-scope detection across the per-publisher per-domain receiver-coverage matrix. Read the DKIM-replay-attacks spoke alongside this reporting-pipeline reference when scoping per-publisher per-domain per-source-IP aggregate-XML replay- cohort detection, per-publisher per- message AFRF forensic-evidence replay-attack-fingerprint capture, per-publisher per-domain cross- receiver per-source-IP replay- campaign-scope monitoring, and per- publisher per-domain monitoring KPI dashboard anomaly-surface configuration for per-source-IP replay-cohort detection as a load-bearing per- publisher per-domain replay-attack- detection signal the per-publisher per-domain rua-aggregate-XML evidence stream this reporting-pipeline page documents feeds the per-publisher per-domain monitoring KPI dashboard with. - DKIM canonicalization
— the PER-PUBLISHER-PER-MESSAGE-
CANONICALIZATION-ALGORITHM-CHOICE-
AS-LOAD-BEARING-DETERMINANT-OF-PER-
RECEIVER-PER-FORWARDER-CLASS-PER-
SOURCE-IP-DKIM-FAIL-RATE-DISTRIBUTION
companion to this DMARC reporting-
pipeline reference. Where THIS page
documents the per-publisher per-
domain rua aggregate-XML reporting-
pipeline (the receiver-side per-
message verdict capture, the per-
receiver per-publisher per-domain
per-day per-source-IP per-disposition
per-DKIM-result per-SPF-result
aggregate-XML row composition, the
rua=mailto: delivery to publisher-
configured endpoints, the per-row
per-message-count + per-row per-
source-IP + per-row per-DKIM-result
evidence aggregation), the DKIM-
canonicalization spoke is the
STRUCTURALLY-UPSTREAM per-publisher
per-message canonicalization-
algorithm-choice-publication-
discipline reference whose RFC 6376
§3.4 simple-vs-relaxed canonicalization-
algorithm-pair primitive published
in the per-message DKIM-Signature
header's
c=-tag drives the per-receiver per-forwarder- class per-source-IP dkim-fail-rate distribution captured at row-level granularity in the rua aggregate- XML evidence stream. The DKIM- canonicalization-vs-DMARC-reporting- pipeline coupling establishes four specific per-publisher canonicalization- choice-to-aggregate-XML-evidence- row dimensions: (i) per- publisherc=simple/simplechoice produces per-receiver per- forwarder-class concentrated dkim= fail-rate spike in per-source-IP rua aggregate-XML row distribution — simple canonicalization treats any per-forwarder-hop modification as signature-breaking; per-mailing- list-server per-source-IP cohort shows dkim=fail at near-100% rate in per-receiver rua-row<auth_results><dkim><result>fail</result>for per-publisher mail forwarded through that per-source-IP cohort; (ii) per-publisherc=relaxed/relaxedchoice produces per-receiver per- forwarder-class lifted dkim=pass- rate in per-source-IP rua aggregate-XML row distribution — relaxed canonicalization survives per-forwarder-hop whitespace-folding + header-case-normalization; per- forwarder-class per-source-IP cohort shows lifted dkim=pass-rate in per- receiver rua-row<auth_results><dkim><result>pass</result>producing per-publisher per- forwarder-class DMARC-aligned-pass- rate lift; (iii) per- publisher canonicalization-choice- migration event captured as per- receiver per-publisher per-domain per-day per-source-IP dkim-pass- rate-distribution discontinuity in rua aggregate-XML evidence stream — per-publisher c= migration (typically simple → relaxed as part of per-publisher mailing-list- survival posture discipline) produces a discrete per-day per- source-IP per-forwarder-class dkim- pass-rate-distribution shift visible in per-receiver rua-row per-day aggregate-XML evidence sequence; per-publisher operational change-log correlation with per- receiver per-day rua-row dkim-pass- rate-distribution shift establishes canonicalization-change-causality attribution; (iv) per- publisher per-tenant per-DKIM- signing-infrastructure canonicalization-drift surfaced as per-receiver per-publisher per- domain per-d=-signing-domain per- selector dkim-pass-rate-variance in rua aggregate-XML evidence stream — per-publisher per-tenant per-DKIM-signing- infrastructure canonicalization- drift (per-tenant SaaS-sender signing with c=simple while per- tenant marketing-ESP signing with c=relaxed) surfaces as per-receiver per-publisher per-domain per-d=- signing-domain per-selector dkim- pass-rate-variance in per-row<auth_results><dkim><domain>...<selector>rua aggregate-XML evidence — per- publisher canonicalization- consolidation discipline (uniform c= choice across per-publisher DKIM-signing infrastructure) eliminates the per-d=-signing- domain per-selector variance visible in the rua-row evidence stream THIS reporting-pipeline page architectures. Read the DKIM-canonicalization spoke alongside this reporting-pipeline reference when investigating per- receiver per-publisher per-domain per-source-IP per-forwarder-class dkim-fail-rate-spike root-cause attribution (canonicalization- choice mismatch with per-forwarder- hop modification discipline is a canonical root-cause class) and when planning per-publisher canonicalization-choice migration whose downstream per-receiver per- publisher per-domain rua aggregate- XML per-day dkim-pass-rate- distribution evidence pipeline THIS page documents observes. - SPF qualifiers explained
— the PER-PUBLISHER-PER-DOMAIN-SPF-
MECHANISM-QUALIFIER-CHOICE-AS-LOAD-
BEARING-DETERMINANT-OF-PER-MESSAGE-
SPF-VERDICT-CLASS companion to this
DMARC reporting-pipeline reference.
Where THIS page documents the per-
publisher per-domain rua aggregate-
XML reporting-pipeline (the receiver-
side per-message verdict capture, the
per-receiver per-publisher per-domain
per-day per-source-IP per-disposition
per-DKIM-result per-SPF-result
aggregate-XML row composition), the
SPF-qualifiers-explained spoke is the
STRUCTURALLY-UPSTREAM per-publisher
per-domain SPF mechanism-qualifier-
choice-publication-discipline
reference whose RFC 7208 §4.6.2
qualifier-prefix primitive
(
+Pass /-Fail /~SoftFail /?Neutral) published in the per-publisher per-domainv=spf1TXT-RR determines whether per-message SPF evaluation produces pass / fail / softfail / neutral verdict captured at row-level granularity in the rua aggregate-XML evidence stream. The SPF-qualifier-vs-rua-aggregate-XML coupling establishes four specific per-publisher qualifier-choice-to- aggregate-XML-evidence-row dimensions: (i) per-publisher-allFail choice produces spf=fail verdict in per- receiver per-publisher per-source-IP rua-row<auth_results><spf><result>fail</result>with downstream DMARC disposition gating per the per-publisherp=policy — per-publisher-allterminal-mechanism choice closes per-publisher per-source-IP unauthorized-sender enforcement gap; per-receiver per-source-IP per- unauthorized-sender mail produces spf=fail-rate distribution that drives downstream DMARC disposition per per-publisher policy; (ii) per-publisher~allSoftFail choice produces spf=softfail verdict in per-receiver per-source-IP rua-row<auth_results><spf><result>softfail</result>with structurally-distinct receiver- side disposition treatment — per-publisher~allterminal-mechanism choice produces per-receiver per-source-IP per- unauthorized-sender softfail-rate distribution that receivers treat as quarantine-eligible rather than reject-eligible; per-publisher Phase-3-rollout-progression discipline typically migrates per-publisher~all→-allas a load-bearing per-publisher rollout-step visible in the per- receiver per-day rua-row spf=fail-vs-softfail-rate- distribution-shift evidence stream; (iii) per-publisher?allNeutral choice produces spf=neutral verdict in per-receiver per-source-IP rua-row with NO-FAILURE-INDICATION semantic that defeats per-publisher per- source-IP per-sender-inventory observability discipline — per-publisher?allterminal-mechanism choice produces per-receiver per-source-IP per- unauthorized-sender spf=neutral- rate distribution that conveys NO per-publisher per-source-IP authorisation-decision semantics to the receiver — per-publisher per-domain rua aggregate-XML evidence stream the operator consumes for per-source-IP sender- inventory completeness audit loses the per-source-IP unauthorized-sender signal; (iv) per-publisher per-mechanism explicit-qualifier choice (e.g.-ip4:198.51.100.0/24deny-list mechanism) produces per- receiver per-source-IP per-mechanism- match per-message spf=fail verdict captured at row-level granularity in rua aggregate-XML evidence stream — per-publisher per-mechanism explicit-qualifier publication (per-rogue-host-IP-ip4:deny-list per- mechanism + per-formerly-authorised- ESP-include:deny-list per-mechanism) drives per-receiver per-source-IP per-mechanism-match per-message spf=fail capture in per-row aggregate-XML evidence; per-publisher per-mechanism deny- list discipline as load-bearing per-publisher per-source-IP unauthorized-sender enforcement complement to per-publisher terminal-mechanism qualifier choice. Read the SPF-qualifiers- explained spoke alongside this reporting-pipeline reference when investigating per-publisher per- source-IP per-disposition rua-row distribution attribution (per- publisher per-mechanism qualifier- choice is the upstream determinant), when planning per- publisher per-domain SPF qualifier- migration discipline (typically~all→-allas Phase 3 rollout enforcement step, observable in per-receiver per-day rua-row spf=fail-vs- softfail-rate-distribution evidence), and when remediating per-publisher per-source-IP unauthorized-sender enforcement gap visible in per-receiver per- publisher per-domain rua-row evidence stream this reporting- pipeline page documents. - BIMI SVG Tiny PS requirements
— the PER-PUBLISHER-PER-DOMAIN-DISPLAY-
LAYER-LOGO-PUBLICATION-PRIMITIVE-WHOSE-
DOWNSTREAM-COVERAGE-KPI-IS-DIRECTLY-
OBSERVED-VIA-THE-RUA-AGGREGATE-XML-
EVIDENCE-STREAM companion to this DMARC
reporting-pipeline reference. Where
THIS page documents the per-publisher
per-domain rua-aggregate-XML evidence
pipeline (the per-receiver per-source-IP
per-disposition per-DKIM-result per-SPF-
result row capture, the per-publisher
per-domain per-day aggregate-XML
distribution structure, the per-receiver
report-emission cadence per RFC 7489 §7),
the BIMI-SVG-Tiny-PS-requirements spoke
is the per-publisher per-domain display-
layer publication-discipline reference
whose per-publisher per-receiver per-
source-IP BIMI-display-coverage KPI is
directly driven by the rua-aggregate-XML
DMARC-aligned-pass-rate row distribution
THIS page documents the receiver-side
capture pipeline for at FOUR per-
publisher per-domain DMARC-aligned-pass-
rate-to-BIMI-display-coverage-KPI
coupling dimensions: (i) per-
publisher per-receiver per-source-IP
DMARC-aligned-pass-rate captured at row-
level granularity in rua aggregate-XML
evidence stream as load-bearing per-
publisher per-receiver BIMI-display-
coverage-KPI input — per-
publisher per-receiver per-source-IP
per-disposition
<row><policy_evaluated><disposition>none</disposition>plus per-row<auth_results> <dkim><result>pass</result>/<spf><result>pass</result>with per-row<policy_evaluated> <dkim>pass</dkim>alignment-pass capture in the rua- aggregate-XML evidence stream THIS page documents is the load-bearing per- publisher per-receiver per-source-IP DMARC-aligned-pass-rate evidence row whose distribution-aggregate is the per- publisher per-receiver BIMI-display- coverage-KPI input — per-publisher per- receiver per-source-IP rua-row aligned-pass-rate variance directly drives per-publisher per-receiver BIMI- display-coverage-KPI variance at Gmail / Apple Mail / Yahoo / Fastmail; (ii) per-publisher per-domain rua- row alignment-pass evidence as load- bearing per-message-BIMI-display- eligibility evidence at row-level granularity — per-publisher per-domainp=quarantineorp=rejectenforcement posture published in the per-publisher per-domain DMARC TXT-RR plus per-message DMARC- aligned-pass verdict captured at row- level granularity in the rua-aggregate- XML evidence stream THIS page documents composes the per-message BIMI-display- eligibility evidence row per RFC 9077 §3 — per-publisher per-domain BIMI- eligibility-rate KPI is operationally the count of rua-rows satisfying per-publisherp=quarantine|reject+ per-rowalignment-passconstraint composition divided by total rua-row count for the per-publisher per- domain per-receiver per-day window the rua-aggregate-XML evidence stream THIS page documents captures; (iii) per-publisher per-forwarder-class rua- row alignment-pass-rate as load-bearing per-mailing-list-recipient per-publisher BIMI-display-suppression-vs-display determinant — per-publisher per-forwarder-class (per-mailing-list- manager, per-corporate-forwarder, per- SaaS-forwarding-rule) per-source-IP per-message envelopes captured as a per-forwarder-class cohort in the per- publisher per-domain rua-aggregate-XML evidence stream THIS page documents produce per-forwarder-class alignment- pass-rate distribution that directly determines per-mailing-list-recipient BIMI-display-vs-suppression outcome — per-forwarder-class alignment-pass survival (typically dependent on per- publisher per-messagec=relaxed/ relaxedDKIM canonicalization and per-publisher per-forwarder ARC- chain preservation) gates per-mailing- list-recipient BIMI display, surfacing the per-publisher per-forwarder-class rua-row alignment-pass-rate the rua- aggregate-XML evidence stream THIS page documents captures as the per-publisher per-mailing-list BIMI-display-coverage sub-KPI; (iv) per-publisher per-domain cross-receiver rua-aggregate- XML aligned-pass-rate distribution as load-bearing per-publisher BIMI- display-coverage cross-receiver observability KPI — per- publisher per-domain aggregate-XML evidence stream the per-publisher operations team consumes via the per-publisher per-domain rua mailbox produces per-receiver (Gmail / Microsoft 365 / Yahoo / Apple-iCloud / Fastmail) per-message-class aligned-pass-rate distribution that operationally IS the per-publisher per-domain cross-receiver BIMI-display-coverage observability KPI — per-publisher operations team responsible for the per-publisher per- domain BIMI SVG Tiny PS profile publication discipline the BIMI-SVG- requirements spoke documents uses the per-publisher per-domain rua aggregate- XML evidence stream THIS page documents as the LOAD-BEARING per-publisher per- domain BIMI-display-coverage-KPI observability surface, treating per- publisher per-receiver per-source-IP per-forwarder-class rua-row aligned- pass-rate variance as the upstream diagnostic signal for per-publisher per- receiver BIMI-display-coverage drift. Read the BIMI-SVG-requirements spoke alongside this DMARC reporting-pipeline reference when planning per-publisher per-domain BIMI deployment whose per- publisher per-receiver per-source-IP DMARC-aligned-pass-rate observability the rua-aggregate-XML evidence stream THIS page documents is the per- publisher BIMI-display-coverage-KPI baseline, and when investigating per- publisher per-receiver BIMI-display- coverage variance whose upstream root- cause is per-publisher per-receiver per-source-IP per-forwarder-class DMARC-aligned-pass-rate distribution- variance the per-publisher per-domain rua-aggregate-XML evidence stream THIS reporting-pipeline page documents structurally captures at row-level granularity. - DMARC myths and misconceptions debunked
— the canonical educational
myth-busting reference whose 18
named DMARC misconceptions are
empirically debunked against the
per-receiver per-publisher five-
stage rua-aggregate-XML + ruf-AFRF
evidence pipeline THIS infrastructure
page documents at four reporting-
pipeline-stage-to-DMARC-myth
resolution dimensions: (i) the
RFC 7489 §7.2.1 daily aggregate
emission cadence (per-receiver
24-hour or longer per-publisher
per-receiver row-batch) is the
canonical empirical counterexample
to the "DMARC aggregate reports
are real-time" misconception —
the myth catalogue explicitly
debunks the false-expectation that
the rua-aggregate-XML stream offers
sub-day incident-response telemetry;
in reality the pipeline cadence
means a publisher's per-incident
DMARC observability lags
receiver-side authentication
outcomes by 24h+ at the cadence
floor, with some receivers batching
weekly; (ii) the per-publisher
rua-mailbox external-mailbox
authorization-record-publication
discipline (the
publisher._report._dmarc. receiver-domainTXT record that authorises an off-organisation rua-recipient mailbox under RFC 7489 §7.1) is the canonical empirical counterexample to the "I publish a rua= tag and reports just start arriving" misconception — the myth catalogue debunks the assumption that rua= publication is sufficient; in practice the cross-domain authorization-record-publication step is the gating prerequisite receivers verify before emitting aggregate XML to a third-party analyser mailbox, and the absence of this record is the dominant rua-zero-report defect-class the operator triages; (iii) the RFC 7489 §7.3 receiver-side OPTIONAL ruf-AFRF emission discipline (per-receiver per-publisher-policy choice to emit, redact, sample, or omit per-message forensic reports) is the canonical empirical counterexample to the "every receiver emits ruf forensic reports when I publish a ruf= tag" misconception — the myth catalogue explicitly debunks the false-expectation of universal ruf coverage; in reality Gmail emits no ruf, Microsoft 365 emits no ruf, Yahoo emits no ruf, and even the receivers that do emit ruf (a handful of European operators) redact the per-message envelope and Subject-line under privacy-rule constraints; and (iv) the RFC 7489 §7.2.2 plaintext-XML-payload-emission discipline (rua-aggregate XML delivered as message/rfc822 attachment over plain SMTP, with TLS-RPT-bounded transport-layer encryption but no application- layer signing or encryption of the XML payload itself) is the canonical empirical counterexample to the "DMARC reports are signed and encrypted by receivers" misconception — the myth catalogue debunks the false-assumption of per-row cryptographic authentication of the aggregate evidence stream; in reality the trust model relies on the receiving rua-mailbox operator's per-message DKIM- verification of the per-receiver outbound aggregate-XML envelope and on per-receiver-IP TLS-RPT observability, NOT on per-XML- record cryptographic signing. Read the myths-and-misconceptions spoke ALONGSIDE this DMARC- reporting-pipeline infrastructure reference whenever the publisher architects a per-publisher reporting-observability operator- expectation curriculum — the five-stage pipeline THIS page documents IS the empirical infrastructure-evidence chain that grounds every reporting- infrastructure-subset entry in the myth catalogue against receiver-side rua / ruf emission reality. - MTA-STS vs DANE for SMTP
— the PER-RUA-MAILBOX-
SUBMISSION-TRANSPORT-
CONFIDENTIALITY-AND-INTEGRITY
decision-matrix companion to
this DMARC reporting-pipeline
infrastructure reference. Where
THIS page documents the five-
stage rua / ruf reporting
pipeline (per-receiver per-
publisher per-day aggregate-
report XML emission to the
publisher's
rua=mailbox URI per RFC 7489 §6.2, the per-failed-message AFRF / ARF forensic-report emission to theruf=mailbox URI per RFC 7489 §6.3, the per- publisher per-day report ingestion + per-source-IP verdict aggregation + per- receiver per-publisher per-day analytics serving), the mta_sts_ vs_dane spoke documents the RFC-8461-vs-RFC-7672 trust- anchor decision matrix that the per-publisherrua=/ruf=mailbox- receiving infrastructure's per- report-submission-leg TLS- encrypted SMTP path structurally depends on resolves to. FOUR structurally-distinct PER-TRUST- ANCHOR-VS-PER-REPORT-SUBMISSION- LEG-COUPLING-DIMENSIONS the mta_ sts_vs_dane spoke operationally documents the reporting-pipeline consumes: (i) per- receiver-organisation outbound rua-report-submission SMTP leg TLS-enforcement-protocol-choice AS LOAD-BEARING-UPSTREAM- CONFIDENTIALITY-INVARIANT-OF- THE-PER-PUBLISHER-RUA-INGESTION- STAGE — every per- receiver per-day aggregate- report XML submission to the publisher'srua=mailbox transits the public Internet SMTP path; the mta_sts_ vs_dane spoke documents the RFC-8461 MTA-STS-policy-enforced TLS-handshake-success-rate AND the RFC-7672 DANE-EE TLSA-record- validated TLS-handshake-success- rate that the per-publisherrua=mailbox- receiving infrastructure publishes to enforce per- submission-leg transport-layer confidentiality of the per- receiver-emitted aggregate- report XML payload; (ii) per-receiver- organisation outbound ruf- forensic-report-submission SMTP leg TLS-enforcement-protocol- choice AS LOAD-BEARING-UPSTREAM- CONFIDENTIALITY-AND-PII- PROTECTION-INVARIANT-OF-THE- PER-PUBLISHER-RUF-INGESTION- STAGE — per-failed- message AFRF / ARF forensic- report submissions to theruf=mailbox carry the COMPLETE OFFENDING message envelope (per-messagemessage/rfc822body, Friendly-From-header identity, recipient-address, per-failed-message DKIM- Signature header) — a PII- sensitive payload class the per-publisherruf=mailbox-receiving infrastructure MUST protect via per-submission- leg transport-layer confidentiality; the mta_sts_vs _dane spoke documents the per- publisher per-egress-shard TLS- enforcement-protocol-choice decision the per-publisherruf=mailbox- receiving infrastructure deploys to provide that PII- protection-invariant; (iii) per-publisher per- protocol-choice TLS-RPT observability-data-stream coordination AS LOAD-BEARING- REPORTING-INFRASTRUCTURE- FEEDBACK-LOOP-OF-THE-RUA-/-RUF- INGESTION-STAGE-HEALTH-KPI — both MTA-STS and DANE deployments emit per-receiver per-publisher per-day RFC 8460 JSON-aggregate TLS-handshake- evidence rows diagnosing the per-publisher per-egress-shard TLS-trust-chain integrity the per-report-submission-leg transport-layer confidentiality the reporting- pipeline ingests structurally depends on; the mta_sts_vs_dane spoke documents the protocol- choice-specific TLS-RPT failure- type catalogue (sts-policy-invalidfor MTA-STS,certificate-not-trustedfor DANE-EE TLSA mismatch) the publisher consumes as the canonical per-report-submission- leg TLS-trust-chain health-KPI; (iv) per-publisher coexistent MTA-STS + DANE publication AS RFC-7672-§1.3- COEXISTENCE-RULE-COMPLIANCE- STATE-MAXIMISING-PER-REPORT- SUBMISSION-LEG-COVERAGE-ACROSS- THE-RECEIVER-ORGANISATION- POPULATION — the mta_sts_vs_dane spoke documents the RFC 7672 §1.3 coexistence rule (DANE-aware report-emitting receivers prefer TLSA when both are published; MTA-STS-only receivers fall back to the HTTPS-PKI policy file) that publishers exploit to maximise per-report-submission-leg TLS- coverage across the report- emitting receiver-organisation population (Gmail, Yahoo, Microsoft, Comcast, Mail.ru, Fastmail) the publisher'srua=/ruf=ingestion infrastructure receives reports from. Read the mta_sts_vs_dane comparison spoke ALONGSIDE this DMARC-reporting- pipeline infrastructure reference whenever the publisher scopes a per-publisher per- egress-shard TLS-enforcement- protocol-choice for therua=/ruf=mailbox- receiving infrastructure — the RFC-8461-vs-RFC-7672 decision- matrix THIS comparison spoke documents IS the canonical load- bearing TLS-enforcement- protocol-choice input every per- report-submission-leg transport- layer confidentiality outcome the reporting pipeline depends on at the per-receiver-emitter- boundary. - BIMI Verified Mark Certificates (VMCs) explained
— the END-TO-END-AGGREGATE-REPORT-PIPELINE-
AS-PER-PUBLISHER-BIMI-DEPLOYMENT-QUALITY-
OBSERVABILITY-PRIMITIVE companion to this
DMARC reporting pipeline reference. Where
THIS page documents the seven-stage end-
to-end rua-aggregate pipeline (per-receiver
per-message DKIM/SPF/DMARC evaluation → per-
receiver-organization per-source-IP per-
disposition row aggregation → XML rua-
payload serialisation → outbound SMTP
dispatch → per-operator rua-endpoint
ingestion → XML deserialisation and per-
row analysis → operator-side per-source-IP
anomaly-detection feedback), the BIMI-VMC-
explained spoke is the per-publisher BIMI
deployment-quality reference documenting
the per-publisher VMC / CMC issuance gate
whose per-publisher operational health is
observable through the per-publisher per-
receiver per-day rua-aggregate evidence
stream THIS page documents the pipeline of.
The END-TO-END-RUA-PIPELINE-VS-PER-
PUBLISHER-BIMI-DEPLOYMENT-QUALITY cross-
reference establishes FOUR structurally-
distinct per-pipeline-stage-vs-BIMI-
deployment-metric dimensions: (i)
Stage 1-2 per-receiver per-message
DKIM/SPF/DMARC-aligned-pass evaluation +
per-source-IP row aggregation AS LOAD-
BEARING per-publisher BIMI-render-eligibility
gate input — the per-publisher per-receiver
per-day DMARC-aligned-pass-rate aggregate
is the per-publisher BIMI deployment-
readiness gate — the BIMI spec
mandates the per-publisher achieve a per-
receiver per-day DMARC-aligned-pass-rate
AT the
p=quarantine-OR-p=rejectenforcement boundary as per-publisher VMC-issuance pre-condition; the BIMI-VMC spoke documents the per- publisher BIMI-render-eligibility gate whose computation feeds from the Stage 1-2 per-message-evaluation + per-source-IP row-aggregation discipline THIS page documents; (ii) Stage 3-4 XML rua-payload serialisation + outbound SMTP dispatch AS LOAD-BEARING per-publisher BIMI-deployment-monitoring evidence transport-layer primitive — the per- receiver per-publisher per-day rua-XML payload contains the per-publisher BIMI- deployment-readiness metric the per- publisher operations team monitors — the per-receiver per-publisher rua-XML per-record per-row aggregate evidence is the per-publisher BIMI-deployment-readiness operational-monitoring evidence stream; the BIMI-VMC spoke documents the per- publisher BIMI-deployment-monitoring operational discipline whose evidence- transport-layer primitive IS the Stage 3-4 XML rua-payload pipeline THIS page documents; (iii) Stage 5-6 per-operator rua- endpoint ingestion + per-row analysis AS LOAD-BEARING per-publisher BIMI-mark- suppression-class root-cause-attribution per-receiver-organization granularity primitive — the per-operator per-receiver- organization per-day rua-aggregate-row analysis surfaces per-receiver BIMI mark- suppression-class attribution to specific per-receiver-organization-cohort cache- retention-window or per-receiver-renderer configuration-drift root causes — the per-operator per-receiver rua-row per-day BIMI-suppression-class attribution granularity is the per-publisher BIMI- deployment-quality root-cause attribution primitive; the BIMI-VMC spoke documents the per-receiver BIMI-mark-suppression- class catalogue whose per-row attribution granularity IS the Stage 5-6 operator- side per-row analysis discipline THIS page documents; (iv) Stage 7 operator- side per-source-IP anomaly-detection feedback AS LOAD-BEARING per-publisher BIMI-deployment-drift-detection-AND- emergency-rollback-trigger primitive — per-operator per-day per-source-IP DMARC- aligned-pass-rate baseline-shift detection feeds the per-publisher BIMI-deployment- drift early-warning evidence stream — a per-publisher per-day per-source-IP DMARC-aligned-pass-rate decline detected by the Stage 7 operator-side analysis is the canonical per-publisher BIMI-render- eligibility-degradation signal the per- publisher operations team uses to trigger per-publisher BIMI-deployment emergency- rollback workflow; the BIMI-VMC spoke documents the per-publisher BIMI-deployment- drift-detection-AND-emergency-rollback operational discipline whose upstream feedback primitive IS the Stage 7 per- source-IP anomaly-detection feedback discipline THIS page documents. Read the BIMI-VMC-explained spoke alongside this end-to-end rua-aggregate pipeline reference whenever the operator scopes a per- publisher BIMI-deployment-monitoring plan — the seven-stage end-to-end rua-aggregate pipeline IS the canonical per-publisher BIMI-deployment-quality-observability primitive whose per-pipeline-stage payload structure carries the per-publisher BIMI- readiness / per-receiver BIMI-mark- suppression-class / per-publisher BIMI- deployment-drift evidence the per-publisher operations team uses at every per-publisher BIMI-deployment lifecycle stage. - DKIM-Signature header tag anatomy
— the per-message HEADER decode
companion to this end-to-end
rua-aggregate / ruf-forensic
reporting pipeline reference. Where
THIS page documents the seven-stage
pipeline (per-message evaluation →
per-source-IP row aggregation → XML
rua-payload serialisation → rua
mailbox transport → per-operator
per-row analysis → per-source-IP
anomaly detection → per-publisher
operations feedback), the
DKIM-Signature-header anatomy
reference is the canonical per-message
decode-key for the
auth_results/dkimsub-tree the Stage-1 per-message-evaluation emits AND for the per-message DKIM-Signature header AFRF forensic- report payloads embed under the RFC-5322 message-part. Operators decoding per-source-IP row aggregates showingdkim=fail/dkim=pass + aligned=false/dkim=temperrorverdicts MUST cross-reference the per-message DKIM-Signature header tag layout (v=/a=/c=/d=/s=/h=/bh=/b=/l=/t=/x=) to attribute the verdict to a specific per-message signing-time defect, per-selector key-publication defect, per-hop canonicalization-induced body-hash mismatch, or per-attacker DKIM- Signature-header tampering — the anatomy reference is the load-bearing per-message-byte-shape lookup the pipeline's Stage-5 per-row analysis consumes as the canonical decode reference. - TLS-RPT DNS record syntax (RFC 8460 §3 byte-by-byte)
— where THIS page documents the
seven-stage RFC 7489 §7.2 rua
aggregate-XML + RFC 6591 ruf AFRF
forensic-report ingestion pipeline
(receiver-side generation → DNS
resolution of the per-publisher
rua mailbox → SMTP delivery →
operator-mailbox / webhook ingest
→ MIME-extract + decompress →
schema-validate → row-ingest),
the TLS-RPT-record-syntax spoke
documents the byte-by-byte
publication discipline of the
per-publisher per-domain
_smtp._tls.<domain>TXT-record whose rua-mailbox publication discipline is the structural-parallel TRANSPORT-LAYER complement to the per-publisher per-domain_dmarc.<domain>TXT-record application-layer publication discipline THIS pipeline reference consumes as its upstream DNS-publication input. FOUR structurally-distinct CROSS- PROTOCOL-REPORTING-PIPELINE coupling dimensions the TLS-RPT- record-syntax spoke operationally documents: (i) per- publisher per-domain_smtp._tlssubdomain TXT-RR publication discipline as load-bearing structural-parallel to per-publisher per-domain_dmarcsubdomain TXT-RR publication discipline at Stage-1 of the reporting pipeline — both protocols publish a per- publisher per-domain TXT-RR at a per-protocol underscore-prefixed subdomain (RFC 8460_smtp._tlsfor TLS- RPT; RFC 7489_dmarcfor DMARC), and BOTH TXT-RRs carry the per-publisher per- domain rua-mailbox URI that receiver-side reporters resolve to send aggregate evidence at Stage-1 of their respective ingestion pipelines; (ii) per-publisher per-domain TLS-RPT JSON-report MIME-encoded message attachment as load- bearing structural-parallel to per-publisher per-domain DMARC aggregate-XML gzip-compressed attachment at Stage-3 of the reporting pipeline — both pipelines deliver per-day per-receiver per-publisher per-domain report payloads as MIME attachments to the per- publisher rua mailbox the TXT-RR-published URI points at; the TLS-RPT JSON-report schema is the structurally-analogous load- bearing per-day per-receiver evidence-payload format to the DMARC aggregate-XML schema at Stage-3 of the ingestion pipeline THIS page documents; (iii) per-publisher per-domain TLS-RPT JSON-report schema-validation as load-bearing structural-parallel to per- publisher per-domain DMARC aggregate-XML XSD-validation at Stage-5 of the reporting pipeline — both pipelines schema-validate the per-day per-receiver per- publisher per-domain payload before per-row ingest at Stage-5 of their respective ingestion pipelines; (iv) per- publisher per-domain per-MX-host per-failure-class TLS-RPT row- ingest as load-bearing structural-parallel to per- publisher per-domain per-source- IP per-disposition DMARC row- ingest at Stage-6 of the reporting pipeline — both pipelines terminate with per-row ingest into a per- publisher per-domain reporting- evidence database at Stage-6 of their respective ingestion pipelines; the TLS-RPT row- ingest schema captures per-MX- host per-failure-class (no STARTTLS, validation-failure, certificate-host-mismatch, certificate-expired, STS-policy- mismatch) granularity, structurally analogous to the DMARC row- ingest schema capturing per- source-IP per-disposition granularity THIS page's Stage-6 per-row analysis documents. Read the TLS-RPT-record-syntax spoke ALONGSIDE this DMARC- reporting-pipeline reference whenever the per-publisher per-domain operational discipline scopes a cross-OSI-layer reporting-pipeline framework — the TLS-RPT-record-syntax spoke IS the transport-layer publication-discipline primitive whose JSON-report ingestion pipeline structurally parallels the application-layer DMARC aggregate-XML ingestion pipeline THIS page documents at every load-bearing stage. - DKIM best practices
— the PER-PUBLISHER-DKIM-SIGNING-DISCIPLINE-
GREEN-STATE-BASELINE companion to this seven-
stage end-to-end aggregate-report pipeline
reference. Where THIS page documents the
canonical seven-stage pipeline (1. per-receiver
per-message DKIM evaluation → 2. per-receiver-
organization per-source-IP per-disposition row
aggregation → 3. per-receiver-organization XML
rua-payload serialisation → 4. per-rua-endpoint
outbound SMTP dispatch → 5. per-operator rua-
endpoint ingestion → 6. per-operator XML
deserialisation and per-row analysis → 7. per-
operator per-source-IP anomaly-detection
feedback into receiver-side trust signals),
the DKIM-best-practices spoke is the PER-
PUBLISHER-DKIM-SIGNING-DISCIPLINE-GREEN-STATE-
BASELINE reference documenting the per-
publisher per-selector + per-message + per-
canonicalization-mode + per-rotation-cadence
rule-set whose continuous adherence is the
load-bearing precondition the operator's
Stage-6 per-row analysis discipline must
reference to interpret the per-row DKIM-pass
evidence the pipeline surfaces. The PIPELINE-
STAGE-VS-DKIM-BEST-PRACTICE cross-reference
establishes FOUR structurally-distinct per-
pipeline-stage DKIM-best-practice-coupling
dimensions: (i) Stage 1 (per-receiver
per-message DKIM evaluation) directly consumes
the per-publisher per-selector DKIM-key
publication discipline the DKIM-best-practices
spoke documents — without a per-publisher
per-selector key published at the per-publisher
per-selector
<selector>._domainkey. <domain>TXT-RR, the per-receiver DKIM verification cannot complete and every Stage-1 per-message DKIM evaluation producesdkim=none; (ii) Stage 2 (per-receiver-organization per-source-IP per-disposition row aggregation) depends on a per-publisher DKIM-signing-coverage floor the DKIM-best-practices spoke documents — per- source-IP rows with low per-source-IP DKIM- pass rate surface per-publisher per-third- party-sender DKIM-signing-coverage gaps the per-publisher must close; (iii) Stage 6 (per-operator XML deserialisation and per-row analysis) consumes per-rowauth_results.dkimverdicts that the operator can only interpret against the per- publisher per-selector DKIM-signing-discipline baseline the DKIM-best-practices spoke documents — a per-row DKIM-pass-rate drop attributable to per-publisher per-selector rotation timing violations vs per-third-party- sender DKIM-signing-coverage gaps requires the baseline reference the DKIM-best-practices spoke provides; (iv) Stage 7 (per-operator per-source-IP anomaly-detection feedback into receiver-side trust signals) is load-bearing on the per-publisher per-selector per-message DKIM-signing-discipline baseline — without a stable per-publisher DKIM-signing- discipline baseline, the per-source-IP anomaly feedback the operator emits to receiver-side trust signals is not interpretable; the DKIM-best-practices spoke documents the per- publisher per-selector per-message per- canonicalization-mode per-rotation-cadence baseline rule-set the Stage-7 anomaly-detection feedback discipline this page documents references at the per-source-IP per-receiver per-day trust-signal-emission boundary. - SPF 10-DNS-lookup limit (RFC 7208 §4.6.4)
— the PER-PIPELINE-STAGE-3-AGGREGATE-
XML-INGEST-PER-SOURCE-IP-PER-MESSAGE-SPF-
PERMERROR-ROW-INTERPRETATION companion to
this DMARC reporting-pipeline reference.
Where THIS page documents the 7-stage
receiver-side-to-publisher-side aggregate-
report ingestion pipeline (Stage 1 per-
receiver per-domain per-24-hour aggregation
window; Stage 2 per-publisher per-RUA-
endpoint aggregate-XML emission; Stage 3
per-publisher per-aggregate-XML parser
ingest; Stage 4 per-publisher per-source-IP
per-message row-level normalisation; Stage
5 per-publisher per-source-IP per-day KPI
roll-up; Stage 6 per-publisher per-source-
IP anomaly detection; Stage 7 per-source-IP
anomaly-feedback to receiver-side trust
signals), the SPF-lookup-limit spoke is the
per-publisher per-domain cumulative-
mechanism lookup-budget ARITHMETIC
REFERENCE documenting the RFC 7208 §4.6.4
10-lookup hard ceiling whose violation
produces the
spf=permerrorreceiver-side verdict the Stage-3 parser ingest surfaces in every aggregate-XML row's<policy_evaluated>< spf>field. The REPORTING- PIPELINE-VS-SPF-LOOKUP-LIMIT cross- reference establishes the per-pipeline- stage interpretation discipline forspf=permerrorrows: (i) Stage 3 per-publisher per-source- IP per-message ingest — every ingested aggregate-XML row carrying<policy_evaluated><spf> permerror</spf>traces back to the per-publisher cumulative-mechanism lookup-budget arithmetic the SPF-lookup- limit spoke documents; (ii) Stage 5 per-publisher per-source-IP per-day roll-up — a per-source-IPspf=permerrorrate above 0% is a per-publisher per-domain SPF-record publication-discipline failure (overrun 10-lookup ceiling) NOT a per-source-IP operational fault, so the pipeline's per- source-IP attribution must be augmented with the per-publisher per-domain publication-side classification the SPF- lookup-limit spoke provides; (iii) Stage 6 per-publisher per-source- IP anomaly detection — a sudden Stage-5spf=permerror-rate flip from 0% to 100% across EVERY source IP at a single timestamp is the Stage-6 anomaly-detection signature of a per- publisher per-domain SPF-record edit crossing the 10-lookup ceiling between the prior 24-hour window and the current one (e.g. an ESP onboarding append that pushed the cumulative cost from 9 to 11); (iv) Stage 7 per-source-IP anomaly-feedback — the per- source-IP trust-signal-emission the pipeline emits at Stage 7 is undefined when the per-publisher per-domain SPF record is inpermerrorstate because the per-receiver per-source-IP per-message SPF verdict is itself undefined under the SPF-lookup-limit ceiling violation. Read THIS page when OPERATING the 7-stage per-publisher per- domain aggregate-report ingestion pipeline; read the SPF-lookup-limit spoke when INTERPRETING any per-publisher per- domain per-source-IP per-messagespf=permerrorrow Stage 3 ingests, when SCALING per-publisher per- domain Stage-5spf=permerrorroll-up trends across the domain family, or when AUDITING the per-publisher per- domain SPF-record publication discipline that determines whether the pipeline's per-source-IP attribution at Stage 5-7 is operationally interpretable at all. - include: vs ip4: vs a: vs mx
— the PER-PUBLISHER-PER-DOMAIN-SPF-
MECHANISM-DECISION-VIEW-AS-LOAD-BEARING-
PEER-PROTOCOL-LAYER-UPSTREAM-AUTHENTICATION-
DETERMINANT-OF-STAGE-5-RUA-ROW-EMISSION
companion to this DMARC-reporting-pipeline
reference. Where THIS page documents the
end-to-end six-stage RUA aggregate-XML
evidence-stream pipeline (Stage 1 receiver-
side per-message authentication-result-row
capture → Stage 2 per-receiver per-RUA-
mailbox daily aggregation → Stage 3 per-
receiver RUA-XML emission → Stage 4 per-
publisher per-domain RUA ingestion → Stage
5 per-publisher per-domain per-source-IP
roll-up → Stage 6 per-publisher per-domain
operator-side trend analysis), the include-
vs-ip4-vs-a-vs-mx spoke is the peer per-
publisher per-domain SPF-mechanism-
decision-view whose per-mechanism-choice
publication discipline is the LOAD-BEARING
upstream determinant of the per-source-IP
per-message
policy_evaluated.spffield emission carried in every RUA row at Stage 5 of the pipeline THIS page documents at FOUR per-RUA-row-emission coupling dimensions: (i) peer per-protocol- layer-publication-syntax-correctness as upstream determinant of receiver-side report-row emission — the Stage 1 receiver-side per-message authentication-result-row capture THIS page documents at the per-receiver per- message authentication-evaluation layer operationally depends on the per-publisher per-domain SPF-record publication-syntax correctness the include-vs-ip4-vs-a-vs-mx spoke documents the per-mechanism-choice rationale of — a per-publisher per-domain SPF-record carrying syntactically-correctinclude:/ip4:/a:/mx:mechanism composition emits per-messagespf=pass/fail/softfailresults that propagate cleanly into the Stage 1 receiver- side per-message authentication-result-row capture THIS page documents, while per- publisher per-domain SPF-record syntax defects (cumulativeinclude:10-lookup-limit breach,a:/mx:DNS-resolution-failure dependency) emit per-messagespf=permerror/temperrorresults that cascade into Stage 5 per-publisher per- domain per-source-IP roll-up as operationally-uninterpretable rows; (ii) per-publisher per-domain SPF- mechanism-choice attribution feeding Stage-5 per-source-IP receiver-side row emission — the Stage 5 per-publisher per-domain per-source-IP roll-up THIS page documents at the per- receiver per-day per-publisher per-domain per-source-IP aggregation layer is the operational evidence-stream attributing per-source-IP traffic to per-publisher per- domain authorised infrastructure — the per- publisher per-domain SPF-mechanism-choice publication discipline the include-vs- ip4-vs-a-vs-mx spoke documents (include:third-party- delegation,ip4:literal-IP- range,a:A-record-lookup,mx:MX-record-lookup) is the per-publisher per-domain publication- discipline that determines which per- source-IP traffic the per-publisher per- domain treats as authorised at the per- message envelope-MAIL-FROM authentication- evaluation layer, and the per-source-IP attribution carried in every Stage-5 row operationally reflects the per-publisher per-domain SPF-mechanism-choice publication discipline correctness the include-vs-ip4- vs-a-vs-mx spoke documents the per- mechanism-choice rationale of; (iii) per-source-IP per-receiver per-day RUA aggregation cross-layer co-ingestion as complete authentication-evaluation observability stream — the per-publisher per-domain DMARC reporting pipeline THIS page documents at the per- receiver per-day per-publisher per-domain per-source-IP aggregation layer is the per-protocol-layer authentication- evaluation observability stream whose per- messagepolicy_evaluated.spffield carries the per-publisher per-domain SPF-mechanism-choice publication-discipline- evaluation outcome the include-vs-ip4-vs- a-vs-mx spoke documents the per-mechanism- choice rationale of — together the per- publisher per-domain DMARC reporting pipeline AND the per-publisher per-domain SPF-mechanism-choice publication discipline compose the per-publisher per-domain complete cross-protocol-pillar authentication-evaluation observability posture every per-publisher per-domain DMARC-deployment programme requires; (iv) per-publisher per-domain operational interpretability of RUA telemetry depends on per-publisher per-domain SPF-mechanism- choice publication-discipline correctness — the per- publisher per-domain DMARC reporting pipeline THIS page documents at the per- publisher per-domain operational-trend- analysis layer emits per-source-IP per-day roll-up trends that are operationally interpretable ONLY when the per-publisher per-domain SPF-mechanism-choice publication discipline the include-vs-ip4-vs-a-vs-mx spoke documents emits unambiguous per- message authentication-evaluation results — per-publisher per-domain RUA telemetry contaminated by per-messagespf=permerrorfrom cumulativeinclude:10-lookup-limit breach or per-messagespf=temperrorfroma:/mx:DNS- resolution failure becomes operationally uninterpretable for per-publisher per- domain per-source-IP attribution at the Stage 5-6 trend-analysis layer, and the per-publisher per-domain SPF-mechanism- choice publication-discipline correctness the include-vs-ip4-vs-a-vs-mx spoke documents the per-mechanism-choice rationale of is the LOAD-BEARING upstream determinant of per-publisher per-domain RUA-telemetry operational interpretability. Read THIS page when INSTRUMENTING the per- publisher per-domain DMARC reporting pipeline; read the include-vs-ip4-vs-a-vs- mx spoke when CHOOSING the per-publisher per-domain SPF-mechanism publication approach (include:,ip4:,a:, ormx:) whose per-mechanism- choice publication discipline is the LOAD- BEARING upstream determinant of the per- source-IP per-messagepolicy_evaluated.spffield emission at Stage 5 of the six-stage RUA aggregate-XML pipeline THIS page documents. - SPF forwarding issues
— the per-message forwarder-induced
envelope-MAIL-FROM-IP-rewrite as upstream
cause of Stage 5 RUA-row
spf=failemission companion to this seven-stage DMARC reporting-pipeline architecture. Where THIS page documents the architecture- of-record for how an aggregate report flows from Stage 1 (IMAP / Microsoft Graph ingestion) through Stages 3 / 4 / 5 (RUA XML parsing, per-source-IP-per-day storage- and-deduplication, per-rowpolicy_evaluated+auth_resultsemission) into Stage 6 (analysis-and-alerting), the SPF-forwarding-issues spoke documents the per-message FORWARDER-INDUCED upstream cause that produces a recurring class ofspf=failrows the operator reads in the Stage 5 output. Four PIPELINE- STAGE-VS-FORWARDING-FAILURE-MECHANIC cross- correlation axes the SPF-forwarding-issues spoke documents: (i) the recipient- side auto-forwarder rewrites the SMTP envelope MAIL FROM IP to its own infrastructure IP — at the second-hop receiver, the SPF engine evaluates the rewritten IP against the original publisher's SPF record, fails the check, and the per-source-IP per-day aggregate row emitted at Stage 5 carriesauth_results.spf.result=failwith the forwarder's IP populated assource_ip— the operator MUST distinguish this benign forwarding-induced attribution from a spoofing-induced attribution when reading the dashboard rows the Stage 6 analysis surfaces; (ii) the mailing-list intermediary rewrites the envelope AND mutates the message body (footer / List-Unsubscribe / Subject-prefix injection) — at the second-hop receiver, BOTH the SPF check fails (envelope-IP-rewrite) AND the DKIM check fails (body-hash-mismatch from list-mutation), producing the per-source-IP per-day aggregate row withauth_results.spf.result=fail+auth_results.dkim.result=failat Stage 5 — the dual-failure pattern the operator's DMARC-rollout ARC-trust-anchoring rescue path is designed to recover; (iii) the vacation-forwarder / corporate- to-personal forwarder pattern produces low- volume per-source-IP rows (typically 1-5 messages per day per forwarding intermediary) with high source-IP diversity over the per-day aggregation window — the Stage 4 per-source-IP-per-day deduplication produces many small rows rather than a few large rows, and the operator MUST configure the Stage 6 analysis dashboard to filter forwarder- attribution rows from the spoofing-attribution rows by per-source-IP volume + per-source-IP ASN + DKIM-pass-rate co-axis; (iv) the ARC-trust-anchored rescue path documented inhelp_arc_explained.phpproduces anauth_results.arcper-row field at Stage 5 that the Stage 6 analysis MAY use to override the SPF-fail verdict for known-trustworthy forwarders — operators reading the Stage 5 output for forwarding-induced rows MUST cross-reference the ARC trust chain to determine whether the forwarder's intermediary signature is anchored to a known-trustworthy ARC sealer or whether the SPF-fail is genuinely the operator's spoofing-attribution surface. Read THIS page when INSTRUMENTING the per-publisher per-domain DMARC reporting pipeline; read the SPF-forwarding-issues spoke when ATTRIBUTING a recurring per-source-IPspf=failrow class to a benign forwarder vs a spoofing actor — the spoke is the AUTHORITATIVE per-forwarder-class attribution reference operators reach for to interpret the per-source-IP per-day RUA stream THIS pipeline emits. - DKIM cryptography basics
— the per-publisher per-selector RSA
cryptographic-key-strength as load-bearing
upstream cryptographic-primitive foundation
of Stage-5 RUA-row dkim-pass-fail verdict
emission companion to this seven-stage
end-to-end DMARC reporting-pipeline
architecture. Where THIS page documents the
architecture-of-record (Stage 1 IMAP /
Microsoft Graph ingestion, Stage 2 format
detection and extraction, Stage 3 RUA XML /
RUF MIME parsing, Stage 4 storage and
deduplication, Stage 5 retention policies,
Stage 6 analysis and alerting, Stage 7
operator-dashboard surfacing), the DKIM
cryptography-basics spoke documents the
per-publisher per-selector cryptographic
primitive that the pipeline STRUCTURALLY
DEPENDS on as the LOAD-BEARING upstream
cryptographic foundation every Stage-3 RUA
parser deserializes and every Stage-5
per-row evidence stream attributes back to
the publisher. Four DKIM-CRYPTOGRAPHY-VS-
STAGE-5-RUA-ROW-EMISSION cross-correlation
axes the cryptography-basics spoke documents:
(i) per-publisher per-selector
RSA-2048 key-strength baseline STRUCTURALLY
DETERMINES the per-message DKIM-signature
verification math the Stage-3 RUA parser
deserializes — the per-publisher
per-selector RSA-2048-or-stronger key-length
baseline is the LOAD-BEARING upstream
cryptographic precondition the per-message
DKIM-signature verifier evaluates against
per RFC 8301 (
rsa-sha1deprecated /rsa-sha256required); a per-publisher per-selector sub-1024-bit RSA key produces per-receiver verifier-sidedkim=neutralordkim=permerrorverdicts that Stage 5 attributes to per-source-IP per-day rows AND that Stage 6 analysis flags as a per-publisher per-selector cryptographic- strength regression alarm; (ii) per- message SHA-256 body-hash (bh=) computation discipline STRUCTURALLY DETERMINES the per-row dkim-fail emission at Stage 5 whenever per-message canonicalization- mode divergence corrupts the body-hash comparison — the per-messagec=simple/simplevsc=relaxed/relaxedcanonicalization- mode choice the publisher signs with MUST match the per-receiver verifier-side canonicalization-evaluation; per-message intermediary footer-injection, line-ending normalization, or whitespace mutation insimplemode produces per-message body-hash mismatches that Stage 3 parses as per-rowauth_results.dkim=failAND Stage 6 analysis attributes to per- intermediary forwarder-vs-mailing-list body- mutation footprints; (iii) per- selector public-key DNS-publication discipline (k=rsa,p=base64- encoded DER) STRUCTURALLY DETERMINES the per-row dkim=permerror attribution at Stage 5 whenever per-receiver verifier-side public-key fetch fails — a per- publisher per-selector TXT-RR publication- discipline regression (truncatedp=tag, missing trailing-zero bytes, retired- selector not republished, NXDOMAIN at<selector>._domainkey.<domain>) produces per-receiver verifier-sidedkim=permerrorverdicts that Stage 5 attributes to per-source-IP per-day rows AND that Stage 6 analysis aggregates into a per-publisher per-selector publication- discipline-regression alarm; (iv) per- publisher per-selector key-rotation cadence and overlap-window publication discipline STRUCTURALLY DETERMINES the per-day per- selector dkim-pass coverage-rate cliff at Stage 5 across rotation boundaries — a per-publisher per-selector key-rotation without an adequate overlap-window (new selector active before old selector retired) produces a per-day per-selector dkim-pass coverage-rate cliff that Stage 5 emits across every per-source-IP per-day row signed during the rotation transition AND that Stage 6 analysis surfaces as a per-publisher per- selector rotation-discipline regression alarm requiring the operator to extend the overlap-window before the next rotation cycle. Read THIS page when INSTRUMENTING the per-publisher per-domain seven-stage DMARC reporting pipeline; read the DKIM cryptography-basics spoke when AUDITING the per-publisher per-selector cryptographic- primitive foundation whose RSA-2048 key- strength baseline, per-message SHA-256 body-hash computation discipline, per- selector public-key DNS-publication discipline, and per-selector key-rotation overlap-window discipline produce every per- row dkim-pass-fail verdict the pipeline's Stage-3 parser deserializes and the Stage-5 per-source-IP per-day evidence stream attributes to the publisher. - CAA records explained
— the per-publisher per-domain CAA-record
publication-discipline companion to this
DMARC reporting-pipeline reference. Where
THIS page documents the per-publisher per-
domain DMARC RUA aggregate-XML reporting-
pipeline architecture (the per-publisher
per-domain
rua=mailto:<reporter>/rua=https://<reporter>/postURI publication, the per-receiver per-day aggregate-XML report generation and submission, the receiver-side ingestion + parser + per-source-IP per-day evidence- stream emission), the CAA-records spoke is the PER-PUBLISHER-PER-DOMAIN-RFC-8659-CA- ISSUANCE-AUTHORIZATION-PUBLICATION reference documenting the per-publisher per-domain CAA-record publication-discipline at the reporter-side authoritative-DNS zone-apex that gates the TLS-cert-chain trust anchors every downstream HTTPS-RUA-endpoint / mailto-RUA-MX cert-chain consumer relies on. Four CROSS-PROTOCOL-PER-RUA-ENDPOINT-TLS- TRUST-CHAIN dimensions the CAA-records spoke documents: (i) per-publisher per- domain HTTPS-RUA-endpoint TLS-cert-chain authorization-publication-discipline parallel — every per-publisherrua=https://<reporter>/postRUA-endpoint URI consumed by the Stage-2 RUA-submission step depends on the reporter- domain's CAA-publication discipline correctly authorizing the per-CA-issued TLS cert that backs the HTTPS-RUA-endpoint trust chain; a CAA-misconfiguration at the reporter side allows attacker-controlled per-CA issuance for the RUA-endpoint cert; (ii) per-publisher per-domain mailto-RUA-MX TLS-cert-chain authorization- publication-discipline parallel — every per-publisherrua=mailto:<reporter>RUA-mailto URI consumed by the Stage-2 RUA- submission step depends on the reporter- domain's per-MX-host CAA-publication discipline correctly authorizing the per-CA- issued TLS cert that backs the STARTTLS- upgrade trust chain at the reporter's MX; a CAA-misconfiguration at the reporter MX allows attacker-controlled per-CA issuance for STARTTLS-MITM substitution; (iii) per-publisher per-domain CAA- iodef-publication discipline as RUA-side per-domain CA-violation-reporting channel parallel — CAA's0 iodef "mailto:<reporter>"per-domain CA-violation-reporting channel is the structural CAA-side parallel of the DMARC RUArua=mailto:publication-discipline; both are per- publisher per-domain authoritative-DNS- published violation-reporting channels for cross-protocol per-domain authentication- and-issuance discipline violations; (iv) per-publisher per-domain RUA- endpoint-cert vs CAA-publication operational- trust-anchor coupling — the per- publisher per-domain DMARC-reporting trust model depends on the per-publisher per- domain authoritative-DNS publication- discipline integrity at TWO endpoints — the per-publisher per-domain DMARC_dmarc.<d>TXT publication where the RUA URI is announced, AND the reporter-domain CAA publication where the RUA-endpoint TLS cert-chain trust anchor is authorized; a per-publisher per-domain authoritative-DNS publication-discipline failure at EITHER endpoint compromises the reporting-pipeline trust model. Read the CAA-records spoke alongside this DMARC reporting-pipeline reference when the per- publisher per-domain RUA-endpoint TLS-trust- chain integrity assumptions this page makes need to be cross-verified against the reporter-domain CAA publication discipline. - Why SPF alone is insufficient
— the per-publisher per-domain
WHY-DMARC-REPORTING-PIPELINE-EXISTS-AT-ALL
motivating-rationale companion to this DMARC
reporting-pipeline reference. Where THIS page
documents the per-publisher per-domain DMARC
aggregate-report (RUA) ingestion-pipeline
discipline (per-receiver per-day AFRF MIME-
envelope aggregate-report harvesting,
per-source-IP per-reporter per-day per-result-
type aggregation, per-publisher per-domain
compliance-percentage rollups), the why-SPF-
alone-is-insufficient spoke documents the per-
publisher per-domain SPF-only THREAT-MODEL
coverage gap that motivates the existence of
DMARC's report-driven authentication-coverage-
completeness audit discipline THIS page
documents in the first place: SPF's per-
message envelope-layer authorized-sender
verdict (i) BREAKS under per-message
forwarding when the per-message MAIL FROM
envelope is rewritten by intermediate MTAs
(per-message Listserv/forwarding/MX-redirect
SPF-fail-after-forward attack surface);
(ii) provides NO per-message coverage of
non-existent subdomains (per-publisher
per-non-existent-subdomain SPF-coverage gap
attackers exploit for impersonation campaigns);
(iii) provides NO per-message visibility into
the RFC 5322 From: header (per-message MAIL
FROM envelope vs From: header alignment-
invisibility gap); and (iv) provides NO per-
message message-integrity protection (the
per-message body and headers post-SPF-pass
remain mutable). Three per-DMARC-reporting-
pipeline per-publisher per-domain authentication-
coverage-completeness dimensions the why-SPF-
alone-is-insufficient spoke documents the
DMARC-reporting-pipeline operator MUST AUDIT
at the per-publisher per-domain DMARC RUA
ingestion tier: (i) per-publisher
per-domain per-source-IP SPF-pass-without-
DKIM-pass row-level RUA attribution as the
DMARC-reporting-pipeline observability primitive
SPF-alone publication discipline would
SUPPRESS — the per-source-IP per-
reporter per-day per-result-type RUA
aggregate-report ingestion discipline THIS
page documents reveals per-publisher per-
domain per-source-IP SPF-pass-without-DKIM-
pass row-level attribution (the per-message
envelope-layer-authenticated-but-message-
layer-unauthenticated per-source-IP attack-
surface) the per-publisher per-domain SPF-
only publication discipline the spoke
documents would SUPPRESS at the per-publisher
per-domain message-layer-unauthenticated
attack-surface observability tier;
(ii) per-publisher per-domain per-
non-existent-subdomain DMARC-RUA
impersonation-attempt attribution as the
DMARC-reporting-pipeline observability
primitive SPF-alone publication discipline
would NOT REVEAL — the per-publisher
per-domain per-non-existent-subdomain DMARC
np=rejectcoverage discipline THIS DMARC-reporting-pipeline reference documents via per-receiver per-day per-non- existent-subdomain RUA aggregate-report ingestion reveals per-publisher per-domain per-non-existent-subdomain per-source-IP impersonation-attempt attribution (per- publisher per-non-existent-subdomain unauthorized-sender per-day campaign attribution) the per-publisher per-domain SPF-only publication discipline the spoke documents would NOT REVEAL at the per- publisher per-non-existent-subdomain impersonation-attack-surface observability tier; (iii) per-publisher per-domain per-message MAIL-FROM-vs-From-header alignment-gap attribution as the DMARC- reporting-pipeline observability primitive SPF-alone publication discipline would NOT SURFACE — the per-publisher per- domain DMARC per-messageaspf=-aware alignment-mode publication discipline THIS DMARC-reporting- pipeline reference documents via per-receiver per-day per-result-type AFRF-MIME RUA aggregate-report ingestion reveals per- publisher per-domain per-message per-source- IP MAIL-FROM-envelope-vs-RFC-5322-From- header alignment-gap attribution (per- publisher per-domain per-message envelope-vs-header alignment-violation per- source-IP attribution) the per-publisher per-domain SPF-only publication discipline the spoke documents would NOT SURFACE at the per-publisher per-domain envelope-vs-header alignment-gap observability tier. Read the why-SPF-alone- is-insufficient spoke ALONGSIDE this DMARC reporting-pipeline reference whenever the per-publisher per-domain operator AUDITS the per-publisher per-domain AUTHENTICATION-COVERAGE-COMPLETENESS rationale for the DMARC reporting-pipeline operational investment — the per-publisher per-domain DMARC reporting-pipeline THIS page documents is the per-publisher per- domain AUTHENTICATION-COVERAGE-VERIFICATION primitive; the per-publisher per-domain why-SPF-alone-is-insufficient spoke is the per-publisher per-domain AUTHENTICATION- COVERAGE-COMPLETENESS-MOTIVATING-RATIONALE primitive that closes the per-publisher per-domain "why does DMARC reporting exist at all" justification gap at the per- publisher per-domain SPF-only-coverage-gap documentation tier. - DKIM for Microsoft 365
— the LOAD-BEARING per-M365-tenant per-
custom-domain PER-M365-TENANT-DKIM-
PUBLICATION-AS-DKIM-ALIGNED-PASS-
EVIDENCE-PRODUCER-FOR-THE-RUA-AGGREGATE-
PIPELINE companion documenting the per-
M365-tenant per-custom-domain DKIM
publication tutorial (Exchange Online /
Microsoft 365 Defender admin-center DKIM
enablement, the 2048-bit
selector1._domainkey/selector2._domainkeyper-tenant CNAME publication, the Microsoft Graph PowerShell DKIM management cmdlets, the per-tenant DKIM signing-domain verification) whose per- tenant successful execution PRODUCES the per-message per-publisher per-domain DKIM-aligned-pass evidence that the per- publisher per-domain DMARC RUA AGGREGATE-REPORT PIPELINE this page documents structurally catalogues per<auth_results/dkim>/<policy_evaluated/dkim>XML row field. The per-M365-tenant per- custom-domain DKIM publication is the UPSTREAM PRODUCER of the per-rowdkim=passverdict the downstream aggregate-report row schema documents — without per-tenant DKIM enablement, the per-row evidence stream the RUA pipeline this page documents delivers shows per-messagedkim=none/dkim=failacross the per- tenant per-custom-domain sender inventory. Where THIS page documents the per-publisher per-domain RFC 7489 §7.2 DMARC RUA aggregate-report DELIVERY PIPELINE architecture (the per-receiver per-day aggregate-report XML generation, the per-publisher per- domainrua=mailto:/rua=https://RUA-mailbox delivery, the per-publisher per-domain RUA-mailbox-to-analyzer ingestion pipeline, the per-row analyzer normalization), the DKIM-for-M365 spoke documents the per-M365-tenant per-custom-domain UPSTREAM DKIM- PUBLICATION TUTORIAL that PRODUCES the per-row DKIM-aligned-pass evidence the RUA aggregate-report pipeline this page documents downstream-catalogues. Read THIS page when DESIGNING the per- publisher per-domain RUA aggregate- report pipeline architecture; read the DKIM-for-M365 spoke when PUBLISHING the per-M365-tenant per-custom-domain DKIM records that PRODUCE the per-row DKIM- aligned-pass evidence the RUA aggregate-report pipeline this page documents downstream-consumes. - DKIM for Google Workspace
— the per-Workspace-tenant per-custom-
domain PER-WORKSPACE-TENANT-DKIM-
PUBLICATION-AS-PER-ROW-DKIM-ALIGNED-
PASS-EVIDENCE-PRODUCER companion to this
RUA aggregate-report pipeline reference.
Where THIS page documents the receiver-
side ingestion of the per-publisher
per-day RFC 7489 §7.2 RUA aggregate-
report XML schema (the
<record><auth_results><dkim>per-row per-message DKIM-verification evidence dimension), the DKIM-for- Google-Workspace spoke documents the per-Workspace-tenant per-custom-domain DKIM-publication discipline that PRODUCES the per-row DKIM-aligned-pass evidence the receiver-side ingestion pipeline downstream-consumes at FOUR per-Workspace-tenant per-custom-domain DKIM-publication-vs-RUA-pipeline coupling dimensions: (i) the per-Workspace-tenantgoogle._domainkey.<customer>TXT-RR publication discipline — the Workspace tenant operator publishes the per-customer-domain DKIM public key at the canonical Workspace selectorgoogle._domainkey(or an operator-chosen custom selector name) as a direct TXT record at the customer-vanity-domain DNS zone (NOT CNAME-delegated to a Google-managed zone, distinct from the M365 selector1/selector2 CNAME-delegated topology documented in the sibling above), and the per-Workspace-tenant per-customer-domain TXT-RR publication is the load-bearing cryptographic- trust-material substrate the receiver- side DKIM evaluator resolves at per- message DKIM verification time, producing the per-row<auth_results><dkim><result>pass</result><domain><customer-domain></domain><selector>google</selector>evidence that the RUA aggregate-report XML schema this page documents per-row-materialises at the receiver- side ingestion-pipeline; (ii) the per-Workspace-tenant Google-managed RSA-2048 key generation discipline — the Workspace admin console mints a per-customer- domain RSA-2048 key pair, exposes the public-key string for operator- publication at the customer-domain DNS zone, and retains the private-key custody in the Google-managed Workspace-tenant signing infrastructure — structurally parallel to the M365 per-tenant CNAME-delegated topology but differing in the trust-material publication mechanism (direct TXT-RR vs CNAME-delegation), producing different per-tenant operator- published-record discipline that the RUA aggregate-report pipeline this page documents per-row-materialises at the per-receiver per-day ingestion boundary; (iii) the per- Workspace-tenant manual rotation cadence vs M365 dual-selector automatic rotation cadence operator-discipline divergence — the Workspace tenant requires the operator to manually mint a fresh selector, publish the new public key at the customer- domain DNS zone, wait for receiver- side resolver-cache eviction, transition the Workspace signing infrastructure to the new selector, then revoke the old selector's TXT record after a propagation grace period (the per- Workspace-tenant single-selector operator-managed-rotation discipline, distinct from the M365 dual-selector Microsoft-managed automatic-rotation discipline) — producing per-Workspace- tenant per-customer-domain selector- publication-cadence drift that the receiver-side RUA aggregate-report ingestion pipeline this page documents captures as per-receiver per-day per- selector signature-failure pattern emission at the operator- observability boundary; (iv) the per-Workspace-tenantd=<customer-domain>signing-identity-vs-envelope-MAIL-FROM alignment discipline coupling to per- receiver DMARC-aligned-pass attribution — the Workspace signing infrastructure signs per-customer- domain messages withd=<customer-domain>(the customer-vanity domain, NOTd=google.com) to satisfy the per-receiver DMARC-aligned-pass attribution check; the per-Workspace- tenant operator publication-discipline whose per-customer-domaingoogle._domainkeyTXT-RR emission this spoke documents is the load-bearing cryptographic-trust- material substrate gating per-receiver DKIM-aligned-pass verdict emission per RFC 7489 §3.1.1, producing the per-row DKIM-aligned-pass evidence the receiver -side RUA aggregate-report ingestion pipeline this page documents per-row- materialises at the per-publisher per- day per-receiver ingestion boundary. Pair this Workspace-tenant DKIM- publication spoke (and the M365 DKIM- for-tenant spoke above) with this DMARC-reporting-pipeline reference when designing the per-cloud-mailbox- provider per-tenant per-customer-domain DKIM-publication discipline that the receiver-side ingestion pipeline this page documents per-row-materialises at the per-publisher per-day RUA aggregate-report ingestion boundary — the two peer-cloud-tenant DKIM- publication topologies (M365 dual- selector CNAME-delegated + Workspace single-selector direct TXT-RR) jointly govern the per-tenant per-customer- domain DKIM-aligned-pass evidence stream that the RUA aggregate-report pipeline this page documents downstream-consumes. - MTA-STS for Microsoft 365
— the LOAD-BEARING per-M365-tenant per-
custom-domain PER-M365-TENANT-MTA-STS-
PUBLICATION-AS-LOAD-BEARING-TRANSPORT-
LAYER-DELIVERY-PROTECTION-DISCIPLINE-
FOR-THE-PER-PUBLISHER-PER-DOMAIN-RUA-
AGGREGATE-REPORT-DELIVERY-PIPELINE
companion documenting the per-M365-tenant
per-custom-domain MTA-STS publication
tutorial (the per-tenant
_mta-sts.<d>TXT-RR version + policy ID publication, the per- tenanthttps://mta-sts.<d>/.well-known/mta-sts.txtHTTPS-policy-host file publication listingmx: *.mail.protection.outlook.comas the enforced-mode MX cone, the per- tenantmode: enforcepolicy- mode choice that gates the per-receiver- MX STARTTLS-fail-closed enforcement behaviour). Where THIS page documents the per-publisher per-domain RFC 7489 §7.2 RUA aggregate-report DELIVERY pipeline (the per-receiver per-publisher- domain per-24h-window XML report compile phase, the per-publisher per-domain gzipped-XML SMTP delivery to the publisher's per-domainrua=mailto:endpoint, the per-publisher per-domain RUA endpoint ingest + per-row JSON normalization + per-source-IP per-disposition row aggregation), the MTA-STS-for-M365 spoke documents the per-publisher per- domain TRANSPORT-LAYER DELIVERY PROTECTION discipline — when the per- publisher per-domain RUArua=mailto:<rua-endpoint>endpoint is hosted on an M365 tenant, the per-M365-tenant MTA-STS publication forces remote receiver MTAs delivering per-publisher per-receiver RUA gzipped- XML payloads to the publisher's RUA endpoint to STARTTLS-fail-closed against the M365-tenant inbound MX (per-tenant*.mail.protection.outlook.com), closing the per-message transport-layer plaintext-fallback / STARTTLS-downgrade attack surface for the per-publisher per- domain RUA delivery pipeline THIS page documents. Read THIS page when ARCHITECTING the per-publisher per-domain RUA aggregate-report INGEST pipeline; read the MTA-STS-for-M365 spoke when HARDENING the per-M365-tenant TRANSPORT-LAYER DELIVERY PROTECTION discipline for the per-publisher per-domain RUA pipeline's receive-side endpoint when that endpoint is M365-hosted. - DKIM key rotation
— the PER-SELECTOR-DKIM-KEY-ROTATION
companion to this DMARC RUA + RUF
aggregate-and-forensic-report pipeline
reference. Where THIS page documents
the per-publisher per-domain DMARC
aggregate-report INGEST pipeline (the
RFC 7489
rua=/ruf=tag endpoint publication, the per-receiver per-publisher per-domain per-reporting-window XML aggregate- report production, the per-source-IP per-disposition row aggregation, the per-recordauth_results/dkimandauth_results/spfverdict-payload extraction), the DKIM key rotation spoke is the STRUCTURALLY-COMPLEMENTARY per- selector DKIM key-publication lifecycle companion documenting how per-selector rotation discipline regressions are SURFACED by the per- publisher per-domain DMARC RUA stream THIS page documents. The composition works in three directions: (i) Per-selector rotation observability via DMARC RUA — every per-selector rotation event (new selector publication, old- selector retirement, emergency revocation via empty-p=- tag) emits a verdict-shape change in the per-publisher per-domain RUA stream'sauth_results/dkim/selectorandauth_results/dkim/resultper-record fields — the rotation spoke's Rule 13 (post-rotation aggregate-report-validation) EXPLICITLY consumes the RUA stream THIS page documents as its observability surface for confirming zero per-receiverdkim=permerror/dkim=failregression post-rotation; (ii) Per- selector compromise detection via DMARC RUA anomaly surface — an attacker that compromises a per-selector signing key and forges legitimate-looking DKIM signatures appears as a per-source-IP anomaly in the RUA stream's per-source-IP row aggregation (the attacker's outbound IP appears as a per- publisher per-domain sender withdkim=passverdicts the operator's outbound IP inventory does NOT account for); (iii) Per-selector rollover- window monitoring via DMARC RUA dual- selector verdict surface — during the rotation spoke's dual- selector overlap window, the per- publisher per-domain RUA stream surfaces BOTH the old-selector verdicts (decreasing over the window) AND the new-selector verdicts (increasing over the window) — the operator confirms cutover completeness by observing the per-selector verdict-share crossover in the RUA stream before retiring the old-selector TXT-RR. Read THIS page when ARCHITECTING the per-publisher per- domain RUA aggregate-report INGEST pipeline; read the DKIM key rotation spoke when AUTHORING the per- selector key-publication lifecycle whose per-rotation per-revocation per-rollover observability surface is the per-publisher per-domain RUA stream THIS page documents as the operator-side feedback channel for every per-selector rotation event the discipline drives. - SPF for Google Workspace
— the per-Workspace-tenant per-domain
v=spf1 include:_spf.google.com ~allpublication discipline produces per- receiver per-day per-source-IP per-message first-hop SPF-aligned-pass evidence that downstream receivers emit into the per-publisher RUA aggregate-report stream this reporting-pipeline guide documents. Read the Workspace SPF spoke as the per-publisher-side publication- discipline input materially producing the per-receiver-side SPF verdict rows the pipeline's aggregate-report parser materialises into per-source- IP per-day per-publisher per-domain per-message disposition records for operator analysis. - MTA-STS for Google Workspace
— the WORKSPACE-TENANT-PER-CUSTOM-DOMAIN-
TLS-RPT-PIPELINE-AS-TRANSPORT-LAYER-PEER-
OF-DMARC-RUA-PIPELINE companion to this
DMARC reporting-pipeline reference.
Where THIS page documents the per-
publisher per-domain application-layer
7-stage reporting pipeline (per-receiver
emission → DNS-lookup of
rua=endpoint → MIME-attachment dispatch → publisher-side ingest → format detection → XML parse → storage with per-source-IP per-day aggregation), the MTA-STS-for- Google-Workspace spoke documents the per-Workspace-tenant per-custom-domain transport-layer reporting-pipeline peer at four per-tenant cross-layer aggregate-report-pipeline coordination dimensions: (i) per-Workspace- tenant per-custom-domain_smtp._tls.<workspace-domain>TXT-RRv=TLSRPTv1; rua=mailto:<ops>@<workspace- domain>publication parallels per-tenant_dmarc.<workspace- domain>TXT-RRrua=mailto:publication — Workspace tenants publish per-custom-domain TLS-RPT and DMARC reporting-endpoint TXT-RRs at parallel underscored-attribute-leaf positions consuming the same RFC 1034/1035 DNS- publication primitives; per-tenant zone-edit discipline coordinates both publications coherently; (ii) per-Workspace-tenant per-day per-receiver TLS-RPT JSON-aggregate evidence emission parallels per-tenant per-day per-receiver DMARC RUA aggregate-XML evidence emission — receivers honoring per-tenant publication emit per-day per-receiver TLS-RPT JSON-aggregate to per-tenant TLS-RPT endpoint AND per-day per- receiver DMARC RUA aggregate-XML to per-tenant RUA endpoint; per-tenant evidence-stream parallelism produces cross-layer per-day aggregation cohort the per-tenant operator program consumes; (iii) per-Workspace- tenant publisher-side ingest pipeline parses BOTH per-tenant TLS-RPT JSON- aggregate AND DMARC RUA aggregate-XML evidence streams — the per- tenant DMARC Analyzer ingestion pipeline consumes per-tenant TLS-RPT JSON- aggregate evidence (per-RFC-8460 §4 byte-grammar with per-policies per- policy-type per-failure-details per- result-type attribution payload) AND per-tenant DMARC RUA aggregate-XML evidence (per-RFC-7489 §7.2 byte-grammar with per-record per-source-IP per- disposition attribution payload); per-tenant cross-layer ingest discipline produces the unified per-tenant per-day per-receiver evidence-aggregation record; and (iv) per-Workspace- tenant per-day per-source-IP per- receiver cross-layer evidence joining produces unified per-tenant observability matrix — the per-tenant operator program joins per- source-IP attribution from per-tenant DMARC RUA aggregate-XML rows AGAINST per-sending-MTA-IP attribution from per-tenant TLS-RPT JSON-aggregate rows on the same per-day cohort timeline, producing the per-tenant cross-layer observability matrix THIS page documents the application-layer leg of and the Workspace-MTA-STS spoke documents the transport-layer leg of. Read the Workspace-MTA-STS deployment spoke alongside this DMARC reporting- pipeline reference when architecting per-Workspace-tenant per-custom-domain cross-layer aggregate-report-ingestion program across the application-layer DMARC reporting-pipeline boundary and transport-layer TLS-RPT reporting- pipeline boundary. - DMARC for Microsoft 365
— the M365-TENANT-PER-CUSTOM-DOMAIN-DMARC-
RUA-AND-RUF-AGGREGATE-AND-FORENSIC-REPORT-
INGESTION-PROGRAM companion to this DMARC
reporting-pipeline reference. Where THIS
page documents the per-publisher per-domain
DMARC aggregate-report (RUA) and forensic-
report (RUF) reporting-pipeline contract
(the
rua=mailto:<aggregate-mailbox>andruf=mailto:<forensic-mailbox>DMARC-record-tag publication discipline per RFC 7489 §6.2, the daily per-receiver per-publisher per-domain aggregate-report emission cadence, the gz/zip-compressed XML schema delivery channel, and the per- publisher per-domain operator-side aggregate-report-ingestion + parsing + per-source-IP aggregation analytics pipeline), the M365-tenant spoke documents the per-M365-tenant per-custom-domain DMARC reporting-pipeline topology where the per-tenant per-custom-domain DMARC record'srua=mailto:/ruf=mailto:endpoints publish the per-tenant per-custom-domain DMARC aggregate-and-forensic-report ingestion channel that consumes the daily per- receiver per-tenant per-custom-domain XML/AFRF aggregate-and-forensic evidence stream the per-M365-tenant per-custom- domain Exchange Online Protection inbound email cascade routes. The per-M365-tenant per-custom-domain DMARC reporting-pipeline publication IS the per-tenant per-custom- domain canonical consumer of the DMARC reporting-pipeline contract THIS page architectures at four M365-tenant- deployment-vs-DMARC-reporting-pipeline coupling dimensions: (i) per-M365-tenant per-custom-domainrua=mailto:<dmarc-aggregate>@<tenant-domain>publication as per-tenant per-custom- domain daily-aggregate-report-ingestion channel — the per-M365-tenant per-custom- domain DMARC record'srua=-tag publication produces the per-tenant per-custom-domain daily per-receiver per-source-IP per-alignment- outcome XML aggregate-report-evidence- stream the per-M365-tenant per-custom- domain operator ingests through Exchange Online Protection's inbound-routing cascade; (ii) per-M365-tenant per-custom- domainruf=mailto:<dmarc-forensic>@<tenant-domain>publication as per-tenant per-custom- domain per-message-failure forensic-report ingestion channel — the per-M365-tenant per-custom-domain DMARC record'sruf=-tag publication produces the per-tenant per-custom-domain per- message DMARC-failure AFRF forensic- report-evidence-stream the per-M365-tenant per-custom-domain Defender for Office 365 security-incident-response pipeline consumes; (iii) per-M365-tenant per- custom-domain DMARC aggregate-report parser + per-source-IP analytics dashboard as Workspace-twin per-tenant per-custom- domain reporting-pipeline architecture — the per-M365-tenant per-custom-domain DMARC aggregate-report analytics pipeline IS the per-M365-tenant per-custom-domain twin of the per-Workspace-tenant per-custom-domain DMARC aggregate-report analytics pipeline documented at the cross-tenant-platform per- custom-domain aggregate-report-ingestion program; and (iv) per-M365-tenant per- custom-domain DMARC + TLS-RPT cross-layer aggregate-report-ingestion coordination as per-tenant per-custom-domain unified reporting-pipeline architecture — the per- M365-tenant per-custom-domain operator- side reporting-pipeline ingests BOTH the per-tenant per-custom-domain DMARC RUA application-layer aggregate-report stream AND the per-tenant per-custom-domain TLS- RPT transport-layer aggregate-report stream as the unified per-tenant per- custom-domain cross-layer-observability reporting-pipeline. Read THIS page when AUTHORING the per-publisher per-domain DMARC aggregate-and-forensic reporting- pipeline architecture at the canonical reporting-channel-contract reference layer; read the M365-tenant DMARC deployment spoke when AUDITING the per- M365-tenant per-custom-domain DMARC reporting-pipeline against the per-tenant per-custom-domain Exchange Online Protection inbound routing + Defender for Office 365 forensic-report consumption contract at the per-M365-tenant per- custom-domain reporting-pipeline ingestion boundary. - DMARC for Google Workspace — the parallel enterprise-mailbox-provider sibling to the Microsoft 365 spoke above. Where the M365 reference documents the per-tenant per-custom-domain Exchange Online Protection + Defender for Office 365 aggregate-and-forensic- report-ingestion contract, this Google Workspace reference documents the per-tenant per-custom- domain Gmail-receiver per-source-IP-attribution aggregate-report-ingestion contract — both feed the same per-publisher per-domain DMARC RUA aggregate-report-pipeline THIS page documents at the per-tenant per-custom-domain enterprise- mailbox-provider reporting-pipeline ingestion boundary.
- SPF for Microsoft 365
— the per-M365-tenant per-accepted-domain
envelope-MAIL-FROM-layer SPF publication-
discipline companion to this DMARC
reporting-pipeline reference. Where THIS
page documents the per-publisher per-
domain RFC 7489 §7 DMARC seven-stage end-
to-end aggregate-report pipeline (per-
receiver-side Stage 1 SPF + DKIM
verification, Stage 2 alignment evaluation,
Stage 3 composite verdict, Stage 4 per-
message evidence-row accumulation, Stage 5
per-day per-receiver aggregate-report
emission, Stage 6 per-publisher per-domain
operator-side analyzer ingestion, Stage 7
per-publisher per-domain policy-ramp
decision), the SPF-for-Microsoft-365 spoke
documents the per-M365-tenant per-
accepted-domain envelope-MAIL-FROM-layer
SPF publication discipline whose per-
message
include:spf.protection.outlook.comverdict IS the load-bearing per-tenant per-accepted-domain envelope-layer evidence-attribution input every per- publisher per-domain DMARC aggregate- report per-row evidence-row evaluates at Stage 1 receiver-side SPF verification. Four per-M365-tenant per-accepted-domain SPF-verdict-vs-DMARC-reporting-pipeline coupling dimensions matter at the per- publisher per-domain reporting-pipeline ingestion boundary: (i) per-M365-tenant per-accepted-domain SPF verdict as Stage 1 receiver-side verification input — the per-messagespf=pass/spf=fail/spf=softfail/spf=neutralverdict the per- receiver computes against the per-tenant published SPF record at Stage 1 IS the load-bearing per-tenant per-accepted- domain envelope-layer authentication-leg evaluation input the DMARC reporting- pipeline THIS page documents propagates through Stages 2–6 into the per-publisher per-domain operator-observable evidence stream; (ii) per-M365-tenant per-accepted- domain SPF alignment evaluation at Stage 2 — the per-message envelope-MAIL-FROM- domain vs RFC 5322 From-domain organisational-domain alignment evaluation the per-receiver applies at Stage 2 (Public-Suffix-List walk foraspf=rrelaxed mode, exact-domain match foraspf=sstrict mode) per RFC 7489 §3.1.1 IS the per-tenant per-accepted- domain envelope-layer alignment evidence the DMARC reporting-pipeline THIS page documents propagates as the per-tenant per-accepted-domain SPF-aligned-pass leg evidence-attribution at the Stage 3 composite-verdict boundary; (iii) per- M365-tenant per-accepted-domain forwarder- induced envelope-MAIL-FROM rewrite as Stage 1 SPF-fail evidence-row — the per- tenant per-accepted-domain forwarder-hop envelope-MAIL-FROM rewrite rewrites the per-message envelope sender to the per- forwarder address, breaking the per- tenant per-accepted-domain first-hop SPF verdict and surfacing asspf=failevidence-row at Stage 1 that the DMARC reporting-pipeline THIS page documents propagates as per- receiver-source-IP per-day evidence-row accumulation at Stage 4; (iv) per-M365- tenant per-accepted-domain composite DMARC-verdict-attribution at Stage 3 — the per-tenant per-accepted-domain DMARC composite-verdictpassrequires AT LEAST ONE aligned-pass leg (DKIM-aligned-pass OR SPF-aligned-pass); the per-tenant SPF-aligned-pass leg evaluation the SPF-for-Microsoft-365 spoke documents IS the per-tenant per-accepted- domain envelope-layer composite-verdict input the DMARC reporting-pipeline THIS page documents propagates through Stage 3 composite-verdict-attribution into the per-publisher per-domain operator- observable Stage 6 per-row analysis evidence stream. Read THIS page when AUTHORING the per-publisher per-domain DMARC reporting-pipeline ingestion discipline; read the SPF-for-Microsoft-365 spoke when AUTHORING the per-M365-tenant per-accepted-domain envelope-MAIL-FROM- layer SPF publication whose per-message envelope-layer verdict IS the per-tenant per-accepted-domain Stage 1 receiver-side SPF-verification input the DMARC reporting- pipeline THIS page documents propagates through the per-publisher per-domain seven-stage end-to-end aggregate-report pipeline. - DKIM DNS-TXT-RR byte-grammar publication
- DMARC identifier-alignment
- DMARC for shared-hosting providers
— the per-hosting-provider per-customer-
domain DMARC-aggregate-report-ingestion-at-
scale-vs-DMARC-ramp coordination companion to
this DMARC reporting-pipeline pillar. Where
THIS page documents the per-publisher per-
domain seven-stage DMARC aggregate-report
pipeline (Stage 1 per-receiver per-day RUA
emission per RFC 7489 §7.2, Stage 2 per-
publisher per-domain
rua=mailto:endpoint ingestion, Stage 3 composite-verdict-attribution, Stage 4-6 operator-observable evidence-row propagation, Stage 7 dashboard surfacing), the shared-hosting spoke documents the per- hosting-provider per-customer-domain ramp at which the seven-stage pipeline scales across the hosting-provider tenant portfolio. Four coupling axes connect them: (i) per-hosting- providerrua=mailto:dmarc@<hosting-provider>.netper-customer-domain DMARC TXT-RR publication MUST route per-customer-domain RUA aggregate- report streams into a hosting-provider- operated ingestion endpoint capable of scaling Stage 2 per-customer-domain report- routing across thousands of inbound RUA XML attachments per day; (ii) per-hosting- provider per-customer-domain Stage 3 composite-verdict-attribution MUST attribute per-customer-domainpolicy_evaluated/dkim+policy_evaluated/spf+dispositionevidence-rows back to the originating per-customer-domain tenant without cross-tenant attribution contamination — per-hosting-provider per-customer- domain RUA report-routing discipline IS the load-bearing multi-tenant operator-observability primitive; (iii) per-hosting-provider per- customer-domain Stage 6 per-row aligned-pass- rate evidence stream MUST surface to per- customer-domain operator dashboards (e.g. cPanel-Plesk-style per-customer reporting UI) such that per-customer-domain operators can observe their per-customer-domain DMARC- aligned-pass-rate floor trend independent of other tenants on the hosting-provider infrastructure; (iv) per-hosting-provider per-customer-domain DMARC enforcement-mode rampp=none → p=quarantine → p=rejectprogression IS gated by per-customer-domain DMARC-aligned-pass-rate floor observability in the per-customer-domain Stage 6 evidence stream — the per-hosting-provider per- customer-domain ramp-readiness-decision IS the per-receiver per-day per-customer-domain evidence-row attribution-trend the seven-stage pipeline THIS page documents emits. Read the shared-hosting spoke alongside this DMARC reporting-pipeline pillar when AUTHORING per- hosting-provider per-customer-domain RUA report-routing infrastructure, when AUDITING per-customer-domain Stage 6 evidence-stream attribution discipline across the hosting- provider tenant portfolio, or when PLANNING per-hosting-provider per-customer-domain DMARC enforcement-mode ramp sequencing against per-customer-domain DMARC-aligned- pass-rate floor trend visibility. - Reverse DNS PTR records
- DANE for SMTP (RFC 7672) explained
— the PER-PUBLISHER-PER-DOMAIN-
DMARC-RUA-AGGREGATE-REPORT-PIPELINE-AS-
STRUCTURALLY-PARALLEL-APPLICATION-LAYER-
EVIDENCE-PIPELINE-COMPANION-TO-DANE-
DRIVEN-TLS-RPT-TRANSPORT-LAYER-AGGREGATE-
EVIDENCE-PIPELINE companion to this DMARC
reporting-pipeline reference. Where THIS
page documents the per-publisher per-
domain DMARC RUA aggregate-XML report-
emission pipeline (per RFC 7489 §7.2 per-
receiver per-day per-source-IP per-row
attribution evidence-stream, six-stage
pipeline architecture: per-receiver per-
day report-generation → per-receiver per-
day report-emission → per-publisher per-
domain RUA destination-resolution → per-
publisher per-domain RUA-mailbox ingestion
→ per-publisher per-domain XML parse +
per-row attribution-extraction → per-
publisher per-domain operational-evidence-
stream consumption), the DANE-explained
spoke is the STRUCTURALLY-PARALLEL
transport-layer cryptographic-authorization-
leg publication-discipline companion whose
per-publisher per-MX-host TLSA-RR
publication-discipline drives the per-
publisher per-domain TLS-RPT JSON
aggregate-report-emission pipeline per
RFC 8460 at FOUR per-publisher per-domain
DMARC-RUA-vs-DANE-TLS-RPT coupling
dimensions: (i) per-publisher
per-domain DMARC RUA aggregate-XML report-
emission pipeline vs per-publisher per-
MX-host DANE-driven TLS-RPT JSON aggregate-
report-emission pipeline protocol-layer
parallel — per-publisher
per-domain DMARC RUA aggregate-XML report
per RFC 7489 §7.2 surfaces per-receiver
per-day per-source-IP per-row application-
layer authentication-leg verdict-evidence;
per-publisher per-MX-host TLS-RPT JSON
aggregate report per RFC 8460 surfaces
per-receiver per-day per-MTA-connection
transport-layer TLS-cert-authorization-
verdict-evidence (DANE-EE/DANE-TA cert-
usage evaluation outcome, STARTTLS-success-
rate floor, TLS-handshake-failed bounce-
attribution) — both per-publisher
per-domain per-receiver-emitted aggregate-
evidence streams converge in per-publisher
per-domain composite anti-spoofing-and-
anti-downgrade defense-portfolio
operational-observability floor; (ii)
per-publisher per-domain DMARC
RUA destination-resolution publication
discipline (
rua=mailto:<aggregate-URI>publication-decision per RFC 7489 §7.2) vs per-publisher per-MX-host TLS-RPT destination-resolution publication discipline (v=TLSRPTv1; rua=mailto:<tls-rpt-URI>publication at_smtp._tls.<domain>per RFC 8460 §3) — both per-publisher per-domain operator-side aggregate-evidence-destination publication- decisions are per-publisher per-domain DNSSEC-validatable RR publication- discipline primitives whose joint per- publisher per-domain publication-portfolio coordination underpins the per-publisher per-domain composite aggregate-evidence- observability floor; (iii) per- publisher per-domain DMARC RUA per-rowpolicy_evaluated/dkim+policy_evaluated/spfattribution per RFC 7489 §6.6.1 vs per- publisher per-MX-host TLS-RPTfailure-detailsattribution per RFC 8460 §4 — per- publisher per-domain DMARC RUA per-row application-layer authentication-leg verdict-attribution IS structurally parallel to per-publisher per-MX-host TLS-RPT failure-details transport-layer cryptographic-authorization-failure attribution — both per-publisher per-domain per-receiver-emitted aggregate-evidence streams provide per- publisher per-domain operator-actionable per-failure-class diagnostic-ladder evidence at the per-publisher per-domain composite cross-layer aggregate-evidence- observability coordination boundary; (iv) per-publisher per-domain DMARC RUA aggregate-XML six-stage pipeline architecture vs per-publisher per-MX- host TLS-RPT JSON aggregate-report- pipeline architecture protocol-layer parallel — per-publisher per-domain DMARC RUA six-stage architecture THIS page documents (per-receiver per-day report-generation → per-publisher per- domain operational-evidence consumption) IS structurally parallel to per-publisher per-MX-host TLS-RPT JSON aggregate- report-pipeline architecture per RFC 8460 — both per-publisher per-domain per-receiver-emitted aggregate-evidence pipelines instantiate the SAME per- publisher per-domain operator-side per- day aggregate-evidence ingestion-and- observability discipline at the per- publisher per-domain composite cross- layer aggregate-evidence-pipeline coordination boundary. Read the DANE- explained spoke WITH this DMARC RUA aggregate-reporting-pipeline reference when AUTHORING per-publisher per-domain composite cross-layer aggregate-evidence- observability publication-discipline portfolio whose joint per-publisher per- domain RUA-and-TLS-RPT-aggregate-evidence- ingestion coordination directly drives the per-publisher per-domain operational- evidence-floor THIS DMARC RUA aggregate- reporting-pipeline page documents the per-publisher per-domain operational- evidence-stream of at the per-publisher per-domain composite cross-layer aggregate-evidence-pipeline-and- operational-observability coordination boundary. - DNS propagation
— the DNS-timing companion to this
reporting-pipeline page. Where this page documents
the per-publisher per-domain DMARC aggregate-report
ingestion pipeline (the
rua=mailto:URI publication, the daily gz/zip aggregate-report delivery, the parse-and-store path, the per-row per-source-IP attribution stream), the DNS-propagation spoke documents the TTL timing that shapes what the pipeline observes: a freshly-published_dmarc.<domain>record (or an editedrua=URI) is not honoured by every receiver until the prior record's TTL expires, so reporting can appear to start late or arrive from a stale policy for a window after a change. Equally, when the operator edits an SPF or DKIM record to fix a failing source, the improvement does not show up in the aggregate stream this pipeline ingests until propagation completes — so a still-failing row in today's report may simply reflect yesterday's not-yet-propagated record. Read the DNS-propagation spoke when interpreting a lag between a record change and its appearance in the aggregate-report stream this pipeline page documents. - DKIM explained (cryptographic message signing, the public key published in DNS at
<selector>._domainkey, and how the receiver verifies the DKIM-Signature) — every aggregate row this pipeline ingests carries a per-message DKIM verdict in its<auth_results>and<policy_evaluated>elements. Read the DKIM primer to understand what adkim=passvsdkim=failattribution actually means before you act on the aggregate stream this page documents. - SPF explained (the envelope-MAIL-FROM authorization check, the
v=spf1record published in DNS, and receiver-side mechanism evaluation per RFC 7208) — alongside the DKIM verdict, every<record>this pipeline ingests carries a per-messagespf=result and an SPF-alignment attribution in its<auth_results>and<policy_evaluated>elements. Read the SPF primer to understand what anspf=passvsspf=failrow actually means before acting on the aggregate stream this page documents. - Microsoft SNDS + JMRP monitoring — the third leg of the sender-observability triad alongside DMARC aggregate reports and TLS-RPT: per-IP spam-filter verdicts and Junk-click complaints from Microsoft's consumer network (Outlook.com/Hotmail), fetched via the 30-day Automated Data Access key.
Get started
Create a free account to ingest your own
DMARC reports through the same six-stage
pipeline documented here. The DMARC
Analyzer project ships
includes/DmarcParser.php,
includes/ForensicReportParser.php,
includes/ImapFetcher.php, and
includes/GraphFetcher.php
as a working reference implementation.