Keep the raw response beside the category
Capture the receiving host, basic SMTP code, enhanced status code, text, attempt, provider event ID, recipient scope, and UTC time. Provider labels such as hard and soft bounce are implementation mappings, not protocol terms with identical meaning everywhere.
In SMTP and enhanced status, 4yz/4.x.x represents temporary negative conditions and 5yz/5.x.x permanent ones. Text and subject/detail components still matter. A permanent policy rejection is not proof that the recipient address is nonexistent; suppression scope may need to target a sender configuration rather than the contact.
Define evidence-based actions
Examples to review:
- clear permanent “mailbox does not exist” response: suppress the address for applicable sends;
- temporary mailbox full, greylisting, or receiver unavailable: retry on a bounded schedule;
- domain-wide DNS outage: pause the domain/cohort and investigate rather than suppress every address;
- authentication or reputation rejection: escalate sender operations;
- malformed or conflicting response: retain unknown/manual-review state.
Set a maximum attempt/time window. Do not retry indefinitely, and do not convert all remaining temporary events to “invalid” merely to close a job.
Handle asynchronous failures
Some messages are accepted and later produce a delivery-status notification. Authenticate and correlate that notification to the original envelope/event. Protect against forged bounces and backscatter. Apply the same reason/scope model as synchronous replies.
Synchronize suppression
Provider-native bounce lists and central suppression must agree. Import events idempotently, record the source, and prevent a stale contact upload from reactivating an address. Give support a safe process to correct a demonstrable false suppression without erasing complaint history.
Measure the policy
Track temporary recovery rate by attempt, permanent-failure recurrence, provider mapping changes, domain-wide incidents, and mistaken suppressions. Sample raw responses in each category. Test fixtures for 421, 450, 550 5.1.1, policy 5.7.x, timeout, and contradictory labels.
The policy is sound when it minimizes repeated unwanted/undeliverable traffic while allowing genuine temporary problems to recover. A single “bounce rate” cannot show whether those decisions are correct.