Bounce Message or Report
A bounce report, also known as a bounce message or a non-delivery report (NDR), is an automated email message generated by an email server to inform the sender that their email was not delivered to the recipient’s inbox.
Why an email can’t be delivered?
When an email is sent, it is routed through various servers before reaching the intended recipient’s mailbox. If there is a problem with the delivery of the email at any point in this process, such as an incorrect email address, a full mailbox, a blacklisted server, or a blocked email domain, the email may “bounce” back to the sender.
What is the difference between a hard and a soft bounce?
This is the first thing to establish when you look at a bounce, because it decides what you should do next:
- A hard bounce is a permanent failure. The address does not exist, the
domain does not exist, or the server has refused the message outright. The
status code starts with
5. You should stop sending to that address — continuing to mail addresses that hard bounce damages your sending reputation. - A soft bounce is a temporary failure. The mailbox is full, the server is
busy, the message was greylisted, or a rate limit was hit. The status code
starts with
4. A sending server will normally retry for several days before giving up and converting it into a permanent failure.
A message that is rejected because the sending IP address is on an IP blacklist can appear as either, depending on the receiving system’s policy.
What information does such a bounce report have?
The bounce report typically includes the recipient’s email address, a status code explaining why delivery failed, the text the remote server returned, and usually the original message or its headers. This information is what you use to troubleshoot delivery issues.
Two kinds of code appear in bounces:
- The SMTP reply code, a three-digit number such as
550or452. - The enhanced status code, a three-part number such as
5.1.1or4.2.2, defined in RFC 3463. The first digit repeats the permanent/temporary distinction, and the rest identifies the cause more precisely.
Codes worth recognising:
| Code | Meaning |
|---|---|
5.1.1 |
Mailbox does not exist |
5.1.2 |
Domain does not exist |
5.2.2 |
Mailbox full (permanent, quota exceeded) |
4.2.2 |
Mailbox full (temporary) |
5.7.1 |
Delivery refused for policy reasons |
4.7.1 |
Temporarily refused, often greylisting |
A 5.7.x code is the one to pay attention to on a deliverability problem: it
means you were not rejected for a bad address, but because the receiving system
decided not to accept mail from you.
How does such a typical bounce report look like?
The structured form of a bounce is a Delivery Status Notification (DSN), defined
in RFC 3464. It is a multipart message: a human-readable explanation, a
machine-readable message/delivery-status part carrying the codes, and the
original message or its headers.
The exact wording varies depending on the email service provider or the mail server generating the report. Here is an example from a Postfix mail server, with the delivery status part that carries the actual diagnosis:
Subject: Undelivered Mail Returned to Sender
Content-Type: multipart/report; report-type=delivery-status
This is the mail system at host mail.example.com.
I'm sorry to have to inform you that your message could not
be delivered to one or more recipients. It's attached below.
For further assistance, please send mail to postmaster.
If you do so, please include this problem report. You can
delete your own text from the attached returned message.
The mail system
<jane@example.org>: host mx.example.org[192.0.2.25] said: 550 5.1.1
<jane@example.org>: Recipient address rejected: User unknown in local
recipient table (in reply to RCPT TO command)
--- Delivery report follows ---
Content-Type: message/delivery-status
Reporting-MTA: dns; mail.example.com
Arrival-Date: Fri, 10 Mar 2023 11:49:25 +0100
Final-Recipient: rfc822; jane@example.org
Original-Recipient: rfc822; jane@example.org
Action: failed
Status: 5.1.1
Remote-MTA: dns; mx.example.org
Diagnostic-Code: smtp; 550 5.1.1 <jane@example.org>: Recipient address
rejected: User unknown in local recipient table
The Status: and Diagnostic-Code: lines are the ones that matter. The
Diagnostic-Code contains the remote server’s own wording, which is often more
specific than the status code and frequently includes a link explaining a
block.
What if I receive bounces for mail I never sent?
If bounce messages arrive for messages you did not send, your address or domain has most likely been forged as the sender of spam. This flood of unwanted bounce traffic is known as backscatter, and it is a nuisance rather than a sign that your own server is compromised.
Which language is a bounce report written in?
Bounce reports are typically written in English or the language used by the recipient’s mail server. However, the language used may vary depending on the email service provider or the mail server generating the bounce message.
This is another reason to read the status code rather than the prose: the
Status: and Diagnostic-Code: fields of a DSN are machine-readable and
identical regardless of the language the explanatory text is written in.