Name the two checks
A key lookup queries the selector and signing domain from a DKIM-Signature field. For s=outbound and d=example.com, the DNS name is outbound._domainkey.example.com. A syntactically usable key at that name shows that DNS retrieval worked at the observation time.
A signature verification takes a particular received message, canonicalizes the body and listed headers, computes hashes, retrieves the key, and verifies the cryptographic signature. It can fail even when the key record exists.
Compare the evidence
Use separate rows:
| Observation | Required evidence | What it can support |
|---|---|---|
| DNS key lookup | exact name, answer, resolver, time | a record was retrievable and parseable |
| Body hash check | original message bytes and bh= | signed body content matched after canonicalization |
| Signature check | original headers, b=, key, algorithm | the signature verified for the d= domain |
| Receiver result | trusted Authentication-Results | that receiver’s evaluation of that message |
Do not upload a customer message to an unknown web validator. Use the receiving provider’s trusted result or an approved local verifier, and redact only after verification because changing bytes can change the outcome.
Diagnose a mismatch
If the lookup fails, distinguish no record, invalid record, DNS timeout, and temporary resolver error. If the body hash fails, investigate content transformations. If the body hash matches but the signature does not, inspect signed headers, key/algorithm compatibility, and whether the wrong selector or message bytes were supplied.
A dashboard can show “DKIM record valid” while a real message is unsigned, uses another selector, or carries a failing signature. Conversely, a later DNS query can fail after a receiver successfully verified an earlier message; key rotation and cache timing matter.
Report precisely
Write: “At 12:00 UTC, resolver X returned a DKIM key for selector Y. Receiver Z reported dkim=fail for message M.” Keep those statements separate until the message-level cause is proven. Retest with a fresh message through the same sending stream after a change. Success means the trusted receiver verifies the intended signing domain, not merely that a DNS checker finds some key.