critical
Six headers through which the submitting side controls delivery, and each has its own switch on the source:
| Header | What it does | Permission | Keep in the message |
|---|---|---|---|
| X-Virtual-MTA | selects the sending stream | process-x-virtual-mta | retain-x-virtual-mta |
| x-job | tags the message with a job | process-x-job | retain-x-job |
| x-envid | sets the envelope identifier | process-x-envid | — |
| X-DKIM-Options | edits the signing options | process-x-dkim-options | retain-x-dkim-options |
| X-DKIM-Key | brings a private key | process-x-dkim-key | retain-x-dkim-key |
| x-schedule | sets sending windows | process-x-schedule | retain-x-schedule |
The design is the same: one directive decides whether to read the header, the other whether it stays in the message after delivery. The manual stresses that the halves are independent: they can be set in any combination, and neither knows anything about the other.
All defaults are false. That is, header control is off until it is enabled for the source submission comes from. A platform counting on stream selection by header will get no error against a source without permission — the selection simply will not work.
The section on processing the signing key says: if processing is not enabled, the engine does not remove the header, and it advises checking the installation so that private keys do not leak. The section on retaining the same header claims the opposite: with both directives false, the engine ignores the header but still removes it before delivery.
The other sections diverge the same way: the three “process” sections — for the stream, for the envelope identifier, for the signing options — directly say “leaving the header in the message if it was there.” Both phrases about removal are in the “retain” sections and are written as carbon copies.
The weight of evidence is on the side of “stays in the message,” and the cost of error is asymmetric: in the worst case the private key travels to the recipient. Follow the manual’s own advice — check it on your installation rather than choosing between two phrases.
The job header the Hub forbids explicitly — with a process-x-job false line in every named submission source. The other four it does not set at all: they stay at the vendor default false.
The Hub does not touch header retention anywhere, that is, it relies on the default. For X-Virtual-MTA this means the stream name is stripped before delivery and is not shown to the recipient.
# permissions are granted to a source, not to the node as a whole <source 10.0.0.0/24> process-x-virtual-mta yes process-x-job false always-allow-relaying yes </source>
what people get wrong and how it ends3 mistakes▶
§ 3.3.7.44
§ 3.3.7
§ 3.3.7.46
3 relations
domain-keyGlobalA header with a signing key replaces the declared keys for one message. § 3.3.7.46
How the node selects a source and combines its settingsAll permissions are set on the source and obey its merging. § 3.3.7How the node signs messages and chooses a keyChapter 10 describes what exactly the signing headers control. § 3.3.7.45
process-x-envid<source>One of the six submission control headers, with its own permission on the source. § 3.3.7.44process-x-dkim-options<source>One of the six submission control headers, with its own permission on the source. § 3.3.7.45process-x-dkim-key<source>The most dangerous of the six submission control headers. § 3.3.7.46retain-x-dkim-key<source>The “keep or strip” half of the most dangerous of the six control headers. § 3.3.7.47retain-x-dkim-options<source>The “keep or remove” half for one of the six service headers. § 3.3.7.60process-x-job<source>One of the six submission control headers, with its own permission on the source. § 3.3.7.49
grep -n 'process-x-\|retain-x-\|jobid-' /etc/pmta/config /etc/pmta/virtualhost.txt
3 articles
◇Who is allowed to submit mail and for whom to accept itOut of the box, the node accepts submission only from the machine itself; two different questions — “who can send through us” and “for whose addresses we accept mail” — are answered by different directives.◇Selecting a sending address by message contentRegular expressions are matched against a header, the return address or the recipient and select a sending address or assign a priority; lists can call each other.◇The load balancer header at the entranceThe node reads the PROXY header at the start of an incoming connection and treats the address from it as the source; this works for both kinds of entry point.