Knowledge base

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

max-rcpt-per-transaction

<domain>

How many recipients are passed to the receiver in one transfer
in the configuration this is a linemax-rcpt-per-transaction 1000inside the block <domain>
Slicing one message into several transfers

How many addresses the node names to the receiver in one transfer. A message with a large list does not go out at once but in parts: the manual walks through this with its own example — five thousand recipients of one domain with a limit of three thousand are transferred twice, first three thousand, then the remaining two.

The message body is transferred anew each time. That is the whole cost of the setting. Cut the list into five pieces, and the receiver got the body five times: traffic grew fivefold, even though there is still one message. The manual says it directly: smaller values increase parallelism and reduce efficiency.

What you get in return. The pieces can travel over different connections at once — one message stops being one long transfer. On a large list this is the difference between “stuck on one connection” and “spread across ten.”

The directive has two names. max-rcpt-per-message in this same block is the very same limit; the manual says so directly, calling one an alias of the other. In its output the engine prints the second name, not this one.

The main trap. The cost is measured in bytes, not in messages. A hundred-kilobyte message cut into fifty pieces is five megabytes to the receiver instead of a hundred kilobytes. If the sending address has a volume ceiling, it will be used up by what was actually transferred, that is, fifty times faster than expected. Lowering this limit “for parallelism” without recalculating the volume is a sure way to run into your own limits where you do not expect them.
What the Hub does. It does not write it — under either name. The vendor’s thousand remains.

For our sending the limit does not come into play at all: warm-up sends messages to one recipient each, and there is nothing to cut. The setting becomes meaningful on a node that receives messages with large lists — there it is set together with the number of messages per connection max-msg-per-connection, not separately.

Recommended values

Leave it alone while the list per message is small. With one or two recipients the limit plays no part. The conversation about it starts where a message has hundreds of addresses of one domain.

Count in bytes, not in messages. The estimate is simple: the body size multiplied by the number of pieces is what goes to the receiver. Halving the limit doubles the traffic, and that number has to be checked against volume ceilings, if they are set.

Lower it at the receiver’s request. Major receivers limit the number of addresses per transaction themselves and refuse the extra ones. Then the limit is set by their rule, and this is the only case when it is chosen for reasons other than speed.

The calculation order is our recommendation. From the manual here come the 1000 default, the example with five thousand recipients and the direct statement that smaller values increase parallelism and reduce efficiency.
Example configuration
# the list is cut into pieces of a hundred addresses — the body travels as many times
<domain yahoo.com>
    max-rcpt-per-transaction 100    max-msg-per-connection 5
</domain>
The two lines decide different things: the upper one — how many transfers to cut the message into, the lower one — how many messages to carry over one connection. They are calculated together: fine slicing with few messages per connection forces connections to be opened continuously.
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▶

Lowering it for parallelism without counting traffic

§ 3.3.10.82

What it costsThe body is transferred anew for each piece. A limit lowered from a thousand to a hundred on a list of a thousand addresses means a tenfold increase in outgoing volume to this receiver for the same number of messages.
How to spot itThe volume of bytes handed over has grown many times, the number of messages has not changed; volume ceilings are hit earlier than calculated.
How to do it rightEstimate the body size times the number of pieces before the edit and check it against the volume ceilings that are set. If parallelism is needed, adding connections is cheaper than cutting the message.

Setting both names at once, treating them as different settings

§ 3.3.10.83

What it costsThe names are aliases of one field. Two lines in one block neither add up nor narrow each other: one applies, and the other creates the impression of a setting that does not exist.
How to spot itThe block has two limits with different numbers, while the engine prints one value, and it is not always the expected one.
How to do it rightKeep one name across the whole configuration. Check the effective value with the queue settings command, not by reading the file.

Copying the number from the submission block

§ 3.3.10.82

What it costsIn the submission block the same-named directive is an acceptance ceiling with the default 0. Here it slices the transfer, with the default 1000. The manual does not describe a zero carried over here at all.
How to spot itThe value in the receiver block does not resemble any real transfer size, and sending behavior has not changed.
How to do it rightTell the sides apart: acceptance is limited by <source>, sending by this block. Numbers do not carry over between them.
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-rcpt-per-transaction <integer>
Values
a positive integer
Default
1000 § 3.3.10.82
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 value merges across matching <domain> blocks from general to specific: the most precise match wins, and the order of lines in the file does not matter. The directive’s second name sets exactly the same field — if both appear in the configuration, the one found in the more precise block applies. It is picked up by pmta reload.
How to check on the node
The effective value is printed by the queue settings command — under the second name:
pmta show settings yahoo.com/mta-news-1
In the Queue Settings section the line is called max-rcpt-per-message — the engine prints both aliases under this name. Right next to it you can see max-msg-per-connection, which this limit is calculated together with.
In the Hub
Cost of a mistake
reversible: harms only while it is set
Scenarios
Troubleshoot deliverability · Tune the pace for a provider