critical
The problem the mechanism solves is single and very specific: you have many sending addresses and many nodes, and distributing the former across the latter is painful. Every address move means editing a node’s configuration, reloading it and a drift between what is configured and what actually is.
The solution is to separate two things. Nodes live on internal addresses and deal with mail. All external sending addresses are gathered on one machine — the proxy. When delivering a message, a node connects to the proxy and tells it a pair: “go out from this address to that one.”
Name resolution stays with the node. It looks up the recipient’s MX itself and decides where to go; the proxy only carries it out and knows nothing about mail.
🔴 The proxy is transparent to accounting. The sending address field records the proxy’s external address, the destination field the receiving server’s address. Regular accounting cannot tell you that a message went through a proxy — for that there are separate dlvProxy* fields that have to be added to the set explicitly.
🔎 This section of the manual is out of date. It ends with the promise “we will add protocol support for inbound traffic in future releases” — but it already exists: use-inbound-proxy on the listener and on the Transmissions API entry point. This paragraph should not be read as a description of capabilities.
The three conclusions of the analysis are built into it: first — the proxy list is a fallback, not a balancer, so the line form was chosen (smtp-proxy-source-host, a sending address of its own for each proxy), and traffic is spread with set pools; second — the gate gets the queue domain through protocol version two with the proxy-include-tlv domain line; third — the Hub itself keeps the “sending address ↔ proxy” mapping: the tag in the engine’s line and the gate table /etc/hubgate/upstreams.tsv are written together, from one registry.
The mechanism has no values of its own — it is assembled from a block and three lines:
| What is needed | How it is set |
|---|---|
| describe the proxy | a <proxy> block with server and client |
| assign it | use-proxy on the node or sending address |
| pass the queue domain | proxy-protocol 2 and proxy-include-tlv |
| see failures in accounting | enable-tq-record-for-proxy-failure plus the tq type |
# the node on an internal address, the external address lives on the proxy <proxy mta-proxy-a> server 10.1.2.3:5000 client 16.70.55.233:0 client.hostname.com </proxy> <virtual-mta vmta> smtp-source-host 10.8.9.10 vmta.hostname.com use-proxy mta-proxy-a </virtual-mta>
what people get wrong and how it ends3 mistakes▶
§ 11.3
§ 11.3
our experience
3 relations
dig +short -x 16.70.55.233
3 articles
◇Cloud restrictionsClouds restrict outbound mail on port 25 until you ask them to lift the limit, and mailbox providers treat their address ranges with suspicion.◇The activation key is a prerequisite for installation, not a step after itWithout an activation key from SparkPost support the engine neither installs nor runs, and the license tier sets the outbound connection ceiling: on Standard everything above 200 is ignored.◇How to turn a sending plan into hardwareTwo constants for sizing any node: about 2 KB of memory per queued recipient and spool space proportional to the total size of the messages.