Free · no sign-up
SPF record checker
Paste a domain. We read its SPF record live, count the DNS lookups it costs, and tell you what to change. DNS lookups only; nothing about your domain is stored.
What an SPF record is
SPF is a TXT record on your domain that lists the servers allowed to send mail whose envelope sender is that domain. A receiving server looks the record up, compares the connecting IP address, and decides pass or fail. It is checked per domain name: a subdomain does not inherit its parent's record.
Two things trip up most cold email setups. Every tool that sends for you has to be in the one record, and the record can only cost so many DNS lookups.
| Part | What it does |
|---|---|
v=spf1 | Starts every SPF record. A TXT record that does not start with it is not SPF. |
include:_spf.google.com | Authorizes whatever that domain's own SPF record authorizes. This is how Google Workspace, Microsoft 365 and sending tools are added. Each include costs a lookup, plus the lookups inside it. |
ip4:203.0.113.7 or ip6:… | Authorizes one address or range directly. Costs no lookup. |
a, mx | Authorizes the addresses of your own A or MX records. Each costs a lookup. |
~all or -all | What to do with every other sender: ~all soft-fails them, -all fails them. Ends the record. ?all is neutral and +all authorizes everyone. |
Common errors and how to fix them
- Two SPF records
RFC 7208 says a domain with more than one SPF record gets a permerror result. It is the most common mistake after adding a new sending tool: someone publishes a second record instead of editing the first.
Fix: Merge them into one record, with every include in it. - More than 10 lookups
RFC 7208 limits an SPF check to 10 terms that cause DNS lookups. The count includes the lookups inside every include, which is why a few tools can add up fast. Past the limit the check fails with a permerror, as if you had no SPF.
Fix: Remove includes for tools you no longer use, replace includes withip4:where a provider's addresses are stable, or send the tool's mail from a subdomain with its own record. - Ending in
+all+allauthorizes every server on the internet to send as you, which makes the record pointless.
Fix: End the record with~allwhile you are still finding senders, then-all. - The
ptrmechanism
RFC 7208 says the ptr mechanism should not be published. It is slow and costs lookups.
Fix: Replace it withinclude:orip4:terms for the senders you actually use. - A sender is missing
Mail from a tool that is not in the record fails SPF even though the record is valid. Look at the Authentication-Results header of a message it sent.
Fix: Add the include the tool documents, in the same record. - No SPF record at all
Receivers have nothing to check, and mail from a new domain with no authentication is the easiest to reject.
Fix: Publish one TXT record starting withv=spf1.
Examples
Illustrative records, not yours. Use the includes your own providers document.
One mailbox provider, one sending tool
v=spf1 include:_spf.google.com include:sendgrid.net ~allA fixed server plus a provider, strict ending
v=spf1 ip4:203.0.113.7 include:_spf.google.com -allBroken: two records for one domain
v=spf1 include:_spf.google.com ~all
v=spf1 include:sendgrid.net ~allQuestions
Should I end in ~all or -all?
~all asks receivers to treat other senders as suspicious; -all asks them to fail it. Many teams start with ~all and move to -all once every sender is known. With DMARC in place, the difference matters less.Does SPF stop spoofing on its own?
What do the 10 lookups count?
Do I need SPF on a domain that only sends cold email?
Do you store what I check?
Outlevo checks this before every campaign
A sender whose SPF fails is held, with the reason, until it is fixed.