SPF PermError means a receiver can't parse your domain's SPF record — bad syntax, duplicate record, or over 10 DNS lookups. Publish one corrected record.
Updated Jul 1, 2026
The short answer
An SPF validation error means a receiving mail server tried to evaluate your domain's SPF record and could not interpret it, returning a PermError (RFC 7208 §2.6.7). The usual causes are a syntax mistake, more than one SPF record on the domain, or exceeding the 10 DNS-lookup limit. Fix it by publishing a single, valid v=spf1 TXT record under those limits.
An SPF validation error is what most providers call a PermError — RFC 7208 §2.6.7 defines it as a result that "means the domain's published records could not be correctly interpreted." The receiving mail server found your v=spf1 record but could not evaluate it, so SPF fails for every message from the domain, even from a legitimate IP. This is different from a none result (no record found) or a plain fail/softfail (record evaluated fine, but the sending IP wasn't authorized).
One thing to get straight first: SPF is checked by the receiving server, but the record that's broken lives in your (the sender's) DNS. The bounce or header shows up on the recipient side; the fix always happens in your domain's DNS.
A PermError is raised by a specific set of record-level problems defined in RFC 7208 — not by an unauthorized IP. The three that account for nearly all cases:
include: vs includes:), a stray character, or a record that doesn't start with v=spf1 makes the record uninterpretable. A single TXT string is also capped at 255 characters (RFC 7208 §3.3) — split long records into multiple quoted strings within the same TXT record.v=spf1 TXT record. Two v=spf1 records (e.g. one added by your old host, one by a new sending service) is an automatic PermError.include, a, mx, ptr, and exists mechanisms and the redirect modifier each count; ip4, ip6, and all do not. Chained include: statements blow past 10 fast and trigger a PermError.(Note: a missing record produces a none result, not a validation error. If you have no SPF record at all, the fix is to publish one — but that's a different result code than the PermError described here.)
Work through the three causes in order:
Confirm you have exactly one record. Query your TXT records and count how many start with v=spf1:
dig +short TXT example.com | grep spf1
If more than one line comes back, merge them into a single record and delete the extras.
Validate the syntax. Make sure the record begins with v=spf1, every mechanism is recognized, and it ends with a single all qualifier. A typical valid record:
v=spf1 include:_spf.google.com include:sendgrid.net -all
Use ~all (softfail) or -all (hardfail) once — don't combine qualifiers. Keep each quoted string ≤255 characters.
Stay under 10 DNS lookups. Count your include, a, mx, ptr, exists, and redirect terms. If you're at or over 10, remove sending services you no longer use, replace include blocks with explicit ip4:/ip6: ranges where the provider publishes them, or flatten the record with an SPF management tool.
After editing, re-check with dig and an SPF validator, then allow for DNS propagation (typically minutes, up to the TTL of the old record) before retesting a send.
With Courier
v=spf1 record — for example include:sendgrid.net for SendGrid or include:amazonses.com for Amazon SES — and verify it doesn't push you over the 10-lookup limit. Check your provider's authentication setup docs for the exact value.References
RFC 7208 — Sender Policy Framework (SPF), Version 1
RFCRFC 7208 §2.6 (result definitions), §4.5 (multiple records), §4.6.4 (lookup limits) — IETF Datatracker
DOCSDMARCLY — Why SPF Authentication Fails: none, neutral, fail, softfail, temperror, permerror
DOCSEasyDMARC — SPF Too Many DNS Lookups (PermError)
FAQ
No. A validation error is a PermError (RFC 7208 §2.6.7) — the receiver couldn't interpret your record at all, usually due to bad syntax, duplicate records, or exceeding 10 DNS lookups. A plain 'fail' or 'softfail' means the record was read correctly but the sending IP wasn't in your authorized list.
The most common hidden cause is the 10 DNS-lookup limit (RFC 7208 §4.6.4). Each include, a, mx, ptr, exists, and redirect counts, and nested includes add up quickly. A second, easy-to-miss cause is a duplicate v=spf1 TXT record left behind by a previous host.
No. RFC 7208 §4.5 states that if more than one v=spf1 record is returned, the result is PermError. Merge all sending sources into a single record, for example: v=spf1 include:_spf.google.com include:sendgrid.net -all.
One API, every provider
Courier connects to your email, SMS, and push providers, handles retries and failover, and surfaces delivery errors in plain language.
Reply-code definitions per RFC 7208 §2.6, §4.5, §4.6.4. Last reviewed Jul 1, 2026. Courier is not affiliated with third-party providers; error behavior may vary by implementation.
© 2026 Courier. All rights reserved.