When a remote server rejects your message, KumoMTA captures:
- SMTP code (4xx, 5xx).
- Enhanced status code (5.1.1, 5.7.1, etc.).
- Diagnostic text from the remote.
It runs the diagnostic through its bounce classifier (ships with patterns for Gmail, Yahoo, MS, ProtonMail, etc.) and assigns a category:
| Category | Action |
|---|---|
InvalidRecipient |
Remove from list immediately |
ContentRejected |
Review content, suppress only if persistent |
PolicyRejected |
IP/domain reputation issue — investigate, don't blame the list |
Reputation |
You're being filtered — warming or blocklist issue |
SpamRelated |
Suspect content/sender |
Quotas |
Mailbox full — soft, retry later |
Authentication |
DKIM/SPF/DMARC misalignment |
Throttled |
Slow down (4xx) — retry per backoff |
Hook to react in code:
kumo.on('smtp_client_message_delivered', function(msg, response) end)
kumo.on('smtp_client_message_bounced', function(msg, response)
local cat = response:bounce_classification()
if cat == 'InvalidRecipient' then
suppress(msg:recipient())
end
end)
Sign in to keep track of what you have read.