Bounce and error codes

dkim=fail (body hash did not verify)

Last updated 2026-08-14

The signature is intact and the key is fine. The body arrived different from the body that was signed, so the hash does not match. Something on the path edited your message.

What it means. The receiver recomputed the hash of the message body and compared it with the bh= value in the DKIM-Signature: header. They differ, so the signature is void and DKIM cannot align for DMARC.

What to change. Find the hop that edits the body and either stop it editing, or move signing to after it. A security gateway that appends a banner is the usual answer.

When it clears. Next message, once signing happens after the last modification. There is nothing to propagate.

Where you see it

Authentication-Results: mx.google.com; dkim=fail reason="signature verification failed" header.i=@example.com header.s=selector1 (body hash did not verify)

In OpenDKIM logs it reads body hash did not verify flat out. Either way, the consequence is the same: DKIM contributes nothing to DMARC for that message, and if SPF does not align either you get 550 5.7.509 or a policy rejection at whichever receiver is enforcing.

Causes, most likely first

  1. A security gateway or antivirus appliance appending a banner. External sender warnings, disclaimers, scan footers. If it edits outbound mail after your mail server signs it, every message you send is broken and you may not have noticed because most receivers only care when DMARC does.
  2. Mailing list software. Footers, [list-name] subject prefixes and link rewriting all change signed content. Nothing you can do at your end beyond making sure the list rewrites the From header.
  3. Transport rules or disclaimers in Exchange. A rule that appends HTML to outbound mail runs after signing in some configurations.
  4. Link rewriting by a click-protection product at either end. It rewrites URLs inside the body, which is exactly what the hash covers.
  5. A relay re-encoding MIME. Converting quoted-printable to base64, or rewrapping long lines, changes the bytes even when the text is identical. This is what relaxed body canonicalization exists to soften, and it only forgives whitespace.
  6. Signing the wrong copy. An MTA that signs before a content filter edits, in a multi-hop outbound path where nobody drew the diagram.

Prove which one

  1. Does it fail for every recipient, or only some? Every recipient means the break is on your side, before the message leaves. Only list members or only one partner means it is on the path.
  2. Send yourself a copy through the same route and diff what arrived against what you sent. A banner, a footer or a rewritten link will be visible to the eye.
  3. Read the signature header. The c= tag shows canonicalization, for example c=relaxed/relaxed. The second half is the body. simple is unforgiving of a single changed byte, including trailing whitespace, and switching to relaxed fixes a real subset of these cases.
  4. Confirm the key is published and correct with the DKIM checker, using the s= and d= from the header. It should be fine for a body hash failure, and it takes ten seconds to rule out.

Fix

Once it is fixed, the way to confirm at scale is aggregate reports: a source that shows DKIM failing while SPF passes across many messages is a body-modification problem, not a key problem. Reading them is the next step, and our weekly digest flags exactly that pattern.

Hear about the next failing sender first

This rejection named one sender, and the next to break sends no warning ahead of it. On a paid plan, the first failing report from a new source reaches you as an email that day, not in Monday's digest. Pro watches 5 domains for $19 a month.

Get the alerts and the digest

No card · 12+ months of history · The free plan does not expire

Questions

What is the difference between 'body hash did not verify' and 'signature did not verify'?

Body hash means the content changed after signing, so the hash in the bh= tag no longer matches. Signature did not verify means the cryptographic check failed against the published key, which points at a key mismatch or a rotated selector instead.

Do mailing lists always break DKIM?

Only the ones that modify the message, which is most of them: footers, subject tags and link rewriting all change the signed content. Lists that rewrite the From header into their own domain sidestep DMARC entirely, which is why so many now do it.

Will the l= tag fix it?

It limits the signed body to a byte count so appended text does not break the hash, and it also lets anyone append arbitrary content to your signed message. Do not use it.