RedScore.ai

Fixes

Email Security · Updated 2026-05-02

SPF Policy Strength

Only -all (hard fail) earns full credit. ~all warns, missing fails. How to publish a record and audit senders before tightening.

SPF (Sender Policy Framework) is a DNS TXT record at your apex listing which IPs and hosts are allowed to send mail "from" your domain. The qualifier at the end of the record (-all, ~all, ?all, or +all) tells receivers what to do with senders that are not on the list. -all is the only strong qualifier; the rest leave room for forged mail to be accepted.

This check only runs when your domain has a non-null MX (it is treated as a mail-active domain). If you have only a null MX or no MX, the check shows as not applicable rather than failing.

How the verdict maps to evidence

  • Pass: the SPF record ends with -all (hard fail). Receivers should reject mail from unauthorized IPs.
  • Warn: the record ends with ~all (soft fail). Receivers may quarantine but not reject. Common as a transitional state during SPF rollout.
  • Warn: the record uses ?all, +all, or has no all mechanism at all. No real policy on unlisted senders.
  • Fail: no SPF record found at the apex.

Fail: no SPF record

Publish a single TXT record at the apex (yourdomain.tld, not _spf.yourdomain.tld). List the providers that legitimately send mail for you, then close with -all. If you only send through one provider, this is a one-line record:

Example: Google Workspace only

yourdomain.tld.   IN  TXT  "v=spf1 include:_spf.google.com -all"

Example: Microsoft 365 only

yourdomain.tld.   IN  TXT  "v=spf1 include:spf.protection.outlook.com -all"

Most providers document the include they want; use what they say, not what looks similar.

Multiple senders

If you send through more than one provider (mailbox provider plus a transactional sender plus a marketing platform, for example), list each include in one record. SPF allows exactly one v=spf1 record per domain; publishing two is a syntax error that breaks SPF for receivers.

Example: Google Workspace + SendGrid + Mailchimp

yourdomain.tld.   IN  TXT  "v=spf1 include:_spf.google.com include:sendgrid.net include:servers.mcsv.net -all"

Warn: tighten ~all to -all

If your record currently ends with ~all, you have a complete-but-weak policy. Move to -all once you are confident the include list covers every legitimate sender. The audit checklist:

  • Pull the last 30 days of DMARC aggregate reports if you publish DMARC. They list every IP that sent mail "from" your domain along with whether SPF passed.
  • Identify any unauthorized senders in those reports. They are either legitimate services you forgot, or actual spoofers.
  • Add the missing legitimate ones to your SPF record (or stop them sending from your domain).
  • Tighten to -all and watch for delivery failures over the next week.

Without DMARC reports, you are flying blind on this transition. Publish DMARC at p=none with rua= reporting first (see the DMARC fix), collect a week of data, then tighten SPF.

Warn: replace ?all or +all with -all

?all (neutral) means "no opinion." +all means "every sender is authorized," which is the same as publishing no SPF at all because every IP claims authorization. Both should be replaced with -all. If you cannot move directly to -all because you have unknown legitimate senders, use the same DMARC-reporting audit above as a transition.

Verify the fix

  • Run dig +short TXT yourdomain @1.1.1.1 and look for the v=spf1 record. Confirm there is exactly one such record and it ends with -all.
  • Check the DNS lookup count. SPF is limited to 10 DNS lookups per RFC 7208 section 4.6.4; going over makes the entire SPF evaluation permerror at receivers (which DMARC treats as a hard fail). Each include:, a, mx, exists:, and redirect= counts toward the limit. RedScore tracks this as the SPF Lookup Count check.
  • Send a test message from each legitimate sender and confirm SPF passes at receivers (Gmail's "Show original" view shows SPF, DKIM, and DMARC results explicitly).
  • Re-run the RedScore lookup.

Common pitfalls

  • Multiple v=spf1 records. SPF allows exactly one per domain. Two or more makes the entire record permerror at receivers, which DMARC treats as fail.
  • Exceeding 10 DNS lookups. Nested includes inflate fast (one include can pull in a chain of further includes). Flatten or replace with ip4: and ip6: when you exceed.
  • Using ptr. The ptr mechanism is deprecated and many receivers ignore or reject it. Remove it.
  • Including senders you no longer use. After leaving a marketing platform or transactional sender, prune their include from your record. Stale includes inflate the lookup count and broaden authorization unnecessarily.
  • Missing subdomain coverage. SPF records must be set per-subdomain if your transactional senders use subdomain envelope-from addresses (such as bounces@mail.yourdomain.tld). Apex SPF does not automatically cover mail.yourdomain.tld.

What to do next

See how these recommendations apply to your site's current scan results.

Scan domain