SPF record lookup tool that expands every include

Type a domain into this free SPF record lookup tool to see every sender it allows, who each include belongs to, and the lookups it costs.

Try:

Only the domain is sent, to Cloudflare's public DNS resolver. Nothing is stored.

How to read SPF, DMARC and MX

Reading an SPF record

One SPF record per domain

A domain may publish only one SPF record, the TXT record that starts with v=spf1. With two or more, receivers stop with permerror and SPF fails for every message. Merge every sender into one record.

What the sign before each term means

Each mechanism can start with a qualifier. With none, it is +. The qualifier of the first mechanism that matches the sending server is the result.

+ (or no sign)
pass. The server may send for the domain.
-
fail. The server may not send for the domain.
~
softfail. The server is probably not allowed.
?
neutral. The domain says nothing either way.

The all at the end

all matches every server, so it sets what happens to servers the record did not list. -all fails them and ~all soft fails them. +all (or a bare all) lets any server on the internet pass, and ?all says nothing. Terms after all are never checked. A record with no all and no redirect ends as neutral.

include and redirect

include checks another domain's SPF record and matches when that record passes. If the included domain has no SPF record, the whole check ends in permerror. redirect hands the check to another domain's record, and is ignored when the record has an all anywhere.

The SPF lookup limit of 10

At most 10 DNS lookups

Receivers count the terms that need a DNS lookup, across the record and every record it includes. include, a, mx, ptr, exists and redirect count. all, ip4, ip6 and exp do not. Past 10, the check returns permerror and SPF fails. Google also says a record can have up to 10 include tags.

Counts
include, a, mx, ptr, exists, redirect
Does not count
all, ip4, ip6, exp

At most 2 void lookups

A void lookup is a lookup that finds nothing, either an empty answer or a name that does not exist. Receivers should stop after two of them, with permerror. A stale include for a service you left is the usual cause.

An mx term may name at most 10 mail hosts

Checking one mx term must not look up more than 10 address records, so a domain with more than 10 MX hosts breaks an mx term that points at it.

Reading a DMARC record

Where the DMARC record lives

The DMARC record is a TXT record at _dmarc under the domain, for example _dmarc.example.com. It starts with v=DMARC1. If that name has no record, receivers look at each parent name in turn, one label at a time. Two or more DMARC records at one name are all discarded. RFC 9989 replaced RFC 7489 as the DMARC standard in May 2026.

What p=none means

p=none states no preference about mail that fails DMARC. It still turns on the reports when rua is set. Gmail accepts p=none from senders of more than 5,000 messages a day to Gmail accounts, who must publish a DMARC record.

DMARC tags

v Version
Must be DMARC1 and must be the first tag. Otherwise receivers ignore the whole record.
p Policy
What the domain asks receivers to do with mail that fails DMARC. Without it, receivers treat the record as p=none. none: No preference is stated. quarantine: Failing mail is suspicious. reject: Failing mail is not valid use of the domain.
sp Subdomain policy
The policy for subdomains that exist. When it is missing, p applies to subdomains too. Default: same as p.
np Non-existent subdomain policy
The policy for subdomains that do not exist in DNS. When it is missing, sp applies, or p when sp is missing too. Default: same as sp, or p.
t Test mode
Says whether the domain is testing its policy. It does not change the reports. Default: n. y: Testing. Receivers apply one level below the stated policy. n: Apply the policy as stated.
psd Public suffix flag
Says whether the domain is a public suffix, a name under which others register their domains. Default: u. y: The domain is a public suffix. n: Not a public suffix. The domain is the organizational domain for itself and its subdomains. u: Not a public suffix. The lookup up the DNS tree decides the organizational domain.
rua Aggregate reports
Where receivers send summary reports, as a comma-separated list of addresses. Receivers only have to support mailto addresses. Without it, receivers send no aggregate reports. Default: no reports.
ruf Failure reports
Where receivers send a report about each failing message, as a comma-separated list of addresses. Without it, receivers send no failure reports. Default: no reports.
adkim DKIM alignment
How closely the DKIM signing domain must match the From domain. Default: r. r: Relaxed. The same organizational domain is enough. s: Strict. The exact same name.
aspf SPF alignment
How closely the SPF domain (the envelope sender) must match the From domain. Default: r. r: Relaxed. The same organizational domain is enough. s: Strict. The exact same name.
fo Failure report options
When to send a failure report. Ignored without ruf. Default: 0. 0: When every check fails to give an aligned pass. 1: When any check gives something other than an aligned pass. d: When a DKIM signature fails. s: When SPF fails.
pct Percentage (retired)
Retired by RFC 9989 and marked historic. Under RFC 7489 it was the share of failing mail the policy applied to. t=y is meant to work like pct=0, and t=n like pct=100.
rf Failure report format (retired)
Retired by RFC 9989 and marked historic.
ri Report interval (retired)
Retired by RFC 9989 and marked historic.

