Knowledge base

<bounce-processor>

Parsing asynchronous bounces
Where the real hard bounce rate comes from

Bounces come in two kinds. A synchronous one is stated by the receiver right in the conversation, and it gets into accounting by itself, as a record of type b. An asynchronous one arrives as a message — minutes or hours later — and without this block there is no way to learn about it.

The block catches messages by a nested address list and parses them. What it learns it writes as a record of type rb; what to do with the messages themselves is decided by deliver-matched-email and deliver-unmatched-email.

🔴 Without it bounce statistics are understated. Large mailbox providers often accept a message in the conversation and refuse it later — that is, asynchronously. A hard bounce rate calculated without rb records is lower than the real one, and decisions about list cleaning are made on incomplete data.

The condition for it to work is accepting these messages at all. The address list decides the fate of an already accepted message; acceptance is allowed by a different line, relay-address. Without it, anti-relay will reject the report with a hard bounce before it even arrives.

<email-patterns> can be nested in the block — a set of patterns for receivers whose reports the engine does not understand by itself.

Example configuration
# one line allows receiving, the block handles parsing
relay-address /^bounce@bounce\./
<bounce-processor>    deliver-matched-email no
    deliver-unmatched-email no
    <address-list>
        address /^bounce@bounce\./
    </address-list>
</bounce-processor>
The first line is mandatory: without it the messages will not be accepted at all, and there will be nothing to parse.
yellow — — directive names, blue — blocks. They are highlighted the same way in the text of the card.