critical
The manual defines four value types in a separate short section and then simply refers to them from hundreds of directives. Knowing these four means understanding the grammar of any configuration line.
Boolean. Four spellings for two values: yes, no, true, false. The engine accepts all of them equally, so whoever reads the configuration must treat all four as equivalent, and whoever writes it should pick one spelling and stick to it.
Time interval. A string like 1w2d12h or 300s, where w is weeks, d days, h hours, m minutes, s seconds. The parts are concatenated, without spaces or symbols. The manual has no separate unit field anywhere: the unit is always inside the value.
Regular expression. Perl-compatible (PCRE), written between slashes: /^421 .* too many errors/. The dialect is foreign and complete — details on the regex-dialect page.
Domain pattern. Five forms, and they are the ones worth remembering: they appear in every block that matches something against a domain. The difference between two of them is a trap, described below.
The inconsistency in booleans is harmless for the engine but inconvenient for a person reading the finished file: two forms in one file look like a difference in meaning that does not exist.
The Hub does not write regular expressions at all — it assembles pattern rules from a list of domains, not from an expression.
What to write when writing by hand:
| Type | Form | What to watch |
|---|---|---|
| boolean | yes or no | pick one spelling for the whole file |
| interval | 10m, 4d12h, 300s | the unit is required: a bare number is not an interval |
| expression | /…/ between slashes | PCRE dialect, escaping as in Perl |
| pattern | [*.]domain | almost always this form, not *.domain |
An interval without a unit is not an interval. The manual does not describe lines like bounce-after 4: for this type the unit is always inside the value, and a bare number makes no sense here.
Both kinds of patterns are also covered on the domain-matching page — along with the manual’s example where both forms stand side by side and you can see how they differ in a live config.
# four types in four lines <domain [*.]example.com> use-starttls yes # boolean: yes | no | true | false bounce-after 4d12h # interval: w d h m s concatenated max-msg-rate 500/h </domain> <smtp-pattern-list too-many> reply /^421 .* too many errors/ mode=backoff # PCRE expression </smtp-pattern-list>
what people get wrong and how it ends3 mistakes▶
§ 3.2
§ 3.2
§ 3.2
1 relation
The node's main configuration fileThe very file that is written in these four types. § 3.2
relay-addressGlobalThe value can be a regular expression, and that has its own parsing. § 3.2Address lists — named and unnamedPatterns in a list are regular expressions of the same dialect as everywhere else in the configuration. § 3.2address<address-list>A pattern in slashes is a regular expression of the same dialect as everywhere else in the configuration. § 3.2body-pattern-file<email-patterns>The value is a regular expression, and the dialect rules are shared with the rest of the configuration. § 3.2allow-smtputf8<source>An international address is a separate kind of value, not an ordinary string: it has its own parsing. § 3.1How the policy for a receiver is assembledThe pattern forms are described there, including the asterisk-and-dot trap. § 3.2
pmta test config pmta show settings example.com/mta-news-1
3 articles
◇Accept, route, deliverA message’s path inside the node: accept, decide where, deliver — and all the settings live between these three steps.◇Reloading settings versus restarting the serviceThe configuration is read at startup, and after that edits are picked up by the reload command — except for the directives the manual marks as requiring a restart.◇How the node selects a source and combines its settingsA 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.