Knowledge base

Four ways to say “slower”

critical

rate limits
Four quantities, three forms of each

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 main trap is forgetting where a limit lives. Receiver block limits count one queue, that is, the “receiving server plus sending address” pair. max-msg-rate 500/h with ten receiving servers means five thousand messages an hour from the address, not five hundred. A ceiling for the address as a whole is set only by two directives of the sending address block, max-smtp-msg-rate and max-smtp-data-volume-rate, and there is no other way. A number moved from the receiver block to the address block or back changes its meaning many times over.
What the Hub does. It writes the queue rate and the number of connections from the node preset: max-msg-rate (2/m, 10/m or 30/m; 500/h if the field was left empty), max-smtp-out, max-msg-per-connection, and during warm-up its own lowered values. It also writes the full set of backoff mode twins (backoff-mode).

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.

Recommended values

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.

The selection table is ours. From the manual here are the value grammar with the multiplier, the set of four limits and their three forms, the difference in what the message limit and the volume limit count, and the advice to measure a baseline.
Example configuration
# 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>
The highlighted line applies to the queue — that is, to the pair of receiving server and address. The middle one counts the same thing but separately for each source address. The bottom one replaces the top one while the queue is in backoff mode. The top line of the address block is the only one that counts the address as a whole.
yellow — — directive names, blue — blocks. They are highlighted the same way in the text of the card.
▲

Common mistakes and problems

what people get wrong and how it ends3 mistakes▶

Moving a number between the receiver block and the address block

§ 3.3.10.40

What it costsIn the receiver block a limit counts one queue and multiplies by the number of receivers; in the address block it multiplies by nothing. The same number means quantities that differ many times over.
How to spot itActual sending is several times higher or lower than calculated, and the factor equals the number of receivers.
How to do it rightCalculate from what you are limiting. Check with two commands: queue settings and address settings print different sets.

Limiting traffic with the volume limit

§ 3.3.10.44

What it costsThe volume limit counts only successfully delivered bytes. Retries, broken transfers and everything that bounced are invisible to it — actual outgoing traffic ends up higher than allowed, and the more so the higher the bounce rate.
How to spot itThe provider shows a volume above the ceiling that was set, and the gap grows along with bounces.
How to do it rightLimit the channel with node-level tools. The volume limit is about what was delivered, not about what was transmitted.

Setting a limit without taking a baseline

§ 3.3.10.40

What it costsThe manual advises the opposite. A number pulled out of thin air is usually either above the actual rate — and then affects nothing — or below it, and then slows sending without improving deliverability.
How to spot itAfter introducing the limit the bounce rate did not change, and the queue takes longer to drain.
How to do it rightMeasure the rate without a limit for at least a day and set a value below the measured one only when the receiving server complains.
Compatibility
PowerMTA 6.0
described in the manual of this version · platform: any
The vendor does not state the first version for every directive — there is no note here. The name also appears in the 5.0 edition of the manual.
Inheritance
Limits live in the receiver block and merge by the usual rule: from the general pattern to the exact one, and across levels — node, pool, sending address — where the narrowest is strongest. The backoff mode twins are inherited the same way, but with a peculiarity: without its own line, each takes the value of its regular twin. The two sending-address-level limits live in the address block itself and are not split by receiver.
How to check on the node
The engine prints the effective values — already after merging — and for the two levels these are different commands:
pmta show settings gmail.com/mta-news-1
pmta show vmta-settings mta-news-1
The first prints the queue limits: rate, volume, connections, connection rate and all their twins. The second prints the two address-level limits that are not in the first. The limit firing itself shows in the web monitor as a line like message rate limit reached (based on … in configuration) — the name in parentheses immediately tells which of the similar limits held sending back.
In the Hub
Cost of a mistake
reversible: harms only while it is set
Scenarios
Address warm-up · Tune the pace for a provider
Priority
critical