The recipient permanently did not receive the message — either the receiving server refused for good, or the node itself bounced the message when the deadline expired.
The record type letter is b. It comes first in the line, and that is how the parser tells one type from another.
This is where the bounce category and the receiving server’s reply text live. This record is what the decision to remove an address is based on.
A message bounced by the node on deadline and one rejected by the receiving server end up in the same record type. The category tells them apart: an expired deadline has its own, and it is about us, not about the address.
Which question this record answers:
| Question | Is it this record |
|---|---|
| the message will not be delivered to this recipient | yes |
| how many messages in total | only together with the other types |
| why it happened | look at the reply text, not at the record type |
Record types are enabled and disabled in the accounting block. A disabled type does not disappear from a report — it disappears from the data, and the absence of events becomes indistinguishable from there genuinely being none.
# the first letter of the line is the record type b,2019-02-08 21:53:41+0000,...
2 relations
Bounce categoryThe classification any decision to remove an address rests on. § 12.2.2
grep -c "^b," /var/log/pmta/acct-*.csv cut -d, -f1 /var/log/pmta/acct-*.csv | sort | uniq -c
3 articles
◇The bounce category in accounting — configurable, not vendor-fixedThe bounceCat string in every accounting record comes from a pattern list that can be extended with your own rules and your own category names.◇Parsing bounces that arrive as messagesBounce reports that arrive as messages are parsed by a separate processor — and it runs before the complaint processor.◇Two inbound report processors and what to do with themBounces by message and complaints are parsed by two identically structured blocks; each has its own address list and its own pair of decisions about the message’s fate.