DELIVERABILITY

SPF record errors: trace the identity, fix the path

Turn an SPF failure into a specific repair: identify the checked domain, follow the evaluated path and give the DNS owner an evidence-backed change.

  • Connect an SPF result to the checked identity and sending route.
  • Reconcile an SPF lookup budget without counting DNS packets.
  • Prepare a targeted repair with validation and rollback evidence.

A closer look

Start with the identity the receiver checked

An SPF investigation needs a message, a receiving system and a checked identity. “The domain has an SPF problem” is too broad to assign or repair. Begin with one representative failure and preserve its timestamp, sending route and receiver result before making changes. Two messages bearing the same visible sender can take different routes and produce different evidence.

SPF normally checks the domain in the SMTP envelope MAIL FROM, which can differ from the visible From address. Use the identity reported by the receiver rather than assuming that the website domain is the one to edit. If the evidence identifies HELO instead, record that identity explicitly.

Build a small case record. Ask the sending owner to confirm which application originated the message and which service handled its final outward delivery. Ask the receiving owner for the original result where available. A copied error sentence without the surrounding identity can lead the DNS owner to a perfectly valid but unrelated record.

The minimum useful case record
FieldWhat to captureWhy it changes the investigation
Checked identityExact domain and whether the result identifies smtp.mailfrom or smtp.heloDetermines the DNS owner name to investigate.
Sending routeApplication, sending account and observed connecting IPSelects the path through the policy.
Receiver evidenceSPF result, full SMTP diagnostic if present, and timestampKeeps a protocol result separate from a delivery decision.
OwnerPerson responsible for the sending route and person responsible for DNSMakes the eventual repair assignable.

References [2]

A closer look

Classify the result before choosing a remedy

A result label should change the next question. A temporary problem calls for evidence about an intermittent dependency; a permanent evaluation error calls for examination of the published policy and its path. Neither label, by itself, proves that the connecting sender should have been authorized.

The receiving system decides what to do with an authentication result. Preserve its complete response before treating an SPF label as a rejection reason. For example, a dashboard may show a failed SPF check alongside a delivered message. Your case should distinguish the check that occurred from the action that followed.

Compare a failing sample with a passing sample from the same intended workflow. Keep differences visible: source IP, envelope domain, time, recipient system and route. This comparison is often more useful than collecting many screenshots of a generic warning. Escalate to the responsible owner when the underlying evidence is unavailable; do not compensate by guessing a new authorization.

SPF results and the next useful question
ResultMeaning for the investigationNext question
temperrorA transient evaluation problem, such as a DNS failure.Is it reproducible, intermittent, or limited to a particular resolver or time?
permerrorThe policy cannot be evaluated correctly, for example because of multiple SPF records or an exceeded limit.What specific record or evaluated term causes the error?
failThe evaluated policy says this sender is not authorized.Is this an unintended route, an omitted legitimate sender, or the expected result?
softfailThe policy gives a weaker negative indication about the sender.Does the intended authorization agree with the observed route?
passThe evaluated policy authorizes the sender.Does this sample represent every route included in the repair scope?

References [3] [4]

Worked example

Separate record shape from sender authorization

Inspect the records at the exact checked owner name. Multiple SPF TXT records at that name can produce a permanent error. A single TXT resource record split into several character strings is different: the strings are joined without inserting spaces. Keep that distinction visible when a DNS interface wraps a long value.

Treat a proposed merge as an authorization decision. First inventory the routes each existing record was meant to support. Name an owner for each route, establish whether it still sends, and capture the intended result for a representative address. A syntactically tidy replacement can still break a billing system or leave a retired sender authorized.

The examples below illustrate record shape only. They are not records to paste into a live domain. In the split record, the trailing space inside the first quoted string is deliberate. In a real change, use the DNS editor’s documented input format and compare the resulting record with the approved value.

Fictional TXT record shape: two records versus one split record
TWO SEPARATE SPF TXT RESOURCE RECORDS — conflicting policy
shape.example.org. TXT "v=spf1 ip4:192.0.2.10 -all"
shape.example.org. TXT "v=spf1 ip4:192.0.2.20 -all"

ONE TXT RESOURCE RECORD — two character strings
shape.example.org. TXT "v=spf1 ip4:192.0.2.10 " "ip4:192.0.2.20 -all"

Concatenated value of that one record:
v=spf1 ip4:192.0.2.10 ip4:192.0.2.20 -all
  1. Different objects

    The two separate records are not made into one policy simply because a control panel displays them together.

  2. Scope of this illustration

    Both addresses are documentation addresses. The example demonstrates formatting, not an approved authorization list.

