Website problems

DMARC at p=none

DMARC ties SPF and DKIM results to the domain a recipient actually sees in the From: header, and tells receiving servers what to do when neither aligns. A policy of `p=none` tells them to do nothing: failing mail is delivered exactly as if no DMARC record existed. The record still earns its keep by producing aggregate reports, which are the only practical way to discover every service sending in your name — but a domain left at `p=none` can be spoofed as though it had published nothing at all.

What alignment adds

SPF authenticates the envelope sender, a technical address the recipient never sees. DKIM signs the message with a domain's key. Either can pass while the visible From: shows a completely different domain.

DMARC requires that a passing SPF or DKIM result belong to the same domain as the From: header. That is alignment, and it is what makes DMARC the mechanism that stops exact-domain spoofing.

So a message can pass SPF and still fail DMARC. This surprises people and it is the design working as intended.

Alignment can be relaxed — matching the organisational domain — or strict, matching exactly. Relaxed is the default and is right for most organisations, because subdomains are commonly used for sending.

The three policies

`p=none`: take no action, send reports. A monitoring mode, and the state most domains stop in.

`p=quarantine`: treat failing mail as suspicious, typically delivering it to spam.

`p=reject`: refuse it outright. The end state, and the only one that prevents exact-domain spoofing.

`pct=` applies the policy to a percentage of messages, which is how a move to quarantine or reject is rolled out gradually rather than all at once.

`sp=` sets the policy for subdomains. Without it, subdomains inherit the organisational policy — which means a `p=reject` on the apex covers a subdomain nobody configured, for better and for worse.

Why so many domains stop at none

Because moving forward requires knowing every system that sends in your name, and nobody does at the start.

The reports answer that, and they arrive as gzipped XML from dozens of providers daily — unreadable without processing, which is why they are so often published and then ignored.

The list they produce is always longer than expected: a CRM sending from a salesperson's address, an invoicing tool, a recruitment system, a survey platform, a support desk, a scheduling tool, a monitoring alert.

Each has to be brought into alignment or accepted as a loss before enforcement. That is real work, and it is the reason the last step is postponed indefinitely.

The cost of postponing it is precise: the domain remains spoofable, and the reports pile up unread.

How to reach enforcement safely

Publish `p=none` with a `rua=` address and collect reports for several weeks. Send them to a mailbox with a processing tool, not to a person.

Work through every sender the reports name. Bring each into alignment — add it to SPF, or set up DKIM signing with your domain — or decide its mail can fail.

Move to `p=quarantine` with a low `pct=` and watch. A missed sender now appears as a small number of complaints rather than as every message failing.

Raise `pct=` in stages, then move to `p=reject` once the reports show only illegitimate mail failing.

Set `sp=reject` for subdomains that never send, which closes the most commonly forgotten spoofing route.

Rushing this rejects your own invoices. Staying at none protects nothing. The staged path is the whole answer.

How to check it yourself

`dig _dmarc.example.com TXT +short`. The record lives on the `_dmarc` subdomain, not the apex, which is a frequent reason people believe they published one when they did not.

Read `p=` first. Then check whether `rua=` is present, since a policy of none without reporting gains nothing at all.

Check `sp=`, and check the subdomains you actually send from.

For a specific message, the `Authentication-Results` header written by the receiving server reports the DMARC result and why — which is where an alignment failure is stated plainly.

How VeriFixScan detects it

`email.dmarc.present` and `email.dmarc.policy` read the record and report the policy in force, including when it is `none`.

`email.dmarc.alignment`, `email.dmarc.pct` and `email.dmarc.subdomain` report the alignment mode, the rollout percentage and the subdomain policy.

`email.dmarc.rua` and `email.dmarc.ruf` report the reporting addresses, which decide whether the monitoring the policy enables is actually reaching anyone.

`email.spoofing_exposure` combines the SPF, DKIM and DMARC state into the practical question the record exists to answer: whether this domain can be spoofed.

Frequently asked questions

Is p=none enough?
It provides visibility and no protection. Mail failing authentication is still delivered, so a domain at p=none can be spoofed exactly as if DMARC were absent.
Why does mail fail DMARC when SPF passes?
Because of alignment. SPF authenticates the envelope sender; if that domain differs from the visible From: domain, DMARC does not count the pass. Forwarding and third-party senders commonly cause this.
Where does the DMARC record live?
On the _dmarc subdomain: _dmarc.example.com, not example.com. Publishing it on the apex is a common reason a record appears to have no effect.

Sources

Related

VeriFixScan crawls a site and applies its checks to every page it reaches, keeping the evidence behind each finding. Scanning one website is free.

Scan a website