Home
Features
Modules
Integrations
PowerMTA Docs
MailerQ Docs
Pricing
Blog
D
e
m
o
Home
Features
Modules
Integrations
PowerMTA Docs
MailerQ Docs
Pricing
Blog
D
e
m
o
Home
Features
Modules
Integrations
PowerMTA Docs
MailerQ Docs
Pricing
Blog
Home
Knowledge base
Knowledge base
PMTA knowledge base
›
Theme
Mail submission
entries in this theme: 55
always-allow-relaying
Global
critical
set by the Hub
Directive
The very reason a node sends mail at all — and the thing that makes it an open relay if granted to the wrong source.
smtp-listener
Global
critical
set by the Hub
Directive
If no listener is declared, the node silently brings one up on 0.0.0.0:25.
source
<smtp-user>
set by the Hub
Directive
Binds the login to a named source block; its settings apply after login and override what the connection’s address would have given.
source
<smtp-listener>
Directive
Binds the listener to a named source block, canceling the usual address-based matching for its connections.
accept-invalid-recipients
<source>
Directive
Syntactically invalid addresses are accepted and immediately bounced instead of being rejected right in the submission session; they will not be delivered either way.
allow-auth
<source>
Directive
A switch for the very possibility of logging in: with no the engine neither advertises nor accepts AUTH, and there is no way to log in.
allow-smtputf8
<source>
Directive
Advertises the SMTPUTF8 extension, allowing addresses beyond Latin script; sending is not guaranteed — the receiver may not support it.
always-allow-api-submission
<source>
Directive
One line instead of listing the permissions required by submission through the vendor API; currently equivalent to the merge permission.
await-slot
<smtp-listener>
Directive
Decides for one listener whether to wait for a free slot or respond with a refusal; the node-wide line sets the same for all the others.
disconnect-on-transient-error
<source>
Directive
Instead of a 4xx response the engine drops the connection — for a submitting side that cannot handle temporary refusals.
max-message-size
<source>
set by the Hub
Directive
Without the line the size is not limited at all — the engine’s default is “unlimited.”
max-message-size
<transmissions-api>
Directive
A limit on the payload size of a request to the submission API; the size multiplier is mandatory, and the engine will not accept a value above two gigabytes.
max-rcpt-per-message
<source>
Directive
A ceiling on acceptance: how many addresses the node agrees to take in one message from the submitting system.
pickup
Global
Directive
Sets a pair of paths: where to read submitted files from and where to put the ones that could not be processed. Only one directory is supported.
process-x-sp-subaccount-id
<signals>
Directive
Allows the submitting side to assign a subaccount with a message header; the number from the header overrides the one set by the configuration.
process-x-sp-subaccount-id
<inline-seeding>
Directive
Allows taking the subaccount number from a message header; off by default.
relay-address
Global
set by the Hub
Directive
The address counterpart of accepting by domain: it accepts a specific address or a regular expression, not a whole domain; the line is repeated.
relay-debug
Global
Directive
Switches relay control into debug mode: instead of a final refusal the node responds with a temporary one, and the message stays with the sender instead of bouncing.
relay-domain
Global
Directive
Lists domains for which the node accepts mail regardless of who submits it; the line is repeated, and it is needed only where the node handles inbound mail.
smtp-await-slot
Global
Directive
When there are no free inbound connection slots, the node either waits for one to free up or answers with a 421 greeting and closes the connection.
source-group
<source>
Directive
Names the group the source is assigned to; the limits shared by the group are set in the group block, not here.
too-many-rcpts-fails-message
<source>
Directive
Instead of refusing the extra recipients, the engine rejects the message at the DATA command; it works together with the recipient number limit.
total-max-smtp-in
Global
set by the Hub
Directive
Limits the number of simultaneous inbound SMTP connections for the whole node.
allow-chunking
<source>
Directive
Allows the submitting side to transfer a message with the BDAT command instead of DATA; the default is to allow.
auto-qualify-domain
<source>
set by the Hub
Directive
An address of the form user@host arriving in MAIL FROM or RCPT TO is completed to a full one by adding a suffix; the default is to complete.
domain-suffix
Global
Directive
The suffix appended to a single-part domain when completing addresses; it works only together with completion itself.
max-message-hops
<source>
Directive
Loop protection: the node does not accept a message that has passed through too many mail systems.
smtp-command-timeout
<source>
Directive
The wait limit for data from the submitting side during the command exchange; the paired line to the body transfer limit.
smtp-data-timeout
<source>
Directive
The wait limit for data from the submitting side after the DATA or BDAT command; applies only to incoming connections.
total-max-transmissions-api
Global
Directive
How many submitting HTTP connections the node serves at once; the engine does not check an upper bound — the operating system sets it.
pickup-retry-interval
Global
deprecated
Directive
The directive is marked deprecated in the manual and not described: no purpose, no syntax, no default.
smtp-ip
Global
deprecated
Directive
The replacement is smtp-listener: address and port in one line, and its presence silences this line.
smtp-port
Global
deprecated
Directive
The other half of a replaced pair: the port was set separately from the address, now they are written in one line.
How the node selects a source and combines its settings
critical
Mechanism
A connection falls under all source blocks whose addresses cover it, and they act merged — the narrow one overrides the wide one; named blocks are attached only by direct reference.
Job header
critical
Mechanism
The
x-job
header tags a message with a job; the node reads it only if the source is allowed
process-x-job
, and then the job is visible in accounting, the monitor and pause commands.
Who is allowed to submit mail and for whom to accept it
critical
Mechanism
Out 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.
Reserved merge variable names
critical
Mechanism
Some merge variable names are taken by the engine: you cannot give your own variables these names.
What the submission bindings need
Mechanism
What must be in place on the submitting side for the bindings to work: a library, permissions and group membership.
What the submitting system assembles before sending
Mechanism
All five language bindings provide the same three objects — a connection to the node, a message and its recipients — assembled in a fixed order.
The line ending requirement
Mechanism
Lines of a submitted message end with a CRLF pair; a lone LF is the most common error of a home-grown submitting program, and it is diagnosed with a session recording.
Mail merge via SMTP extensions
Mechanism
Mail merge over SMTP:
XMRG
instead of
MAIL FROM
,
XDFN
with variables before each recipient, and
XPRT
instead of
DATA
for each part.
Submitting a message by writing a file into a directory
Mechanism
The message is placed as a file in a directory, and the envelope is passed in special headers at its start; the engine takes the file into the spool and delivers it.
How a message gets into the engine
Mechanism
Six described submission methods: extended SMTP, four language bindings and a directory the node watches on disk.
Submission over HTTPS on its own listener, modeled on SparkPost
Mechanism
A separate entry point: its own listener with a certificate, its own keys and a reserved source name through which the usual submission settings apply to such mail.
The load balancer header at the entrance
Mechanism
The node reads the PROXY header at the start of an incoming connection and treats the address from it as the source; this works for both kinds of entry point.
.NET submission API
Mechanism
The .NET binding: the manual only names the folder with its description —
api\dotnet
in the installation directory on Windows — and requires .NET 2.0 or later.
C submission API
Mechanism
The C binding: the same operations as functions with the
PmtaConn
,
PmtaMsg
and
PmtaRcpt
prefixes, with explicit allocation and freeing of objects and a query for the last error.
C++ submission API
Mechanism
The C++ binding: connection, message and recipient classes in three header files; an error throws an exception and makes the object unusable.
Java submission API
Mechanism
The Java binding:
pmta.jar
in the classpath and a provider file for JavaMail; the description is in JavaDoc.
Perl submission API
Mechanism
The Perl binding: the CPAN package
Port25-Submitter
from
/opt/pmta/api
, built and installed the usual way; the description is in perldoc.
<source>
critical
Configuration block
Rules for whoever connects to submit: whether relaying is allowed, which control headers to honor, which limits apply and whether authentication is required.
<smtp-listener>
Configuration block
Settings that apply to connections on one address and port: encryption, rights through a named source, behavior when the ceiling is reached.
<source-group>
Configuration block
Gathers sources into a group so that inbound connection limits apply to them together; members name the group on their side.
Submitting a message over HTTP
API endpoint
Accepts a message as a JSON request over HTTPS instead of an SMTP session — with recipients, substitutions and content.
Latency on reception
Metric
The number of submissions and the time by reception stage.