References [1] [3]

Worked example

Count the evaluated path, then inspect the DNS dependencies

The ten-term limit covers evaluated include, a, mx, ptr, exists and redirect terms, including nested evaluations. ip4, ip6 and all consume none. The first matching mechanism ends evaluation; redirect applies only when none matches. This is a term budget, not a packet count. MX and PTR also have separate expansion limits. Void lookups are a separate constraint: RFC 7208 recommends a limit of two and permits configuration.

Use the complete fictional answer inventory below to follow one IPv4 message. It contains reserved example domains and documentation addresses. TXT and address answers are assumed to be available as written; the one exception is the stated NXDOMAIN response. This is an evaluation exercise, not a live DNS test or a deployable zone file.

Write the connecting IP beside your trace. Mark each evaluated lookup-causing term in order and keep a separate note for missing answers or DNS errors. Do not add another term merely because an MX evaluation needs an address answer. Do not count an include’s policy fetch twice. The initial SPF record retrieval is not an additional term in this budget.

Complete fictional DNS inventory for the worked IPv4 trace
bounce.example.org. TXT "v=spf1 ip4:192.0.2.10 include:core.example.net include:tools.example.net redirect=last.example.net"
core.example.net. TXT "v=spf1 include:core1.example.net include:core2.example.net -all"
core1.example.net. TXT "v=spf1 ip4:198.51.100.10 -all"
core2.example.net. TXT "v=spf1 ip4:198.51.100.20 -all"
tools.example.net. TXT "v=spf1 a:relay.example.net mx:mail.example.net exists:ok.example.net include:tool1.example.net include:tool2.example.net -all"
tool1.example.net. TXT "v=spf1 ip4:198.51.100.30 -all"
tool2.example.net. TXT "v=spf1 ip4:198.51.100.40 -all"
last.example.net. TXT "v=spf1 a:backup.example.net -all"
relay.example.net. A 192.0.2.20
mail.example.net. MX 10 mxhost.example.net.
mxhost.example.net. A 192.0.2.30
backup.example.net. A 203.0.113.77

Specified negative answer: ok.example.net. A -> NXDOMAIN
  1. The checked identity

    The exercise evaluates bounce.example.org for connecting IP 203.0.113.77. Other addresses select different paths.

  2. What the counter represents

    Numbers in the next section represent evaluated terms. They do not measure network requests, cache hits or the number of TXT records in this inventory.

References [1]

A closer look

Reconcile the failure and the proposed repair

For 203.0.113.77, the first ip4 mechanism does not match. The core branch returns fail, so its include does not match the parent; the tools branch later does the same. The parent then reaches its redirect. The table accounts for every counted term on that path.

At term 11, evaluation exceeds the budget before the backup address can authorize the message. The fact that this address appears in the inventory does not rescue the path. The exists check produced one void lookup. It did not itself exceed the recommended void limit; the demonstrated failure is the term budget.

Now suppose the fictional owner confirms that tool1 and tool2 are retired and approves removing their includes from tools.example.net. The same fallback path loses two terms: 11 minus 2 equals 9. Its backup address now matches at term 9. Record that ownership decision alongside the arithmetic; the arithmetic alone is not permission to remove working senders.

Original path for 203.0.113.77
CountEvaluated termResult in this fixture
1–3include:core; then include:core1 and include:core2Neither leaf address matches; core ends at -all.
4include:tools.example.netEnters the second branch.
5a:relay.example.net192.0.2.20 does not match.
6mx:mail.example.netIts single host resolves to 192.0.2.30; no match.
7exists:ok.example.netNXDOMAIN; no match and one void lookup.
8–9include:tool1 and include:tool2Neither leaf matches; tools ends at -all.
10redirect=last.example.netThe parent had no matching mechanism.
11 attempteda:backup.example.netBudget exceeded: permerror before this term’s address lookup.

References [1]

Put it into practice

Choose a repair that preserves intended controls

Write the smallest proposed change that addresses the demonstrated cause. If the problem is duplicate records, reconcile the intended senders before producing one policy. If it is a long evaluated path, identify unnecessary branches and confirm their ownership. If it is a transient DNS failure, investigate availability before changing the authorization list.

Do not delete an active include merely to make a checker turn green. Do not replace an included policy with a one-time copy of its current addresses unless an accountable owner has accepted the ongoing update obligation. That replacement can become stale when the sending service changes. An apparent simplification can transfer maintenance work to a team that never agreed to perform it.