Reading MX records

MX preference

Each MX record has a preference number. Senders try the lowest number first.

No MX record

With no MX record, senders deliver to the domain's own address record, as if it were an MX with preference 0.

Null MX

A single MX record with preference 0 and the host . says the domain accepts no email. Mail to it fails at once.

Mail hosts and gateways this tool recognises (11)
Google WorkspaceMail host
Google's business mail. The MX value is smtp.google.com with priority 1. Domains set up before 2023 may have older values that start with aspmx, which still work.
Microsoft 365 (Exchange Online)Mail host
Microsoft's business mail. The MX value is your MX token followed by .mail.protection.outlook.com. Microsoft is moving these hosts to subdomains under mx.microsoft, for domains that turn on DNSSEC and for part of new domains from July 1, 2026.
Zoho MailMail host
Zoho's mail service. The MX values are mx.zoho.com (10), mx2.zoho.com (20) and mx3.zoho.com (50). The ending after zoho changes with the data center that holds the account.
FastmailMail host
Fastmail's mail service. The MX values are in1-smtp.messagingengine.com (10) and in2-smtp.messagingengine.com (20).
Proton MailMail host
Proton's mail service. The MX values are mail.protonmail.ch (10) and mailsec.protonmail.ch (20).
iCloud Mail (custom domain)Mail host
Apple's mail service for a custom domain. The MX values are mx01.mail.icloud.com and mx02.mail.icloud.com, both priority 10.
Mailgun (inbound routes)Mail host
Mailgun receives mail for a domain that uses its inbound routes. The MX values are mxa.mailgun.org and mxb.mailgun.org, both priority 10.
Sophos EmailSecurity gateway
A mail security gateway. Mail reaches it first and it passes clean mail on. Its MX hosts end in prod.hydra.sophos.com (United States, Germany, Ireland) or in an eml100 subdomain of ctr.sophos.com (Canada, Australia, Japan, India, Brazil, UAE).
Cisco Secure Email Cloud GatewaySecurity gateway
A mail security gateway. Its MX hosts are named for the customer's allocation under iphmx.com, such as mx1.hc1234-49.iphmx.com.
Barracuda Email Gateway DefenseSecurity gateway
A mail security gateway. Its MX hosts end in ess.barracudanetworks.com.
Trend Micro Email SecuritySecurity gateway
A mail security gateway. Its MX hosts start with a company identifier and end in a regional name such as in.tmes.trendmicro.com, in.tmes.trendmicro.eu or in.tmems-jp.trendmicro.com.
SPF includes this tool recognises (15)
Google Workspace
Google Workspace's SPF value is v=spf1 include:_spf.google.com ~all.
Microsoft 365
Microsoft 365's SPF value is v=spf1 include:spf.protection.outlook.com -all.
Zoho Mail
Zoho Mail's SPF value is v=spf1 include:zohomail.com -all. Zoho suggests include:one.zoho.com when you use several Zoho services.
Fastmail
Fastmail's SPF value is v=spf1 include:spf.messagingengine.com ?all.
Proton Mail
Proton's SPF example includes _spf.protonmail.ch.
iCloud Mail (custom domain)
iCloud Mail's SPF value for a custom domain is v=spf1 include:icloud.com ~all.
Amazon SES
Amazon SES asks for v=spf1 include:amazonses.com ~all on a custom MAIL FROM domain, a subdomain used for bounces.
SendGrid
Twilio's sending service. Its SPF example is v=spf1 include:sendgrid.net -all.
Mailgun
Mailgun's SPF value is v=spf1 include:mailgun.org ~all.
Postmark
Postmark's include is spf.mtasv.net. Postmark says it is no longer needed in your own record, because its custom Return-Path covers SPF.
HubSpot
HubSpot's SPF includes are shared.hubspot.com, or an account-specific name under hubspotemail.net such as 123456.spf03.hubspotemail.net.
Zendesk
Zendesk's SPF value is v=spf1 include:mail.zendesk.com -all.
Mailchimp
Mailchimp sends from servers whose names contain mcsv.net. Microsoft's SPF example for a domain that sends with Mailchimp includes servers.mcsv.net.
Sophos Email
Sophos gives a regional SPF domain, such as _spf_uswest2.prod.hydra.sophos.com. It warns that the older _spf.prod.hydra.sophos.com can cause the SPF error too many DNS lookups.
Cisco Secure Email Cloud Gateway
Cisco's SPF uses an exists term with a macro under the allocation's iphmx.com name, such as exists:%{i}.spf.hc1234-49.iphmx.com.
Verification records this tool recognises (7)
Google (Search Console or Google Workspace)
Google's verification record looks like google-site-verification= followed by a code.
Microsoft 365
Microsoft 365's verification record looks like MS=ms followed by digits.
Zoho Mail
Zoho Mail's verification record looks like zoho-verification= followed by a code ending in zmverify.zoho.
Proton Mail
Proton's verification record looks like protonmail-verification= followed by a code.
Apple Business
Apple's verification record looks like apple-domain-verification= followed by a code.
Webex (Control Hub)
Webex checks a cisco-ci-domain-verification entry in the domain's TXT records.
Yandex Webmaster
Yandex's verification record looks like yandex-verification followed by a code.
Photo of Utku Zihnioglu

