The task. A bounce must be recognized as permanent or temporary before anything reacts to it. When the engine’s category is translated into your own after the record is received, there are two classifiers in a row, and it is the translation that breaks.
What it is made of:
The parts have different scopes. An unnamed pattern block is checked before the bundled patterns, and a named one attached to the recipient — before both. Suppression lists are attached to a source or a sending address (suppression-lists).
How they interact. The chain is classification, decision, suppression. Moving classification to the node puts into the record a category already stated in your own words, and the suppression rule reads the field directly. The caveat is durability: the category is set at the moment of recording, and changing the patterns does not repaint the past, so the reply text is worth keeping next to the category.
Three steps and where each lives:
| Step | With what | What remains |
|---|---|---|
| classification | bounce-category-patterns | bounceCat with your own name |
| queue reaction | <smtp-pattern-list> | a switch to backoff mode |
| suppression | /config/address-lists | the address in a list without editing files |
<bounce-category-patterns> rcpt-to /invalid recipient/ bad-mailbox /mailbox +(is +)?full/ quota-issues </bounce-category-patterns>
grep -rn -A6 '<bounce-category-patterns' /etc/pmta/