A pool lists sending addresses by name and distributes messages among them. Without shares — in rotation. With shares — in the given proportion, in steps of one tenth of a percent, and the shares must add up to 100.
A pool and a sending address share one namespace. Everything that can choose a sending address — a header, a pattern rule, an API call, a source default — chooses a pool in exactly the same way: by name. The sender does not need to know there is a group behind the name. The flip side: the engine does not resolve name collisions, it rejects the pool definition.
A pool is also a settings scope. Inside it you can declare a <domain> block and seven directives that go to each member. The manual names the resolution order directly: a recipient block inside a sending address inherits first from the pool, then from the node, and a member’s own line overrides the pool one.
Shares in tenths of a percent are a ready-made ramp. A new address at 0.1% versus an established one at 99.9% is the manual’s own example, and it is exactly the task for which a scheduler is usually written.
A pool has no values of its own — they are set by the directives inside. The choice made here is the distribution method:
| How | What you get | When |
|---|---|---|
| without shares | messages in rotation, equally | the addresses are equal and equally warmed up |
| with shares | a given proportion, in 0.1% steps | introducing a new address, a canary share, a migration |
| with a plan instead of a pool | distribution is decided at submission | stages, per-receiver limits and stopping on the spam rate are needed |
What can be moved to the pool so as not to repeat it for each member: a whole <domain> block and seven directives — cold-virtual-mta, domain-key, max-smtp-out, max-smtp-msg-rate, max-smtp-data-volume-rate, include-headers-from, suppression-lists.
# a canary share: the new address gets one message in a thousand <virtual-mta-pool pool2> virtual-mta mta3 99.9 virtual-mta mta4 0.1 </virtual-mta-pool>
what people get wrong and how it ends3 mistakes▶
§ 3.3.13
§ 3.3.1.35
§ 3.3.13.1
3 relations
virtual-mta<virtual-mta-pool>The only line a pool consists of; it is repeated once per member. § 3.3.13.1domain<virtual-mta-pool>This block is why a pool is a scope and not just a distribution. § 3.3.13.2domain-key<virtual-mta-pool>One of the settings a pool hands out to its members. § 3.3.13.3include-headers-from<virtual-mta-pool>One of the seven directives a pool hands out to its members. § 3.3.13.4max-smtp-msg-rate<virtual-mta-pool>One of the settings a pool passes to its members. § 3.3.13.5max-smtp-out<virtual-mta-pool>One of the seven directives a pool hands out to its members; a member’s own line overrides it. § 3.3.13.6
pmta show vmtas
3 articles
◇Warm-up built into the engineA warmed-up address hands the first N messages of the day for each receiver to its cold partner; the partner sends them itself and builds history.◇The sending address — what it is made ofA named set of everything that is a property of the address: which IP the message leaves from, how the node introduces itself, what it signs with and how fast it sends.◇The sender names the stream for each messageThe message carries the name of the stream it should be sent through — the choice is made by the submitting program, not by the node configuration.