SPF permerror vs temperror Explained: Result Codes, Causes, DMARC Interaction, and the Resolution Workflow (RFC 7208 sections 2.6, 6.7, 6.8)

A focused diagnostic deep dive on the two SPF error result codes defined in RFC 7208 — permerror (a permanent evaluation failure that means SPF authentication FAILED) and temperror (a transient DNS-level failure that means SPF evaluation was inconclusive and the receiver MAY defer or treat as none). Documents the seven canonical permerror causes (record-not-found, syntax-error, multiple-records, too-many-lookups, void-lookup-cap, recursive-include, deprecated-mechanism), the three canonical temperror causes (DNS timeout, SERVFAIL, transient resolver failure), how DMARC at RFC 7489 section 5.6.2 interprets each, receiver behavior at the major mailbox providers, the Authentication-Results forensic detection workflow (RFC 8601), the cause-specific resolution playbook, and a per-symptom troubleshooting decision matrix. Differentiation from the sibling SPF pillar: the pillar gives a brief overview of the seven SPF result codes; this page is the focused deep dive operators need when debugging a live permerror or temperror incident in production.

This reference is provided in English. SPF result codes are specified in an English-language RFC (RFC 7208 section 2.6 + sections 6.7 and 6.8) and the canonical vocabulary (permerror, temperror, none, neutral, pass, fail, softfail, NXDOMAIN, NODATA, SERVFAIL, Authentication-Results) does not translate. We keep the body in the source language so technical terms remain consistent with the specifications.

TL;DR

  • permerror means the SPF evaluation encountered an unrecoverable failure — typically a syntax error, lookup-count over 10, void-lookup cap violation, deprecated mechanism, multiple SPF records, or a recursive include. Defined in RFC 7208 section 2.6.7.
  • temperror means the SPF evaluation encountered a transient DNS-level failure — typically a DNS timeout, SERVFAIL, or transient resolver failure. Defined in RFC 7208 section 2.6.6.
  • The diagnostic difference: permerror means "fix your SPF record" (record is broken); temperror means "fix your DNS infrastructure" (record exists but resolver could not reach it).
  • DMARC handling per RFC 7489 section 5.6.2: permerror is treated as SPF authentication FAILED; temperror is treated as inconclusive and the receiver MAY defer with 4xx, treat as none, or re-evaluate later.
  • The seven canonical permerror causes are: (1) record not found, (2) syntax error, (3) multiple SPF records on the same name, (4) too many DNS lookups (10-lookup cap per RFC 7208 section 4.6.4), (5) void-lookup cap (2 NXDOMAIN/NODATA per the same section paragraph 3), (6) recursive include loop, (7) deprecated mechanism (spf2.0 prefix, ptr).
  • The three canonical temperror causes are: (1) DNS timeout (authoritative nameserver unreachable within the resolver timeout window), (2) SERVFAIL (resolver encountered an internal error), (3) transient resolver failure (network partition, rate-limiting, DNSSEC validation intermittent failure).
  • The Authentication-Results header (RFC 8601) is the canonical forensic source. Look for spf=permerror or spf=temperror followed by a parenthetical reason; the reason string names the specific cause class. View the raw message source in your mail client and inspect the Authentication-Results line.
  • Receiver behavior varies. Gmail typically treats temperror as none under DMARC; Microsoft 365 may defer; Yahoo varies by campaign; ProtonMail often defers. Plan for the worst case (defer + retry-loop) when designing your DNS infrastructure for high-volume sending.

1. Overview

Sender Policy Framework (SPF), defined in RFC 7208, publishes a list of authorised sending sources for an email-sending domain. When a receiver accepts an SMTP transaction, it looks up the SPF record at the senders envelope MAIL FROM domain (per RFC 7208 section 2.3) and evaluates whether the connecting IP is authorised by that record. The evaluation produces one of seven result codes — and two of those seven are error states rather than authoritative pass/fail verdicts: permerror and temperror.

Understanding the difference between permerror and temperror — and between permerror and the unrelated fail result code — is the foundation of SPF triage. The diagnostic implications are different, the DMARC interaction is different, the receiver behavior is different, and the resolution workflow is completely different. Operators who treat the two results as interchangeable misdiagnose incidents routinely.

This page is the focused operator reference for the two error result codes. The sibling SPF pillar (help_spf_explained.php) covers the pass/fail/softfail/neutral/none result codes; the sibling SPF lookup-limit deep dive (help_spf_lookup_limit.php) covers the specific permerror cause that the 10-lookup cap produces. This page covers EVERY permerror and temperror cause, in one place, with the cause-specific resolution playbook beside each.