Keep the DNS proposal, route inventory and test cases in one change record. For each removed item, record why it is no longer required and who confirmed that conclusion. For each retained dependency, record the service or team that owns it. This makes the repair explainable when someone revisits the domain months later.

Your practical checklist

The essentials

Close the case with representative evidence

A successful test should answer the question the repair was meant to resolve. If a fallback path exceeded the budget, a message that matches the first mechanism is weak evidence for closure. Include a representative sample from the repaired branch and samples from other legitimate routes whose policy was touched.

Record the observed connecting IP and checked identity again. Compare the receiver’s result with the expected outcome and retain the timestamp and full diagnostic. When a sample takes an unexpected route, investigate the difference before declaring the DNS proposal wrong. The comparison must concern the same identity and a relevant path.

Set a rollback trigger that someone can act on: an intended route develops an error attributable to the change, a required sender loses authorization, or the published record differs from the approved value. Restoring the captured record is one possible response, but first consider whether that restores the original fault. Escalate that tradeoff to the named owner rather than hiding it in a generic “revert if needed” note.

Closure means the scoped problem has been resolved with evidence. It does not establish inbox placement or guarantee every future sending address. Leave the ongoing owner with the dependency inventory and explain what should trigger another review, such as adding a new sending application or changing a route.

Put it into practice

Copy the SPF repair handoff

Use this worksheet to turn the investigation into a reviewable request. Keep private message content out of the shared note; reference controlled evidence where necessary. The DNS owner should be able to understand the proposed edit, its affected routes and its acceptance checks without reconstructing the investigation from chat.

Leave unknowns explicit. “Owner not yet confirmed” is more useful than treating an unfamiliar include as disposable. Do not mark the repair complete until the assigned reviewer has compared the expected outcomes with representative receiver evidence.

SPF investigation and repair worksheet

Copy this worksheet into your own document, then fill it in with your details.

SPF REPAIR HANDOFF
Case / date / investigator:
Affected workflow and business impact:
Checked identity: [smtp.mailfrom or smtp.helo + exact domain]
Connecting IP / route / receiver / timestamp:
Observed SPF result and full diagnostic reference:
Current DNS record snapshot and owner name:

PATH EVIDENCE
Evaluated lookup-causing terms in order:
Highest evaluated term count / failing term:
Void answers or separate expansion-limit findings:
Passing comparison case and why its path differs:

PROPOSED CHANGE
Exact record change / reason:
Routes retained and accountable owners:
Items removed / owner confirmation for each:
Expected path and outcome after change:
DNS change owner / reviewer / planned window:

ACCEPTANCE AND RECOVERY
Representative routes and expected results:
Receiver evidence references / timestamps:
Rollback trigger / authorized decision owner:
Captured prior value / tradeoff if restored:
Open questions / next review trigger:
Final disposition and reviewer:

Copy this into your own workspace. This page does not inspect a live domain, change DNS or verify a message.

Repair the demonstrated path

A useful SPF fix connects the receiver’s result to the evaluated identity, explains the failing path and preserves every intended sending route.

A LITTLE MORE CLARITY

Your questions, answered.

Why can one message pass SPF while another gets permerror for the same domain?+

Compare their connecting IPs and paths. In the worked example, one address matches immediately while another reaches an over-budget fallback branch. Use a representative failing sample to assess the repair; an early passing sample does not exercise that branch.

Does ten SPF lookups mean ten DNS packets?+

No. Keep an evaluated-term ledger like the worked example. DNS traffic can involve caching and additional answers; a packet count is not a substitute for that ledger.

Can I fix the limit by removing an include or copying its IP addresses?+

Only propose a removal after its owner confirms the route is no longer needed. Copying current addresses creates a maintenance obligation that can outlive the investigation. Record who will keep that authorization accurate before accepting such a design.

What should I send to the person who manages DNS?+

Send the checked identity, receiver evidence, current record, failing path, exact proposed edit and representative acceptance cases. Include a named reviewer and recovery decision owner. The worksheet above brings those pieces into one assignable handoff.

Sources and further reading
  1. RFC 7208: SPF record construction, evaluation and DNS lookup limits
  2. Microsoft Learn: configure SPF and identify the envelope sending domain
  3. Microsoft Learn: troubleshoot email authentication problems
  4. Google: Postmaster Tools authentication troubleshooting

YOUR NEW SECRET WEAPON

Build your empire.
Command total inbox deliverability.

Take total control over your outreach capacity. Run millions of emails across Google, Microsoft, and private servers & IPs with bulletproof inbox placement from day one.