critical
One phrase in the manual, said in passing while describing a monitor screen, carries half of the delivery model: messages are grouped by recipient domain separately for each sending address. The same gmail.com sent from two addresses is two queues, not one.
What follows from this. The receiver block limits count the pair, not the domain: max-msg-rate 500/h with two sending addresses means a thousand messages an hour to gmail.com. backoff-mode is also switched on per pair: from one address the queue can be in backoff mode, from another in normal mode. The number of simultaneous connections the receiving server sees from one address has nothing to do with how many another address has opened.
More addresses mean more queues, not less work in each. The same flow of messages spread across three addresses instead of one gives three queues, each with its own full limit. The work is not divided — it is multiplied.
Summaries count differently, and that is not a mistake. The domains screen adds all the addresses together, the queues screen does not. The same number will differ between them, because they are different aggregates.
⚠️ But analytics adds addresses together in places. Breakdowns by provider sum all addresses together — where the engine does not. The number on the “deliverability by provider” screen answers the question “how are we doing with this receiver overall,” not “what is happening in a specific queue,” and the two must not be confused.
And nothing checks that a limit landed in the intended queue. The Hub writes presets into the receiver block inside the sending address block — so per pair, correctly. But anything written by hand into a common block goes to all addresses at once, and there is no warning about it.
The concept has no values of its own — what matters is where the setting is written:
| Where the line is written | Who gets it |
|---|---|
| a receiver block inside an address block | one queue — that very pair |
| a receiver block at the node level | each queue of this domain, one per address |
| a receiver block inside a pool | each queue of each pool member |
The rule: if a number is meant “per receiver from this address,” write it inside the address block. That is what the Hub does, and it is how it should be done by hand too. A common block is fine for what holds for any address: the retry schedule, the encryption requirement, the bounce deadline.
The flow per domain has to be calculated by yourself. Multiply the queue limit by the number of addresses this domain is sent from — there is no other way to find out the allowed total rate.
# the same line in two places means different things <domain gmail.com> bounce-after 4d # true for any address — a common block </domain> <virtual-mta mta-news-1> <domain gmail.com> max-msg-rate 500/h # only for the gmail.com/mta-news-1 queue </domain> </virtual-mta>
what people get wrong and how it ends3 mistakes▶
§ 5.4
§ 5.4
§ 5.4
4 relations
Three short histories for each queueAll three histories are kept per pair of receiving server and sending address, not per domain. § 5.4Sending addressesThe mechanism that is visible here. § 5.9Messages in the queueThe mechanism that is visible here. § 5.13Queues with the most recipientsThe mechanism that is visible here. § 5.9The receiver refused the connectionComparing one receiver across different addresses is what separates an address block from a problem at the receiver. inferenceHow to name a queue in a commandA related mechanism: they work together. § 6.3.14
pmta show queues pmta show domains
3 articles
◇Four ways to say “slower”Messages, data volume, connection rate and number of connections — each has its own limit, and each has a “per source address” variant and a backoff mode twin.◇Recipients deferred after a temporary refusalA recipient to whom the receiver responded with 4xx moves into a separate waiting area with a per-receiver interval; two commands can release it early.◇Three pool rules the manual states directlyRotation-based distribution, inheritance of settings by members with the member’s own values overriding, and a namespace shared with sending addresses.