2. The seven SPF result codes

RFC 7208 section 2.6 defines exactly seven result codes an SPF evaluation can produce. Each has a specific semantic and a specific receiver-side processing rule:

none (RFC 7208 §2.6.1)
The receiver looked up the senders MAIL FROM domain and found no SPF record (no TXT record beginning with v=spf1). The receiver SHOULD treat this as "no SPF policy published" — SPF authentication does not apply. Under DMARC the absence of SPF is acceptable as long as DKIM passes and is aligned.
neutral (RFC 7208 §2.6.2)
The record matched and explicitly produced a neutral verdict — typically via the ?all qualifier or the ?-prefixed include / mechanism. The receiver SHOULD treat this as equivalent to none. Under DMARC, neutral is not a pass.
pass (RFC 7208 §2.6.3)
The connecting IP matches an authorised mechanism in the SPF record. SPF authentication SUCCEEDED. Under DMARC, pass + aligned MAIL-FROM domain = DMARC pass.
fail (RFC 7208 §2.6.4)
The connecting IP did NOT match any authorised mechanism, and the record terminates with -all (strict fail). SPF authentication FAILED — the sending source is not authorised. Under DMARC, fail + DKIM fail triggers the published policy (none / quarantine / reject).
softfail (RFC 7208 §2.6.5)
The connecting IP did NOT match, and the record terminates with ~all (soft fail). The receiver is encouraged to accept the mail but mark it with a low-confidence indicator. Under DMARC, softfail is treated as fail for alignment-evaluation purposes.
temperror (RFC 7208 §2.6.6)
The evaluation encountered a transient DNS-level failure (timeout, SERVFAIL, transient resolver failure). The result is inconclusive. Under DMARC section 5.6.2 the receiver SHOULD defer or treat as none — not fail. See section 5 below.
permerror (RFC 7208 §2.6.7)
The evaluation encountered an unrecoverable failure (syntax error, lookup-count cap, void- lookup cap, multiple records, deprecated mechanism, recursive include). The result is authentication FAILED. Under DMARC section 5.6.2 the receiver treats permerror as fail. See section 4 below.

3. The seven canonical permerror causes

The seven canonical permerror causes account for approximately 95% of permerror incidents in production DMARC deployments per anecdotal field reports. Operators triaging a permerror should walk this list in order — the early items are by far the most common.

3.1 Record not found

Symptom: spf=permerror (no SPF record found) in the Authentication-Results header, or spf=none in receivers that follow RFC 7208 section 2.6.1 strictly.

Root cause: The senders envelope MAIL FROM domain has no TXT record beginning with v=spf1. The receiver looked up example.com TXT and got either NXDOMAIN (the domain does not exist) or NODATA (the domain exists but has no TXT records, or has TXT records that do not begin with v=spf1).

Resolution: Publish an SPF record at the apex of the sending domain. The canonical starting point depends on the sender:

# Google Workspace
example.com.  TXT  "v=spf1 include:_spf.google.com ~all"

# Microsoft 365 / Exchange Online
example.com.  TXT  "v=spf1 include:spf.protection.outlook.com -all"

# Self-hosted mail server, single IP
example.com.  TXT  "v=spf1 ip4:198.51.100.42 -all"

3.2 Syntax error

Symptom: spf=permerror (syntax error) or spf=permerror (invalid SPF record).

Root cause: The SPF record exists but does not conform to the RFC 7208 section 12 ABNF grammar. Common syntax errors include:

  • Missing v=spf1 prefix. The first 6 bytes MUST be exactly v=spf1 followed by a space or end of record. Receivers that find a TXT record without the prefix treat it as "not an SPF record" and report none — but some report permerror because a record claiming SPF semantics that lacks the prefix is malformed.
  • Trailing whitespace or stray characters. Some DNS provider UIs add invisible characters when admins paste from word processors. The canonical fix is to re-publish the record from a plain-text editor.
  • Mechanism with invalid argument. ip4:198.51.100.42/256 (CIDR mask out of range), ip6:not-an-ip, a: with empty argument.
  • Modifier with invalid placement. redirect= appearing AFTER an all mechanism (the all terminates evaluation, so redirect= is dead code per RFC 7208 section 5.1).
  • Unbalanced quotes in chunked TXT records — see the 255-byte-chunk pitfall in the sibling lookup-limit page.

Resolution: Run the record through a syntax validator (MXToolbox SPF Record Check, dmarcian SPF Surveyor, EasyDMARC SPF Checker, the DMARC Analyzer Domain Security Checker). Fix the syntax error and re-publish.

