Knowledge base

PMTA knowledge base›Block <domain>›Directive§ 3.3.10.57

max-cold-virtual-mta-msg

<domain>

How many of the day's first messages to this recipient domain go out from a cold address
in the configuration this is a linemax-cold-virtual-mta-msg 0/dinside the block <domain>
Warm-up by someone else’s hands: the day’s first messages come from a cold address

The mechanism was invented for one task: to put a new sending address into service without running a separate campaign from it. A warmed-up address hands the day’s first N messages to its “cold” partner, which sends them itself — and gradually builds a history with the recipient domain.

Who is paired with whom is set separately. The partner is named with the cold-virtual-mta directive in the warmed-up address’s block. Here only the quantity is set: how many messages to hand over to it. Zero means the mechanism is off, and that is the default.

The count is kept for each recipient domain separately. The manual says so directly: 1000/day means a thousand messages to Yahoo, a thousand to Hotmail and so on — not a thousand in total. On a fleet sending to a dozen large recipient domains, this is a tenfold difference between expectations and what will actually happen.

Selection happens when a message is received, and only over SMTP. The decision whether a message leaves from the cold address or the regular one is made at submission, not before delivery. Messages submitted through the API are not included in the selection.

The main trap. The cold address does not inherit the settings of the address that hands messages to it. The manual warns about this in a separate line: limits, signing keys, the name in the greeting — all of this has to be set again on the cold address. A warm-up with unsigned messages or without a matching PTR will do more harm to reputation than the warm-up itself does good.
What the Hub does. It does not use it: warm-up in the Hub is driven by a plan — its own schedule, its own message library, a reserve pool of addresses and a stop on the spam rate. The engine mechanism hands over part of the production traffic and thereby makes the warm-up hostage to the mailing: no mailing that day means no warm-up either. We keep it as an alternative for those who warm up without the Hub.
Recommended values

As a ramp, not a single number. The directive accepts a sequence: 1/day,2/day,3/day,4/day — on the first day the cold address gets one message, on the second two, and so on. There is no limit on the list length; the last value repeats every day after that. This is exactly how it should be set: a constant number from day one is not a warm-up.

What to count from. Count per large recipient domain, not for the whole volume: the value is multiplied by the number of recipient domains. It is sensible to start with a handful to a few dozen messages a day per recipient domain and double every few days, watching the bounce rate of the cold address itself.

Several cold addresses. cold-virtual-mta can be repeated — then they are used in rotation, and the limit applies to each of them separately. Two cold addresses at 100/day mean two hundred messages per recipient domain, not a hundred shared by the two.

The ramp and the orders of magnitude are our recommendation. From the manual here come the sequence syntax, the 0/d default and the “per recipient domain” rule.
Example configuration
# the warmed-up address hands the day's first messages to its partner
<virtual-mta vmta1>
    smtp-source-host 1.2.3.4 vmta1.example.com
    cold-virtual-mta vmta-cold
    <domain *>
        max-cold-virtual-mta-msg 1/day,2/day,5/day,10/day    </domain>
</virtual-mta>

# the cold address has its own settings and inherits nothing
<virtual-mta vmta-cold>
    smtp-source-host 5.6.7.8 cold.example.com
    <domain *>
        max-msg-rate 10/h
    </domain>
</virtual-mta>
A four-day ramp: 1, 2, 5, 10 messages per recipient domain, then 10 every day. The cold address has its own smtp-source-host and its own rate — there is no inheritance.
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▶

Counting the limit for the whole volume rather than per recipient domain

§ 3.3.10

What it costs1000/day with ten large recipient domains means ten thousand messages from the cold address a day, not a thousand. The new address gets a volume that is no longer a warm-up, and instead of reputation it earns bounces.
How to spot itThe cold address’s bounce rate grows from the very first day, even though the estimated volume looked safe.
How to do it rightDivide the intended daily volume by the number of recipient domains the fleet actually sends to, and set the result — as a ramp starting from single digits.

Expecting the cold address to inherit settings

§ 3.3.20

What it costsIt inherits nothing: no limits, no signing keys, no name in the greeting. Messages go out unsigned and with a mismatched PTR — exactly how a new address must not look.
How to spot itDelivered messages from the cold address have no signature header; receivers respond with authentication complaints.
How to do it rightGive the cold address a full set: source, name, signing keys, its own limits. It is a separate sending address, not a mode of another one.

Setting a constant number and calling it warm-up

our experience

What it costs100/day from the first day is not a warm-up but a hundred messages a day right away from an address with no history. The point of warm-up is growth: the recipient domain should see a carefully increasing flow, not a step out of nowhere.
How to spot itThe first days go smoothly, then temporary refusals and landing in the “Spam” folder begin — the reputation has not had time to form.
How to do it rightSet a sequence and double the value every few days, checking against the bounce rate of the cold address specifically.
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.
Reference data
Syntax
max-cold-virtual-mta-msg <daily-limit>
Values
a daily number, for example 500/d; a comma-separated sequence is allowed
Default
0/d § 3.3.10.57
Applying
reload, no restart needed
Queue
will not touch what is already queued
Where to write it
<domain>
How many times
once in the block
Everything here comes from the manual, with the section.
Inheritance
The directive lives in a <domain> block inside <virtual-mta>: the value from <domain *> applies to all recipient domains, and a specific domain’s block overrides it. With MX rollup the value of the rolled-up queue is used, not of the individual domains — and the manual warns separately that when an MX rollup list exists, less traffic than configured may go through cold addresses, even for domains that are not rolled up.
How to check on the node
The node does not show the counter separately — look at accounting, at the field that records the address that actually sent the message:
pmtaacctfind --output csv[vmta,rcpt,timeLogged] /var/log/pmta/acct-*.csv
The cold address should appear on the day’s first messages to each recipient domain and disappear once the limit is used up. If it does not appear at all, check that messages are submitted over SMTP: selection happens only on receipt.
In the Hub
Cost of a mistake
reversible: harms only while it is set
Scenarios
Sending address rotation · Address warm-up