Sending can be slowed down in four different ways, and they count different things. Understanding what exactly the chosen limit counts matters more than picking a number.
What each one counts. max-msg-rate — attempts to recipients, with deliveries and bounces counted equally. max-data-volume-rate — bytes, and only successfully delivered ones. This pair has a non-obvious consequence: a receiving server that refuses keeps using up the message limit and stops using up the volume limit.
Next to them — two ways to manage connections. max-smtp-out limits how many are open at once, max-connect-rate how fast they are opened. Plus smtp-out-rampup-interval, which spaces out the opening of new connections over time, and connection-idle-timeout, which keeps an idle connection open instead of reconnecting.
The value grammar is common to the whole manual: N/[M] with the unit d, h, m or s. A multiplier in the denominator allows windows that are not multiples of the unit: 10/2h is not the same as 5/h, because it behaves differently on bursts. Volume limits add size suffixes: 6g/10h.
And every limit has three forms. The regular one; one with the source-ip- prefix — counting for each source address separately; and one with the backoff- prefix — applying instead of the regular one while the queue is in backoff mode (backoff-mode). The per-source-address forms are what make different rates possible for several addresses inside one sending address block.
The Hub does not set a ceiling for the address as a whole. The daily quota is held by its scheduler — it can stop on the spam share and swap in an address from the reserve pool, which the engine’s limit cannot do.
The Hub does not write the per-source-address forms: it has one source address per sending address block, and there is nothing to split within a block.
The choice starts not with a number but with what to limit:
| What is the problem | Which limit | Why not another |
|---|---|---|
| the receiving server complains about the rate | max-msg-rate in the receiver block | it counts attempts — what the receiving server sees |
| a narrow channel, a traffic bill | max-data-volume-rate | it counts bytes, not messages |
| the receiving server drops connections | max-smtp-out | concurrency, not rate |
| the receiving server complains about connection frequency | max-connect-rate | the opening rate, not the number |
| a ceiling for the whole address is needed | max-smtp-msg-rate in the address block | receiver limits multiply by the number of receivers |
Measure first, then limit. The manual advises this directly: take a baseline without a limit and make sure the limit improves deliverability rather than just slowing sending down.
The multiplier in the denominator is not decoration. 10/2h and 5/h allow the same amount per day, but the first permits ten messages in a row at the start of the two-hour window, while the second spreads them more evenly. For a receiving server sensitive to bursts, the difference is noticeable.
# three forms of one limit in one block — they are about different things <virtual-mta mta-news-1> max-smtp-msg-rate 3000/h <domain *> max-msg-rate 500/h source-ip-max-msg-rate 200/h backoff-max-msg-rate 1/h </domain> </virtual-mta>
what people get wrong and how it ends3 mistakes▶
§ 3.3.10.40
§ 3.3.10.44
§ 3.3.10.40
3 relations
enable-source-ip-limits-on-sending-ip<domain>Decides which address the “per source address” forms refer to — the local one or the one the receiving server sees. § 3.3.10.86total-max-smtp-outGlobalThe connection ceiling for the whole node: it is also the upper boundary that all connection limits together will hit. § 3.3.1.2
Warm-up built into the engineTwo ways to spare a new address: send it less, or let only part of the traffic through it. inferencemax-errors-per-connection<domain>The same circle of settings that limit behavior on a connection. inferencemax-msg-rate<domain>One of the four pace limits — the one that counts attempts to receivers. § 3.3.10.40backoff-max-msg-rate<domain>The same rate mechanism, only for backoff mode. § 3.3.10.41max-data-volume-rate<domain>One of the four rate limits — the one that counts bytes, and only successfully delivered ones. § 3.3.10.44backoff-max-data-volume-rate<domain>The same limiting mechanism, only by volume and for backoff mode. § 3.3.10.45
pmta show settings gmail.com/mta-news-1 pmta show vmta-settings mta-news-1
3 articles
◇A queue is a receiving server together with a sending addressThe engine groups messages by the “recipient domain plus sending address” pair: one domain from two addresses is two independent queues with their own counters, connections and mode.◇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.◇Four value types the whole config is written inBoolean, domain pattern, regular expression and time interval — defined once in § 3.2 and then used by all directives.