3.3 Multiple SPF records on the same name

Symptom: spf=permerror (multiple SPF records) or spf=permerror (more than one v=spf1 record).

Root cause: RFC 7208 section 3 paragraph 3 explicitly forbids more than one TXT record at the same name that begins with v=spf1. The receiver MUST treat the presence of multiple SPF records as a syntax error and return permerror. This pattern most often appears when an organisation has migrated between SPF includes (e.g., from on-prem Exchange to Microsoft 365) and the old record was never deleted, OR when two admins each published their own SPF record for the same domain without coordinating.

Resolution: Audit all TXT records at the senders apex domain with dig +short example.com TXT. Delete all SPF records EXCEPT the one with the complete / correct mechanism list, OR merge the mechanisms from multiple records into a single record. The common merge pattern: combine the include: lists, dedupe, and verify the merged record stays under the 10-lookup cap.

3.4 Too many DNS lookups (10-lookup cap)

Symptom: spf=permerror (too many DNS lookups) or spf=permerror (SPF lookup limit exceeded).

Root cause: RFC 7208 section 4.6.4 caps the number of DNS lookups an SPF evaluation may perform at 10. Each include, a, mx, ptr, exists, and the redirect= modifier consumes 1 lookup; ip4, ip6, and all cost zero. The counter is the SUM across the ENTIRE evaluation including nested includes — so a top-level record with 4 includes whose underlying records each contain 3 more includes consumes 4 + 12 = 16 lookups even though the published record only shows 4.

Resolution: See the dedicated deep dive at help_spf_lookup_limit.php. The four canonical remediations in order of preference: audit and remove unused includes; split senders across subdomains; consolidate to fewer ESPs; flatten with a monitored pipeline.

3.5 Void-lookup cap (2 NXDOMAIN / NODATA)

Symptom: spf=permerror (void lookup limit exceeded) or spf=permerror (too many void lookups).

Root cause: RFC 7208 section 4.6.4 paragraph 3 specifies a secondary cap of 2 void lookups: an SPF evaluation that encounters two or more DNS queries returning NXDOMAIN or NODATA MAY return permerror. The void-lookup cap is independent of the 10-lookup cap. The most common cause is an SPF record that references a retired third-party sender via include: — the sender shut down, the includes underlying TXT record was deleted, and now every SPF evaluation against the senders SPF record racks up a void lookup on the retired include.

Resolution: Audit every include:, a:, mx:, and exists: mechanism in the SPF record. For each, run dig +short example.com TXT for includes and dig +short example.com A AAAA MX for the others. Any mechanism whose target returns NXDOMAIN or NODATA is a void-lookup contributor; remove it from the SPF record.

3.6 Recursive include loop

Symptom: spf=permerror (recursive include loop) or spf=permerror (include loop detected).

Root cause: The SPF record contains a chain of include: mechanisms that eventually loop back on itself — example.com includes a.example.com; a.example.com includes b.example.com; b.example.com includes example.com. Most receivers detect the loop after 2-3 cycles and return permerror per RFC 7208 section 5.2 paragraph 6. This is rare in production but appears when an organisation publishes a "core SPF" record that other internal records include — and someone accidentally includes the core record back from a sub-record.

Resolution: Walk the include chain starting from the top-level record. For each include, fetch the included records SPF and recurse until you hit a non-include mechanism. If you encounter the same domain twice in the chain, that is the loop. Remove the offending include and re-publish.

3.7 Deprecated mechanism (spf2.0, ptr)

Symptom: spf=permerror (unsupported mechanism) or spf=permerror (deprecated SPF version).

Root cause: The SPF record contains a mechanism that has been deprecated in the standards process. The two canonical cases:

  • spf2.0 prefix. The long-obsolete Sender ID Framework ( RFC 4406, experimental, expired) used the spf2.0 prefix. RFC 7208 section 14.1 directs receivers to ignore spf2.0 records. Some receivers report permerror if a TXT record claiming SPF semantics carries the spf2.0 prefix.
  • ptr mechanism. RFC 7208 section 5.5 explicitly deprecates the ptr mechanism: "Use of this mechanism is discouraged because it is slow, it is not as reliable as other mechanisms in cases of DNS errors, and it places a large burden on the arpa name servers". Some receivers still evaluate it, some treat it as permerror.

Resolution: Remove the deprecated prefix or mechanism. Replace ptr with the explicit ip4: / ip6: ranges of the sending infrastructure. Republish.

4. The three canonical temperror causes

