Tools

SPF record checker

An SPF record checker retrieves the sender policy a domain publishes, confirms exactly one well-formed record exists, expands the include tree to count the DNS lookups it costs, and reads the qualifier the record ends with. Two of those cause silent, total failure: a second record, and an expansion that exceeds ten lookups. In both cases receivers stop evaluating and the domain is treated as having no policy — which is not a partial failure but a complete one.

The ten-lookup budget, which is the finding that catches people

SPF is recursive. Each include, each redirect and several other mechanisms cost a DNS lookup, and the includes have their own includes.

The specification caps the total at ten. Above it, receivers return a permanent error and stop — they do not evaluate what they already retrieved.

The cost is therefore not the length of your record. A record with three includes can be well over budget because one of those providers publishes a tree five levels deep.

Which is why it breaks without anyone changing anything: a provider restructures its own record, your expansion crosses ten, and your mail starts failing authentication on a day you deployed nothing.

The consequence reaches further than SPF. A permanent error means no SPF pass, which removes one of the two ways a message can align under DMARC.

The qualifier the record ends with

A record ending in a hard fail asks receivers to reject mail from anywhere else. A soft fail asks them to accept it and mark it, which is the usual and reasonable position during a rollout.

A neutral ending gives receivers no reason to treat a forgery differently from legitimate mail. It parses, it passes validation, and it protects nothing.

A pass-all ending authorises the entire internet to send as the domain. It is rare, it is almost always a mistake, and it is worse than publishing no record at all because it looks like a policy.

Ending with a soft fail long-term is a defensible choice. Ending with a neutral or a pass-all is a defect, and the difference is one character.

The other validations

Exactly one record. Several SPF records is a permanent error under the specification, and receivers treat the domain as having no SPF — the same silent total failure as exceeding the lookup budget.

Valid syntax. An unparseable record is discarded, and the usual causes are a stray character from a DNS editor or a record split across TXT strings incorrectly.

Absence of the deprecated reverse-lookup mechanism, which is slow, unreliable and explicitly deprecated by the specification. Several receivers ignore it entirely, so a record relying on it is relying on nothing.

That the record is published at the domain apex, since that is where receivers look for it.

What a clean result looks like

One record, valid syntax, expansion comfortably under ten lookups with room for a provider to grow its own tree.

A restrictive ending — hard fail, or soft fail as a deliberate position rather than a leftover.

No deprecated mechanism, and no include for a provider the domain stopped using two migrations ago.

An expansion you recognise: every include belongs to a service that really sends mail as this domain.

What VeriFixScan uses

`email.spf.present` retrieves the record. `email.spf.single` verifies uniqueness and `email.spf.syntax` verifies it parses.

`email.spf.lookups` expands the include tree and counts it against the ten-lookup limit. `email.spf.all` reads the ending qualifier. `email.spf.ptr` detects the deprecated mechanism.

`email.spoofing_exposure` combines the result with DMARC and DKIM, because SPF on its own does not establish whether a domain can be forged.

The limits, stated plainly

The expansion is evaluated as published at the moment of the query. A provider changing its own record changes your count without touching yours.

SPF authenticates the envelope sender, not the address a recipient sees. A passing record does not prevent the visible sender being forged — that is what DMARC alignment is for.

Whether legitimate mail passes cannot be established from the record alone. A source missing from the record fails, and only the DMARC aggregate reports show which sources those are.

No mail is sent and no message is examined.

Frequently asked questions

My SPF record has not changed — why does it now exceed ten lookups?
Because the limit counts the whole expansion, including what your providers publish. When one of them restructures its record, your total moves without your record being touched.
Is ending with a soft fail acceptable?
Yes, as a deliberate position — it asks receivers to accept and mark rather than reject. What is not acceptable is a neutral or pass-all ending, which gives receivers no basis to treat a forgery differently.
Does a passing SPF record stop spoofing?
Not on its own. SPF authenticates the envelope sender; recipients see the header address. Connecting the two is what DMARC alignment does, which is why the three checks are read together.

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