The task. A warm-up plan sends an exact number of messages from exact addresses at exact times with content that differs between recipients — and with one submission per message this requires a scheduler that must run without interruption.
What it is made of:
The parts have different scopes. Permission to merge is set on the source (allow-mailmerge), delivery windows on the message. Both are properties of what is submitted, not of the node, so one node serves both batched warm-up and ordinary mail.
How they interact. Each part removes one reason to submit messages one by one: merge removes the one-by-one submission itself, reserved variables the loss of control at the recipient level, parts the uniformity, windows the scheduler. The price is the exact moment of sending: the node decides within the window, and if the queue is in retry mode at that time, delivery starts only after it leaves that mode.
What each part takes on:
| Warm-up task | What solves it | Where it is set |
|---|---|---|
| one submission per quota | XMRG, XDFN, XPRT | submission |
| the recipient’s address and job | *vmta, *jobid | recipient variables |
| different texts | *parts | recipient variables |
| sending time | the x-schedule header | message |
| the right to merge | allow-mailmerge | source |
XMRG FROM:<warmup@example.com> XDFN *vmta="vmta-new" *jobid="warmup-day3" *parts=1,2 RCPT TO:<alice@example.org> XPRT 1
grep -rn 'allow-mailmerge\|always-allow-api-submission' /etc/pmta/