Email security check: SPF, DKIM and DMARC
SPF, DMARC, DKIM, MTA-STS, TLS-RPT, CAA, DNSSEC and nameserver redundancy.
Last reviewed
Weight in the score
20%
One of six modules, scoring policy v2.1.0
Sources
- DNS
Email is the easiest way to impersonate an organisation. Anyone can send a message that claims to come from your domain. SPF, DKIM and DMARC are the records that let receiving mail servers tell a real message from a forged one, and they are published in public DNS, so they can be read from the outside.
We read those records and check whether they actually protect you, not only whether they exist. An SPF record that ends in +all authorises every server on the internet, and a DMARC policy of p=none asks receivers to take no action. Both look configured and neither stops spoofing.
The rest of the module covers the transport and the zone around your mail: whether MTA-STS is enforced, whether TLS reporting is set up, whether CAA limits who can issue certificates for you, whether DNSSEC is enabled, and whether you have enough nameservers. Mail-transport checks only apply to domains that receive mail.
Findings this module can raise
Every finding in a report says what was tested, why it matters, the impact and how to fix it. These are the findings this module can raise, most serious first. Terms are explained in the glossary.
Highseverity 70 to 89
70
DMARC record missing
DMARC builds on SPF and DKIM to provide email authentication and reporting
How to fix it: Publish a DMARC TXT record at
_dmarc.<your-domain>starting withv=DMARC1; p=none; rua=mailto:dmarc@<your-domain>. Monitor aggregate reports for 30 days, then graduate top=quarantineand finallyp=rejectonce SPF/DKIM are aligned for all legitimate senders.What was tested and the impactHide details
- What was tested
- DNS DMARC record lookup
- Impact
- Missing DMARC leaves email authentication incomplete and vulnerable to spoofing
Mediumseverity 40 to 69
65
Insufficient nameservers
Fewer than two nameservers means there is no redundancy in the one system every other service depends on. RFC 1034 has recommended at least two, on separate networks, since 1987.
How to fix it: Add at least one more nameserver, ideally with a different provider or at minimum in a different network and location. Most managed DNS providers supply four by default; if you are running your own, this is a strong argument for moving to a managed service.
What was tested and the impactHide details
- What was tested
- The count of NS records for the domain
- Impact
- If the single nameserver becomes unreachable, the domain stops resolving entirely: website, email, and every API integration fail at once, and cached answers expire progressively so the outage spreads rather than appearing instantly. It is also trivially easy to overwhelm with traffic.
60
SPF record missing
SPF prevents email spoofing by specifying authorized mail servers
How to fix it: Publish an SPF TXT record at the apex of your domain. Start with
v=spf1 include:<your-mail-provider> ~all(e.g.include:_spf.google.comfor Google Workspace,include:spf.protection.outlook.comfor M365). After 30 days of clean DMARC reports, harden to-all.What was tested and the impactHide details
- What was tested
- DNS SPF record lookup
- Impact
- Without SPF, attackers can send convincing phishing emails from your domain
60
DNSSEC not enabled
DNSSEC cryptographically signs DNS records to prevent spoofing
How to fix it: Enable DNSSEC at your DNS provider (Route53, Cloudflare, and Google DNS all offer one-click enablement). Verify the DS record is published at your registrar so the signing chain is anchored at the TLD; until the DS is in place at the registrar, DNSSEC is configured but not actually validated.
What was tested and the impactHide details
- What was tested
- DNS DNSSEC validation
- Impact
- Without DNSSEC, DNS responses can be intercepted and modified
55
DMARC policy set to none
DMARC is published but set to
p=none, which asks receivers to report on failures while still delivering the mail. It is the correct place to start, and the wrong place to stop.How to fix it: Read your aggregate reports until every legitimate sender passes SPF or DKIM alignment, then move to
p=quarantine(optionally withpct=to ramp gradually), and finallyp=reject. Most domains stall atnoneindefinitely; treat this as a project with an end date rather than a permanent state.What was tested and the impactHide details
- What was tested
- The policy (
p=) value in the DMARC record - Impact
- Spoofed mail from your domain is still delivered to recipients. You gain visibility through aggregate reports, but no protection: anyone can send as your domain and it will land in the inbox.
50
SPF record invalid
An SPF record with a syntax error is not partially effective: receivers that cannot parse it generally treat it as
permerrorand ignore it entirely. The domain is left with no SPF protection while appearing configured.How to fix it: Validate the record with an SPF checker. The usual causes are more than one
v=spf1record on the domain (only one is permitted), exceeding the ten-DNS-lookup limit, or a stray character. Consolidate to a single record and useinclude:for third-party senders.What was tested and the impactHide details
- What was tested
- Syntax of the published SPF TXT record
- Impact
- Spoofed mail claiming to come from your domain passes unchecked, and DMARC cannot reach a pass verdict through SPF alignment, weakening it too. The failure is silent: nothing warns you that the record you published is being discarded.
50
CAA record missing
CAA records prevent unauthorized SSL certificate issuance
How to fix it: Publish CAA records naming your authorized CA(s), e.g.
0 issue "letsencrypt.org"and0 issue "digicert.com". Add0 iodef "mailto:security@<your-domain>"so you receive notifications when issuance is attempted by a non-authorized CA.What was tested and the impactHide details
- What was tested
- DNS CAA record lookup
- Impact
- Attackers could obtain fraudulent certificates for phishing sites
45
MTA-STS policy not enforced
MTA-STS tells sending servers to require TLS for your domain. In "testing" mode they report failures but deliver anyway, so the policy provides no actual protection.
How to fix it: Confirm from your TLS-RPT reports that legitimate senders are succeeding, then change the policy
modetoenforce. Keep the same max_age so caches roll over cleanly.What was tested and the impactHide details
- What was tested
- The _mta-sts TXT record and the published policy file
- Impact
- Mail can still be delivered over an unencrypted or downgraded connection, which is exactly what MTA-STS exists to prevent. The published policy gives a false impression of protection.
45
SPF record has no all mechanism
The
allmechanism decides what receivers do with mail from servers not listed in the record.+allauthorises the entire internet; noallat all leaves it neutral.How to fix it: End the record with
-all(reject) once you are confident every legitimate sender is listed, or~all(softfail) while you verify. Use your DMARC aggregate reports to find senders you have missed before tightening.What was tested and the impactHide details
- What was tested
- The qualifier on the SPF record's
allmechanism - Impact
- Anyone can send mail claiming to be from your domain and pass SPF. This also breaks DMARC, which relies on SPF or DKIM alignment to make a pass/fail decision.
Lowseverity 0 to 39
30
TLS reporting not configured
TLS-RPT is where receiving servers send daily reports about failures to deliver mail to you over TLS.
How to fix it: Publish a TXT record at _smtp._tls with
v=TLSRPTv1; rua=mailto:.... Point it at a monitored mailbox or a reporting service; the reports are JSON and small.What was tested and the impactHide details
- What was tested
- The _smtp._tls TXT record
- Impact
- Without it, a certificate expiring on your mail servers, or an active downgrade attack, produces no signal at all until users report missing mail.
Depends on the evidenceseverity set by what is found
varies
DKIM key below recommended size
DKIM signatures prove a message really came from your domain. The strength of that proof is the key size; RFC 8301 sets 1024 bits as the floor and recommends 2048.
How to fix it: Generate a 2048-bit key at a new selector, publish it, switch signing to the new selector, then retire the old one after a fortnight so mail already in flight still verifies.
What was tested and the impactHide details
- What was tested
- The RSA modulus of every DKIM public key found by selector probing
- Impact
- A key that can be factored lets an attacker forge signatures that pass authentication, defeating DMARC entirely. Some large receivers already treat sub-1024-bit signatures as invalid.