Temperror has fewer canonical causes than permerror because temperror is a transient FAILURE TO EVALUATE rather than a failure of the record content. The three causes all share one signature: the SPF record exists and is syntactically valid; the evaluation could not complete because of a DNS- infrastructure-level issue.

4.1 DNS timeout

Symptom: spf=temperror (DNS timeout) or spf=temperror (DNS query timeout).

Root cause: The receivers DNS resolver issued a query to the authoritative nameserver hosting the senders SPF record and did not receive a response within the resolvers timeout window. The window is typically 5 seconds for the initial query plus 1-2 retries; varies by receiver. Common underlying causes: the authoritative nameserver is rate-limiting the receivers resolver; the nameserver is under DDoS attack; the network path between resolver and nameserver has packet loss; the nameserver is overloaded by legitimate traffic; the nameserver is responding only on IPv4 and the resolver is querying via IPv6 (or vice versa).

Resolution: Verify reachability with dig +trace example.com TXT from multiple geographic vantage points (use a tool like DNSChecker.org or RIPE Atlas). If reachability is intermittent, migrate the SPF records DNS hosting to a higher-capacity provider (Cloudflare, AWS Route 53, Google Cloud DNS, NS1 Managed DNS). For dual-stack receivers, ensure the nameservers have both IPv4 (A) and IPv6 (AAAA) glue records.

4.2 SERVFAIL

Symptom: spf=temperror (SERVFAIL) or spf=temperror (DNS server failure).

Root cause: RFC 8499 section 4 defines SERVFAIL as a DNS response code meaning the resolver encountered a server-side error processing the query. The most common underlying causes:

  • DNSSEC validation failure. The domain is DNSSEC-signed but the signature does not validate (expired RRSIG, wrong key, broken chain of trust). Validating resolvers (Google 8.8.8.8, Cloudflare 1.1.1.1, Quad9 9.9.9.9) return SERVFAIL; non-validating resolvers return the unsigned data and SPF evaluates normally. The split-receiver-behavior makes DNSSEC SERVFAIL particularly hard to debug.
  • Broken CNAME chain. The SPF TXT record is reached via a CNAME that points at a non-existent target.
  • EDNS0 negotiation failure. The nameserver does not support EDNS0 or has a broken EDNS0 implementation; the resolvers EDNS0-enabled query gets dropped or returns SERVFAIL.

Resolution: If the SERVFAIL is DNSSEC-related, run dig +dnssec example.com TXT @8.8.8.8 and inspect the AD flag; if the chain is broken, fix the DNSSEC signing pipeline at the authoritative nameserver. For CNAME chain issues, inspect the chain with dig +trace example.com TXT and fix the broken hop. For EDNS0 issues, upgrade the nameserver software (BIND, NSD, PowerDNS, Knot DNS) to a version with stable EDNS0 support.

4.3 Transient resolver failure

Symptom: spf=temperror (resolver failure) or spf=temperror (transient DNS error).

Root cause: Any other transient failure category — network partition between the receiver and the nameserver, resolver-side rate- limiting kicking in (some receivers throttle aggressive resolution behavior to protect their DNS infrastructure), brief outage at the senders DNS provider, intermittent UDP packet loss causing truncated responses that the resolver could not re-fetch via TCP.

Resolution: Transient failures by definition do not have a record-side fix. Monitoring is the only reliable remediation: keep the rate of temperror under 0.1% of mail by using a redundant set of authoritative nameservers across multiple providers (anycast helps here), and ensure DNS provider SLAs match the senders mail-volume profile. For very-high-volume senders, consider second-source DNS hosting via secondary- NS configurations so a single-provider outage does not produce a temperror cascade.

5. How DMARC handles permerror vs temperror

RFC 7489 section 5.6.2 specifies how DMARC interprets each SPF result code when computing the DMARC verdict. The handling for permerror and temperror is materially different:

  • permerror is treated as SPF fail. RFC 7489 section 5.6.2 paragraph 4 explicitly treats permerror as a permanent failure that contributes to the DMARC fail computation. If the DKIM verdict is also fail or DKIM is not aligned with the From: header domain, DMARC fails and the receiver applies the published policy (none / quarantine / reject).
  • temperror SHOULD NOT cause DMARC fail. RFC 7489 section 5.6.2 paragraph 2 specifies that an SPF temperror SHOULD be treated as inconclusive. The receiver MAY (1) defer the message with a 4xx SMTP code asking the sender to retry later, giving the DNS resolver another chance to evaluate the SPF record on the retry; (2) treat the SPF result as none and fall back to DKIM only; or (3) accept the message and re-evaluate SPF on a subsequent delivery.

