<domain>
The signature covers the message body and the listed headers. A header not on the list can be changed along the way, and the signature will stay valid: the recipient will verify it and notice nothing.
The mandatory set cannot be changed. The manual lists about thirty headers that are always signed if present in the message: From, Sender, Subject, To, Cc, Date, Message-ID, Reply-To, MIME-Version, the whole Content-* family, the whole List-* family, the whole Resent-* family. This line adds to the set rather than replacing it.
Seven headers must not be signed under the mail standard: Bcc, Received, Return-Path, DKIM-Signature, Keywords, Comments, Resent-Bcc. They change along the way by the design of the protocol, and a signature over them would always break.
Add only permanent headers. A named but missing header breaks the check — it reads as removed.
An expression in slashes catches a family at once. This is how your own headers with a shared prefix are signed without listing each.
An empty string does not mean “sign nothing.” It means “keep the default set”; the mandatory headers cannot be canceled at all.
# we add our own service headers to the mandatory set <domain *> dkim-headers X-Campaign-Id, /^X-Kendali-/</domain>
what people get wrong and how it ends2 mistakes▶
our experience
§ 3.3.10.26
1 relation
dkim-sign<domain>Does nothing until signing is enabled. § 3.3.10.26
pmta show settings gmail.com/vmta1 | grep -i dkim-headers grep -i 'DKIM-Signature' /var/log/pmta/pmta.log | tail -3
3 articles
◇Do not send what will fail the check at the receiverThe node checks the SPF of its own mail before sending: if it fails, it bounces the message without waiting for someone else’s refusal.◇How the node signs messages and chooses a keyThe key is chosen by the sending domain from the headers, going through the declarations from top to bottom.◇A message header with which the submitting side adjusts the signatureFive parameters in X-DKIM-Options: selector, domain, signing identity, query method and key list.