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.