The practical operator implication: a single misconfigured SPF include can produce a global DMARC fail cascade. Every DMARC-honouring receiver simultaneously sees SPF permerror, combines it with the DKIM verdict, and applies the published policy to every message from the affected From: domain. If the published policy is p=reject, the cascade produces a rejection-at-SMTP-time outage. If the policy is p=quarantine, the cascade routes every message to spam.

By contrast, temperror typically produces only a transient deferral and re-delivery loop — operators may not even notice the temperror incident unless they actively monitor the aggregate (RUA) reports for elevated temperror rates. See help_dmarc_aggregate_reports.php for the RUA monitoring workflow.

6. Receiver behavior at major mailbox providers

The major mailbox providers implement RFC 7489 section 5.6.2 with provider-specific variations. The reference behavior is documented to the extent each provider publishes operator-facing documentation:

Gmail (Google Workspace + consumer Gmail)
permerror is treated as SPF fail per RFC 7489. temperror is typically treated as none under DMARC — Gmail rarely defers on SPF temperror alone. Aggregate reports surface both result codes in the auth_results subtree. Gmail operates extensive resolver infrastructure and is rarely the source of receiver-side temperror.
Microsoft 365 (Exchange Online + Defender)
permerror is treated as SPF fail. temperror may produce a 4xx defer ( 451 4.7.0 Temporary server error) with retry guidance, particularly under Defender for Office 365 conditional policies. Tenant administrators can inspect the Authentication-Results header in the Exchange message trace for the specific result code.
Yahoo (and AOL)
permerror is treated as SPF fail. temperror behavior varies by campaign profile — bulk senders may see temperror cascade to defer + retry; transactional senders may see temperror treated as none. Yahoo also operates the FBL (feedback loop) so spam-classifier signals interact with the SPF result code.
Apple iCloud Mail
permerror is treated as SPF fail. temperror typically defers with a 4xx SMTP code; Apple is one of the receivers most likely to defer rather than treat-as-none.
ProtonMail / Tuta / Fastmail
permerror is treated as SPF fail. temperror often defers with 4xx — these providers tend to favour deferral over none-treatment to protect users from missed mail caused by intermittent DNS infrastructure issues at the sender.

For high-volume senders, the receiver-specific variations matter operationally because deferral cascades can produce delivery-time variance even when the eventual delivery succeeds.

7. Forensic detection workflow

The forensic detection workflow combines Authentication-Results header inspection ( RFC 8601), aggregate (RUA) report analysis, and live SPF record verification.

7.1 Inspect the Authentication-Results header

View the raw message source in your mail client (Outlook File > Properties > Internet headers; Gmail three-dot menu > Show original; Apple Mail View > Message > Raw Source). Find the line beginning with Authentication-Results:. The spf= field will read spf=permerror or spf=temperror followed by a parenthetical reason:

Authentication-Results: mx.google.com;
       spf=permerror (google.com: permanent error
                      in processing during lookup of
                      sender@example.com: too many DNS lookups)
                      smtp.mailfrom=sender@example.com;
       dkim=pass (signature was verified)
                 header.d=example.com;
       dmarc=fail (p=REJECT sp=REJECT dis=REJECT)
                  header.from=example.com

Key fields to extract: the spf= verdict (permerror vs temperror), the parenthetical reason string (names the specific cause class), the smtp.mailfrom= domain (the envelope From: that SPF was evaluated against), and the downstream dmarc= verdict.

7.2 Verify the live SPF record

Once you know the senders MAIL FROM domain, query the SPF record directly:

# Get the raw TXT record
dig +short example.com TXT

# Walk the include chain
dig +trace example.com TXT

# Count DNS lookups via SPF Surveyor / EasyDMARC / DMARC Analyzer
# Domain Security Checker

Compare the live record to what you expect — the cause-class diagnosis from section 7.1 should point at a specific record property to verify.

7.3 Cross-check with aggregate (RUA) reports

Aggregate reports per RFC 7489 section 7 surface per-record SPF result codes in the auth_results XML subtree. If you are monitoring aggregate reports via DMARC Analyzer or a similar tool, filter for spf=permerror or spf=temperror records to see the rate at which the failure mode is occurring across all receivers. A persistent permerror rate over 1% is almost always a record-side fix; a persistent temperror rate over 0.5% is almost always a DNS- infrastructure-side fix.

8. Cause-specific resolution playbook

