SPF redirect loop
Your SPF record contains a redirect= chain that loops back to itself, directly or through nested includes.
A loop causes PermError at the receiver. Same effect as too-many-lookups: SPF evaluation fails entirely, DMARC via SPF fails, mail increasingly goes to Junk.
What causes it
- yourdomain.com has
redirect=spf.yourdomain.com, and spf.yourdomain.com hasredirect=yourdomain.com. - A deeper chain where domain A's SPF includes B, which includes C, which redirects back to A.
- A typo in your redirect= target that happens to be a domain whose SPF includes you.
How to fix it
Step 1: Trace the chain manually
Start with your SPF record and follow every include: and redirect= target with dig TXT. Map the full dependency graph on paper. The loop will be visually obvious.
Step 2: Replace redirect= with include:
In 99% of cases, redirect= is the wrong mechanism. Use include: instead — it does what you want (fetch another domain's SPF) without the fragile pointer semantics.
Step 3: Flatten if the chain is too deep
Services like EasyDMARC and Scrutinize can resolve your entire SPF tree into a static list of IPs, eliminating the chain entirely.
Fixed it? Run a fresh test to confirm.
Test my inbox →