SPF checker
Parses your SPF record, resolves the full include chain, and shows exactly how many of the ten permitted DNS lookups you use and where they go.
The lookup limit is the thing that breaks
RFC 7208 §4.6.4 limits SPF evaluation to ten DNS-querying terms. The terms that count
are include, a, mx, ptr, exists and the
redirect modifier. all, ip4 and ip6 are free.
The part that catches people out: the limit applies to terms evaluated across the entire chain
your record expands into, not the terms you can see in your own record. An include
of a provider that itself includes two more costs you three, not one. A record with six visible includes
can be over the limit.
Exceeding it is not a warning. Evaluation returns permerror and no sender obtains an SPF
pass. This checker resolves the whole chain and prints it, so you can see which provider is consuming
the budget rather than guessing.
Other things that silently break SPF
- Two records. More than one SPF record at the same name produces
permerror. This usually happens when a new service is onboarded and adds its own record rather than editing the existing one. It is worse than having no SPF, because you believe you have one. - Void lookups. More than two lookups returning nothing also produces
permerror. Usually leftover includes for services that were removed. - No terminal mechanism. Without
all, evaluation ends inneutral, which asserts nothing. - +all. Authorises the entire internet. Almost always a placeholder that escaped.
Reducing lookups
- Remove services that no longer send. This is usually the biggest win and costs nothing.
- Replace a broad
includewith the specificip4/ip6ranges it resolves to, at the cost of having to maintain them when the provider changes. - Move a bulk sender to its own subdomain with its own SPF record and its own budget.