The resolution playbook is cause-specific. Walk the decision matrix in section 9 to identify which cause class applies, then apply the corresponding remediation:

  • permerror — record not found: publish an SPF record at the senders apex (see section 3.1).
  • permerror — syntax error: run the record through a syntax validator, fix the malformed mechanism (see section 3.2).
  • permerror — multiple SPF records: consolidate to a single TXT record at the apex (see section 3.3).
  • permerror — too many lookups: audit / split / consolidate / flatten per help_spf_lookup_limit.php (see section 3.4).
  • permerror — void-lookup cap: remove includes whose targets return NXDOMAIN or NODATA (see section 3.5).
  • permerror — recursive include: walk the include chain, remove the offending loop link (see section 3.6).
  • permerror — deprecated mechanism: remove spf2.0 or ptr; replace with ip4: / ip6: ranges (see section 3.7).
  • temperror — DNS timeout: migrate to higher-capacity DNS provider; verify IPv4 + IPv6 nameserver glue (see section 4.1).
  • temperror — SERVFAIL: debug DNSSEC chain / CNAME chain / EDNS0 negotiation (see section 4.2).
  • temperror — transient: add redundant authoritative nameservers across providers; monitor temperror rate (see section 4.3).

9. Symptom decision matrix

Use the parenthetical reason from the Authentication-Results header to look up the cause class:

"no SPF record found" / "SPF record not present"
Cause: record not found (§3.1). Resolution: publish an SPF record at the apex domain.
"syntax error" / "invalid SPF record" / "malformed SPF"
Cause: syntax error (§3.2). Resolution: validate and fix the record.
"multiple SPF records" / "more than one v=spf1"
Cause: multiple SPF records (§3.3). Resolution: consolidate to one TXT record.
"too many DNS lookups" / "SPF lookup limit exceeded"
Cause: too many lookups (§3.4). Resolution: see lookup-limit deep dive.
"void lookup limit" / "too many void lookups"
Cause: void-lookup cap (§3.5). Resolution: remove retired includes.
"recursive include" / "include loop"
Cause: recursive include (§3.6). Resolution: walk and break the loop.
"unsupported mechanism" / "deprecated"
Cause: deprecated mechanism (§3.7). Resolution: remove spf2.0 or ptr.
"DNS timeout" / "DNS query timeout"
Cause: DNS timeout (§4.1). Resolution: higher-capacity DNS provider.
"SERVFAIL" / "DNS server failure"
Cause: SERVFAIL (§4.2). Resolution: debug DNSSEC / CNAME / EDNS0.
"resolver failure" / "transient DNS error"
Cause: transient (§4.3). Resolution: monitor + redundancy.

10. Real-world examples

Three composite incidents that illustrate the permerror and temperror failure modes in operator practice. Each describes the symptom, the investigation, and the resolution.

10.1 The post-acquisition lookup cascade

Symptom: A mid-size SaaS company completes an acquisition. Two weeks later their primary domains DMARC aggregate reports show SPF=permerror for ~40% of mail. Customer-facing transactional mail (password reset, account confirmation) starts going to spam at Gmail.

Investigation: The Authentication- Results header reads spf=permerror (too many DNS lookups). A DMARC Analyzer Domain Security Checker run against the acquired-company SPF record reports 12 effective DNS lookups (over the cap of 10). Walking the include chain reveals the company added include: for the acquirers SaaS senders (Salesforce, Marketo) to the acquired-company SPF record without removing the legacy includes the acquired company no longer uses.

Resolution: Audit the include chain; remove three legacy includes the acquired company no longer uses. Effective lookup count drops to 8. SPF=permerror clears within 4 hours of DNS propagation. Subsequent monitoring shows DMARC=pass on 99.8% of transactional mail.

10.2 The merged SPF accident

Symptom: A company migrates from Microsoft 365 to Google Workspace. After the cut- over, DMARC aggregate reports show spf=permerror for the migrated domain.

Investigation: dig +short example.com TXT returns two separate SPF records:

"v=spf1 include:spf.protection.outlook.com -all"
"v=spf1 include:_spf.google.com ~all"

The Google Workspace migration runbook added the second record without deleting the first. Per RFC 7208 section 3 paragraph 3, the presence of two SPF records is permerror.

Resolution: Delete the legacy Microsoft 365 SPF record. Merge the include if Microsoft 365 still sends any mail; otherwise publish only the Google Workspace record. Clear within DNS propagation window.

10.3 The DNSSEC SERVFAIL temperror

Symptom: An enterprise deploys DNSSEC on their primary domain. Within 24 hours, aggregate reports show 8% of mail returning spf=temperror (SERVFAIL). The receiver mix that produces the SERVFAIL is notably skewed toward validating resolvers (Google 8.8.8.8, Cloudflare 1.1.1.1, Quad9 9.9.9.9).

