critical
Every queue has two states. In the normal one the usual limits apply; in backoff their twins apply — separate directives with the backoff- prefix. Everything essential has a twin: the message rate, the data volume, the connection rate, the number of connections and the retry schedule.
A queue is a “receiving server plus sending address” pair. The mode switches on for the pair, not for the domain: gmail.com from one address can be in backoff mode while from another it is in normal mode.
The mode does not switch on by itself. Entry happens when the receiving server’s reply matches a pattern from <smtp-pattern-list> that carries the mode=backoff action. No pattern list, no entry: the mechanism is present but inert. The manual walks through this with its own example of an AOL error list.
What happens on entry. Everything that is configured: a notification message (backoff-notify), a different retry schedule (backoff-retry-after), a lowered pace (backoff-max-msg-rate) and, if set, rerouting messages to another sending address (backoff-reroute-to-virtual-mta).
Rerouting is the strongest of these measures. Messages move to the queue of the same receiving server but a different address, and from then on that address’s settings apply in full. New messages go there too while the original queue is in backoff mode. Chains are supported: one address diverts to a second, the second to a third. The engine detects loops by itself and silently ignores the rerouting.
Exit is configured separately — and by default it is not configured at all.
backoff-max-msg-rate 5/h · backoff-retry-after 1h,3h,6h,12h · backoff-to-normal-after 1h · backoff-to-normal-after-delivery yes; plus backoff-max-smtp-out 2, backoff-notify and rerouting to a backup address when those are set. None of these lines is written for addresses under warm-up.
Both return conditions are enabled on purpose — for us backoff mode means “almost stop and wait,” not “freeze forever.”
The Hub generates the backup address itself — as a separate block with a suffix in its name, and rerouting to it works only because the domain’s SPF allows all of the node’s addresses in advance. Otherwise the rerouted messages would leave from an address that is not in the SPF record.
🔴 What is unresolved. Inside the node the mode is managed by the engine — it reacts right in the connection. Outside, the Hub’s scheduler does the same job, but from telemetry that arrives seconds and minutes later. Which of them is in charge when both have fired is not defined — this is a question about the product’s design, not about the configuration.
The mode has no values of its own — the twin directives set them. What matters is not which numbers to pick but the fact that each of them defaults to the normal value:
| Twin | Default | What it means in practice |
|---|---|---|
| backoff-max-msg-rate | same as the normal rate | without its own line the mode is no slower than normal |
| backoff-retry-after | same as the normal schedule | retries are not spaced out |
| backoff-max-smtp-out | 20 | as many connections as before |
| backoff-to-normal-after | never | no way out |
| backoff-to-normal-after-delivery | false | no way out |
Hence the rule: set twins in pairs with an exit. A set made of one lowered rate with no return condition is a queue that has slowed down forever. The Hub’s presets set both return conditions and lower the rate sharply: in “Balanced” it is 5/h versus 10/m in normal mode.
Backoff mode is not the same as retry mode. The manual says so directly: a queue that has gone into backoff mode does not go into retry mode automatically. If you need both, the pattern list has a separate defer-queue action.
# entry — by pattern; exit — by two conditions; both are required <smtp-pattern-list block-errors> reply /^421 .* too many errors/ mode=backoff</smtp-pattern-list> <virtual-mta mta-news-1> <domain *> smtp-pattern-list block-errors max-msg-rate 500/h backoff-max-msg-rate 1/h backoff-to-normal-after 1h backoff-to-normal-after-delivery yes backoff-reroute-to-virtual-mta mta-news-1-backoff-vmta </domain> </virtual-mta>
what people get wrong and how it ends4 mistakes▶
§ 3.3.10.53
§ 11.5.2
§ 3.3.10.41
§ 3.3.10.59
3 relations
Four ways to say “slower”Each limit has a twin that replaces it while the queue is in backoff mode. § 3.3.10.41max-errors-per-connection<domain>Repeated errors are what backoff mode exists for; breaking the connection does not replace it. § 3.3.10.1bounce-after<domain>Backoff mode slows down retries but does not extend the deadline: a queue in backoff keeps the same amount of time and gets fewer attempts. § 3.3.10.10backoff-max-msg-rate<domain>The mode in which this value applies instead of the normal one. § 3.3.10.41backoff-max-data-volume-rate<domain>The mode in which this value applies instead of the normal one. § 3.3.10.45backoff-max-connect-rate<domain>The mode in which this value applies instead of the normal one. § 3.3.10.95
pmta show queues pmta show settings gmail.com/mta-news-1 pmta set queue --mode=normal gmail.com
3 articles
◇How the policy for a receiver is assembledSettings are assembled from the most general pattern to the most precise; the order of blocks in the file means nothing.◇How the node responds to the receiving server's wordsMatches SMTP replies against regular expressions and changes the queue mode on a match — the very trigger that all of the backoff mode machinery waits for.◇Reputation monitoring inside the nodeThe engine itself watches the receiving servers’ replies and changes the queue mode on a pattern match — a reaction within the connection, not through telemetry.