A bounce is a rejection with a reason attached. The reason is a three-digit code and a line of text, usually buried under a lot of headers - and it is nearly always specific enough to act on immediately.
The first digit
- 4xx - temporary. The sending server will retry for days. Nothing to do unless it persists.
- 5xx - permanent. It will not be retried. Something has to change.
The common ones
- 550 No such user - the address does not exist. A typo, or someone left.
- 550 Message rejected as spam - delivered to the server and refused on content or reputation.
- 550 SPF / DKIM / DMARC failure - you are not authorised to send as that domain. See the article on mail landing in spam.
- 552 Mailbox full - the receiver's problem, and they may not know.
- 421 Too many connections - you are sending too fast. Slow down rather than retrying harder.
- 550 Client host blocked - your address is on a blocklist. The message names which one.
If your IP is listed
The bounce usually links to the list. Find out why first - almost always a compromised account or a form being used to send - because delisting without fixing the cause gets you listed again within a day.
grep -c "status=sent" /var/log/mail.log\ngrep "status=bounced" /var/log/mail.log | tail -20
A sudden burst of outgoing mail you did not send means a compromised mailbox or a contact form being abused. Stop the sending before asking for delisting - the list is a symptom.
Keep bounces. A list of addresses that permanently failed, removed from your own list, is what keeps a sending reputation good. Sending repeatedly to dead addresses is one of the strongest spam signals there is.