critical
A complaint arrives as an ordinary message, and before it becomes a complaint it has to be recognized. A separate processor does this: mail to addresses from the configured list is parsed as a complaint report rather than delivered.
The order of processors matters. The bounce processor goes first, the complaint processor second. A message recognized by the first will not reach the second.
Hence the consequence: a complaint that looks like a bounce report in form will be parsed as a bounce. Their forms are related — both are service reports about a message — and a match is not rare.
What is not recognized does not vanish. Separate settings decide whether to deliver unrecognized mail the usual way or forward it to a given address.
The parsing result goes into accounting as a separate record type — that is what the complaint rate is calculated from.
There are two conditions outside the node: an MX record for fbl.<domain> pointing to the node (it is created by hand), and a feedback loop with the provider registered for this address. Role addresses (abuse@, postmaster@, dmarc@) are accepted by the node with a separate rule, but they are not parsed as complaint reports: the processor catches only fbl@fbl.<domain>.
What is needed for complaints to be counted on the node:
| What | Why |
|---|---|
| a list of complaint addresses | it is how the processor recognizes its mail |
| a complaint processor | the one that parses the report |
| a decision about unrecognized mail | deliver the usual way or forward |
| understanding the order | the bounce processor goes first and will take anything similar |
Unrecognized mail is better forwarded than delivered. Forwarding to a live mailbox shows what the processor did not understand — and it is the only way to learn about a complaint format it misses.
Compare the complaint rate with two sources. The node’s accounting and the provider’s data always diverge; the divergence is the measure of how much parsing misses.
# the order of processors is set by the engine: bounces, then complaints <feedback-loop-processor> forward-unmatched-to fbl-review@example.net deliver-unmatched-email false </feedback-loop-processor>
what people get wrong and how it ends3 mistakes▶
§ 13
§ 13
§ 13
3 relations
The complaint format of one large receiverOne of the report types this processor parses. § 13.7.1
ComplaintThe accounting record a parsed complaint ends up in. § 13.7
grep -n -A5 '^<feedback-loop-processor' /etc/pmta/config grep -c '^f,' /var/log/pmta/acct-*.csv
3 articles
◇What the node tells about itself and through which channelsSeven observation surfaces: the web monitor, the console in four formats, the log, accounting, accounting search, metrics and export to external analytics.◇The watchdog that restarts the engineKeeps an eye on the engine and brings it back up after a crash by itself, sending a crash report to the postmaster address.◇Address lists — named and unnamedA list of addresses, domains, patterns or hashes; a named one is attached by directives such as suppression, an unnamed one lives inside an inbound mail processor.