By

ยท CEO & co-founder

Published Nov 11, 2026

Shorter page: the tool first, the answer in a few lines.

An SPF record lookup tool shows the part of the record you cannot see. Most SPF records are a short line of include terms, and each include points at another domain's record, which can point at more. Type a domain above and the tool follows every include to the end, names the service behind each one, and counts DNS lookups the way a receiver does.

Only the domain is sent, to Cloudflare's public DNS resolver, and nothing is stored.

How to read the result

Read the problems first. Two records that start with v=spf1, a count over the lookup limit, or an include with no record behind it all make receivers return permerror, and SPF then fails for every message. A record that ends in +all lets any server pass as you.

Then read the tree. Each include shows the lookups waiting inside it, which is where a long count comes from. An include the tool does not name is not a fault: it is a sender with no docs the tool can read, so find out who added it before you delete it.

The rules come from RFC 7208, the SPF standard, and service names come only from each service's own setup docs.

What to change, then test

Make every change in the one record, at whoever hosts your domain's DNS. Remove includes for services you no longer send with before anything else. If the count is the problem, the SPF lookup limit page shows what else to cut.

Avoid flattening, the trick of replacing includes with the IP addresses they hold. It copies a list the service owns into your DNS, and that list goes stale the day the service changes its servers.

Then send a test message from each service and paste its headers into the email header analyzer. It shows whether SPF, DKIM and DMARC passed as the receiver saw it.

SPF record lookup tool: common questions

How do I look up a domain's SPF record by hand?

Ask DNS for the domain's TXT records with dig or nslookup and keep the one that starts with v=spf1. That gives you the top layer only. Following each include by hand and keeping count is the part this tool does for you.

Why does my SPF record use more lookups than it has includes?

Because the count runs across every record your includes point at. An include costs a lookup, and each include, a, mx, exists or redirect inside the record it reaches costs another, so a single sending service can account for several.

Should an SPF record end in -all or ~all?

Either tells receivers that unlisted servers are not allowed: -all says they fail, ~all says they soft fail. List every sender first. Never end with +all, which lets any server on the internet pass.

Is a passing SPF record enough for Gmail?

Not for bulk senders. Google asks every sender for SPF or DKIM, and bulk senders for both plus DMARC. SPF is checked against the envelope sender, which many services set to their own domain, so DKIM signed with your domain is the sturdier half.

About this article

Photo of Utku Zihnioglu

Utku Zihnioglu

CEO & co-founder

Serial entrepreneur who built infrastructure companies handling billions of requests. Now leads engineering at Oneprofile, which finds the people worth talking to, researches each one, and follows up until they reply.

Drafted with AI from our product docs and code. Utku Zihnioglu answers for what it says.

Check your domain before the first send

Once SPF passes, verify every address on your list in Oneprofile before you send.

Free plan: 200 credits a month, 3 integrations, no card

Check your domain before the first send

Once SPF passes, verify every address on your list in Oneprofile before you send.

Free plan: 200 credits a month, 3 integrations, no card