Investigation: dig +dnssec example.com TXT @8.8.8.8 returns the record without the AD flag — meaning the validating resolver could not validate the DNSSEC chain. Inspection of the DS record at the parent zone reveals the deployment runbook published a DS record with the wrong key tag — the parent DS points at a key that was not rolled in at the child.

Resolution: Fix the DS record at the registrar to point at the correct active KSK. Within the DNSSEC chain propagation window (typically 24-48 hours depending on parent-zone refresh) the temperror rate drops to baseline.

11. FAQ

What is SPF permerror?
SPF permerror is the "permanent error" result code defined in RFC 7208 section 2.6.7. It means the receiver attempted to evaluate the published SPF record and encountered an unrecoverable failure — typically a syntax error, an SPF lookup count over the RFC 7208 section 4.6.4 cap of 10 DNS queries, a void- lookup cap violation (2 NXDOMAIN/NODATA responses), the use of a deprecated mechanism (the spf2.0 prefix or the ptr mechanism in modern resolvers), multiple TXT records claiming to be SPF for the same domain, or a recursive include loop. The receiver SHOULD treat permerror as authentication FAILED — DMARC at RFC 7489 section 5.6.2 interprets it as SPF fail. The DMARC verdict then combines with DKIM: if DKIM is also fail or not aligned, DMARC fails and the receiver applies the published policy (none / quarantine / reject). The practical effect is that a single misconfigured SPF record can produce a global mail-delivery outage for the From: domain at every DMARC-honouring receiver.
What is SPF temperror?
SPF temperror is the "temporary error" result code defined in RFC 7208 section 2.6.6. It means the receiver attempted to evaluate the published SPF record but the DNS lookup encountered a transient failure — typically a DNS timeout (the authoritative nameserver did not respond within the resolvers timeout window), a SERVFAIL response from the resolver (the resolver itself encountered an error), a network reachability issue between the receiver and the authoritative nameserver, or rate-limiting by the resolver. The receiver SHOULD treat temperror as inconclusive and MAY either (1) defer message delivery with a 4xx SMTP code asking the sender to retry later, (2) treat the result as none and continue processing under DMARC, or (3) accept the message and attempt re-evaluation on a subsequent delivery. The receiver behavior varies by mailbox provider: Gmail typically treats temperror as none under DMARC; Microsoft 365 may defer; Yahoo varies by campaign.
What is the difference between SPF permerror and SPF fail?
SPF fail (the result code RFC 7208 section 2.6.4 calls "fail") is the OUTCOME of a successful SPF EVALUATION that authoritatively rejects the sending IP — the IP is not authorised by the published SPF record. SPF permerror is a result code indicating the EVALUATION ITSELF failed before reaching a conclusion — the record was unreadable, oversized, recursive, or malformed. Both result codes fail SPF authentication and both trigger DMARC fail when DKIM is also fail/not- aligned, but the diagnostic implication is different: fail means "fix your sending source" (the IP is wrong), permerror means "fix your SPF record" (the record is broken). Operators triaging a deliverability incident should always inspect the Authentication- Results header for the specific code so they know whether the problem is sender-side (fail) or record-side (permerror).
Does DMARC fail when SPF returns permerror?
Yes. RFC 7489 section 5.6.2 paragraph 4 specifies that SPF permerror is treated as authentication failure for DMARC purposes. If the DKIM verdict is also fail or DKIM is present but not aligned with the From: header domain, DMARC fails and the receiver applies the published policy (none / quarantine / reject). The most common operator surprise: a single misconfigured SPF include can produce a global DMARC fail cascade — the From: domain mail goes to spam at every DMARC- honouring receiver simultaneously. The fix is record-side (audit the SPF record for syntax / lookup-count / void-lookup / deprecated- mechanism issues), NOT sender-side (changing sending infrastructure does not help).
Does DMARC fail when SPF returns temperror?
Not necessarily. RFC 7489 section 5.6.2 paragraph 2 specifies that an SPF temperror SHOULD NOT cause DMARC fail — the receiver is encouraged to treat the result as inconclusive. The two canonical receiver behaviors are: (1) the receiver defers delivery with a 4xx SMTP code asking the sender to retry later, giving the DNS resolver another chance to evaluate the SPF record on the retry; or (2) the receiver treats the SPF result as none and falls back to DKIM only — if DKIM passes and is aligned, DMARC passes; if DKIM is also unavailable, the receiver MAY apply a none result for DMARC and continue. Receiver behavior varies: Gmail typically treats SPF temperror as none under DMARC; Microsoft 365 may defer; ProtonMail often defers. The practical effect is that intermittent DNS issues do NOT typically cause mass delivery outages, unlike permerror which always does.
How do I find out which permerror or temperror cause is happening?
The Authentication-Results header (RFC 8601) is the canonical forensic source. Inspect the raw message source (Outlook File > Properties > Internet headers; Gmail three- dot menu > Show original; Apple Mail View > Message > Raw Source) and find the line beginning with "Authentication-Results:". The spf= field will read "spf=permerror" or "spf=temperror" followed by a parenthetical reason — for example: "spf=permerror (no SPF record found)" or "spf=temperror (DNS timeout)" or "spf=permerror (too many DNS lookups)". The parenthetical text varies by receiver but typically names the specific cause class. For programmatic forensic detection, the DMARC Analyzer Email Header Analyzer parses the Authentication-Results header and surfaces the specific failure mode. Aggregate (RUA) reports from RFC 7489 section 7 also include per-record SPF result codes in the auth_results subtree, so you can see the receiver-side verdicts at scale.
Can I fix SPF temperror by changing my SPF record?
Usually not. SPF temperror is a TRANSIENT DNS-level failure — the receivers resolver could not get a response from the authoritative nameserver hosting the SPF record. The fix is on the DNS-infrastructure side, NOT the SPF- record-content side. Diagnose: (1) verify the authoritative nameservers are reachable from the public internet (use dig +trace example.com TXT from outside your network); (2) verify the nameservers respond within the receivers timeout window (typically 5 seconds); (3) check for rate-limiting at the nameserver (some providers throttle aggressive resolvers); (4) check for IPv6-only nameservers when the receiver is IPv4-only (or vice versa); (5) check for DNSSEC validation failures that produce SERVFAIL at validating resolvers. If temperror is intermittent and only affects a small fraction of mail, the issue is usually load- related at the nameserver and the resolution is to migrate to a higher-capacity DNS provider (Cloudflare, AWS Route 53, Google Cloud DNS).
What is the spf=permerror "no SPF record found" message?
A "no SPF record found" permerror means the receiver looked up the senders domain (the envelope MAIL FROM domain per RFC 7208 section 2.3, or in some implementations the HELO domain) and found no TXT record beginning with "v=spf1". Some receivers report this case as "spf=none" (meaning "no SPF policy published") rather than "spf=permerror"; the RFC 7208 specification actually requires "none" for the no-record case (see section 2.6.1). When operators see "spf=permerror (no SPF record found)", the implementation is non-strict per the RFC but the diagnostic implication is the same: publish an SPF record at the senders MAIL FROM domain. The fix is to add a TXT record at the apex of the sending domain: example "v=spf1 include:_spf.google.com ~all" for Google Workspace, "v=spf1 include:spf.protection.outlook.com -all" for Microsoft 365.
What is the difference between SERVFAIL and NXDOMAIN in SPF temperror?
SERVFAIL (RFC 8499 section 4) is a DNS response code meaning the resolver encountered a server-side error processing the query — typically a misconfiguration at the authoritative nameserver (broken DNSSEC signatures, bad CNAME chains, EDNS0 negotiation failures), a temporary connectivity issue, or a rate-limit. SERVFAIL produces SPF temperror because the receiver does not know whether the record exists or not. NXDOMAIN (RFC 8020) is a DNS response code meaning the queried name explicitly does not exist — the domain has not been registered, or it has been deleted. NXDOMAIN does NOT produce SPF temperror; per RFC 7208 section 4.4 paragraph 2 NXDOMAIN on the queried name produces SPF none (no record). NXDOMAIN on a referenced include or a/mx target counts against the 2-void-lookup cap per RFC 7208 section 4.6.4 paragraph 3 — and 2 such void responses in a single evaluation produces permerror, not temperror.

13. Verify your SPF record now

The DMARC Analyzer platform surfaces SPF result codes in three places: the Domain Security Checker runs a live SPF lookup against the public DNS and reports any of the seven permerror cause classes plus the live lookup count; the Email Header Analyzer parses pasted Authentication-Results headers and surfaces the specific spf= verdict and parenthetical reason; the dashboard ingests DMARC aggregate (RUA) reports and surfaces per-record SPF result codes at scale so you can monitor the permerror / temperror rate over time.

Check my SPF record Analyze an SPF permerror or temperror header Sign up — Free plan

Last updated: 2026-09-18