How this check works
The validator implements the check_host() algorithm from RFC 7208. It fetches the domain's SPF record, walks its mechanisms in order, follows include: and redirect=, resolves a and mx targets, expands macros, and enforces the 10-lookup and 2-void-lookup limits. The envelope sender is assumed to be postmaster@ the domain; that only matters for records that use sender macros.
Whole ranges in one pass
Enter a CIDR range such as 198.51.100.0/24 and the validator evaluates every address in it at once. Each mechanism claims the part of the range it matches, so the result is exact for every address, not a sample. Terms whose result depends on the individual address (ptr, or macros such as %{i}) are evaluated address by address for ranges of up to 256 addresses, and marked indeterminate for larger ones.
How to read the results
- Authorised: every address gets SPF pass.
- Partially authorised: some sub-ranges pass and others don't. The table shows each sub-range, its result, and the chain of terms that decided it, e.g.
example.com → include:_spf.vendor.example → ip4:198.51.100.0/25. - Not authorised: no address passes. The result tells you why:
fail(explicitly rejected by-all),softfail(~all),neutral,none(no record),permerror(broken record) ortemperror(DNS failure). - Records evaluated lists every SPF record fetched, indented by include depth.
Typical uses
- Onboarding a mail relay or a new ESP: confirm its published range is fully covered before switching traffic.
- Explaining a softfail in a bounce: enter the sending IP from the headers and see which term it reached.
- Auditing after a cleanup: check that removing an include didn't drop a range you still use.
If evaluation stops with a permerror at the lookup limit, see fixing "SPF too many DNS lookups". For the anatomy of a record, see SPF explained.
Updated 26 October 2026