<source>
How many recipients the node agrees to accept in one message. The submitting system lists them with RCPT TO commands — one per address — and as soon as their number goes over the limit, the following ones get a refusal.
The default is 0, that is, no limit. Out of the box the node will accept a message with any number of addresses, however many the submitting system names. The directive is needed where such generosity has to be curbed: there are several submitters, or there is one, but it makes mistakes.
The refusal applies not to the message but to the extra addresses. Each RCPT TO over the limit is rejected on its own; the message stays accepted and goes to the recipients that fit. This behavior is switched by the neighboring line too-many-rcpts-fails-message: with it the refusal moves to DATA, and then the message is not accepted at all. Without it the extra addresses simply drop out of the message.
The namesake from the receiver block is a different directive. <domain> carries a setting with the same name, and it is not about acceptance but about sending: how many addresses to put into one transfer to the receiver. Its default is 1000, not 0, and its meaning is the opposite — not “how many to accept” but “into how many pieces to split.” The name clash is the vendor’s, and it is worth keeping in mind when reading someone else’s configuration.
For our submission this does not matter: warm-up sends messages to one recipient each — there is nothing to hit. The line would become necessary on a node that receives batches, and especially where there are several submitters.
Keep 0 while the submission is your own. The limit protects the node from someone else’s mistake. If messages are submitted by our own scheduler, one recipient per message, there is nothing to limit, and an extra line only adds a way to shoot yourself in the foot.
Set it when there are several submitters. Then the number is not taken out of thin air but from how those systems work: the largest legitimate batch size plus a margin. A value too low will start silently trimming mailings, a value too high will protect nothing.
Set it as a pair. Separately from too-many-rcpts-fails-message the limit is almost useless: it shrinks the message instead of rejecting it. The pair “limit plus refusal at DATA” gives the submitting system an honest failure it will see and can retry.
# a limit without the paired line trims the message; with it — rejects it entirely <source 10.0.0.0/8> require-auth true max-rcpt-per-message 500 too-many-rcpts-fails-message true </source>
what people get wrong and how it ends3 mistakes▶
§ 3.3.7.39
§ 3.3.10.83
§ 3.3.7.39
3 relations
grep -n 'max-rcpt-per-message\|too-many-rcpts-fails-message' /etc/pmta/config pmta test config
3 articles
◇How a message gets into the engineSix described submission methods: extended SMTP, four language bindings and a directory the node watches on disk.◇Who is allowed to submit mail and for whom to accept itOut of the box, the node accepts submission only from the machine itself; two different questions — “who can send through us” and “for whose addresses we accept mail” — are answered by different directives.◇Headers the sender uses to control deliverySix control headers let the submitting side choose a stream, tag a message with a job, set signing options and the key, the envelope identifier and the schedule; each is allowed separately and per source.