Bounce Processor Concepts
- Table of Contents
- Overview
- SimpleMH Requirements
- Raw Injection Requirements
- Events Triggered
- Types of Bounces (Hard/Soft/Other)
- Bounce Codes
- Repeat Bounce Counting System
- Viewing Data
- Synchronous and Asynchronous Bounce Messages
- Service and Logfile
- Bounce Processor Queue
Overview
This page describes GreenArrow’s bounce processor from a conceptual point of view. See the Bounce Processor Configuration page for configuration instructions.
The bounce processor is responsible for receiving and processing bounce messages that are received at Bounce Mailboxes. The bounces are parsed to determine the reason for the bounce, along with the recipient address, ListID, and the SendID of the message. Each processed bounce triggers a bounce_all
event.
The bounce processor tracks the number of bounces to an email address and the amount of time the email address has been bouncing for. It combines this information with its configuration to determine if the email address is no longer valid. If the email address is no longer valid, then the bounce processor issues a bounce_bad_address
event so you can deactivate the email address in your database.
When bounce_all
and bounce_bad_address
events occur, the Event Notification System can notify you via an SQL Query, HTTP Post, or one of its other event delivery methods.
The bounce processor works hard to avoid deactivating addresses that are valid, as well as to make sure that all invalid addresses are properly identified.
Proper bounce processing is essential for deliverability, as a sender can be blocked for sending to a high percentage of invalid addresses.
SimpleMH Requirements
These settings are not required for SimpleMH. SimpleMH will automatically set the ListID and the Return-Path
based on the configuration of the Mail Class.
Raw Injection Requirements
If you are using Raw Injection, you must configure a couple of things in the messages you send.
Set the ListID
You must set the ListID to a correct and consistent value. The repeat bounce counting is done on a per-ListID basis, so the ListID must be consistent.
The ListID is described on the GreenArrow Concepts, and the X-GreenArrow-ListID
header, which is used to set the ListID is described on the Raw Injection Method Headers page.
Set the Return-Path
The Return-Path
is the field in an email message that determines where bounces are sent. You must properly set the Return-Path
on outgoing messages for the bounce processor to work.
The Return-Path
should be set to a valid Bounce Mailbox’s address.
Details of how to set the Return-Path
can be found on the Raw Injection Method Headers page.
Events Triggered
There are two event types triggered by the bounce processor:
-
bounce_all
-- Triggered for every bounce received. (Do not use this to deactivate email addresses in your database.) -
bounce_bad_address
-- Triggered when an address is detected as bad and should be deactivated in your database.
Types of Bounces (Hard/Soft/Other)
GreenArrow breaks bounce messages down into three different types:
Type | Description |
---|---|
Hard |
A hard bounce is where the ISP is explicitly saying that this email address is not valid. Typically this is a user does not exist error message. |
Soft |
A soft bounce is an error condition, which if it continues, the email address should be considered invalid. An example is a DNS Failure (code 21 ) bounce message. This can happen because the domain name no longer exists, or this could happen because the DNS registration expired and will be renewed tomorrow, or there was a temporary DNS lookup error. If the DNS failure messages persist, then we know the address is bad. |
Other |
An other bounce is an error condition where the delivery failed which does not mean that the email address is bad. Typically this is a spam blocking. Instead of removing the email addresses from your list, you would want to solve whatever caused the blocking and restore delivery to these addresses. |
About other
bounces: In the future, we may build a quarantine facility for email addresses that consistently fail with other
bounces. The reason is as follows: If an email address bounces with an other
bounce every time we send to it, then there is no point in continuing to send to it, which may just bother the ISP. To solve this problem, instead of removing the email address from the list, the email address would be placed in a quarantine that would prevent you from sending to that email address. When this happens, you would be notified of the quarantine, and after fixing the root delivery problem, you could easily release the email addresses from quarantine.
Bounce Codes
Bounce messages are categorized into different bounce codes. Each code has a default type (Hard
, Soft
or Other
).
Code | Description | Default type | Example SMTP Response |
---|---|---|---|
0 |
Non-bounce | Other |
|
10 |
Bad email address | Hard |
550 User Unknown |
20 |
Temp failure - General | Soft |
|
21 |
Temp failure - DNS Failure | Soft |
|
22 |
Temp failure - Mailbox full | Soft |
|
23 |
Temp failure - Message size too large | Other |
|
29 |
Temp failure - Unable to connect | Soft |
|
30 |
Bounce with no email address | Other |
|
40 |
General bounce | Other |
Sorry, I wasn't able to establish an SMTP connection. (#4.4.1)/I'm not going to try again; this message has been in the queue too long. |
50 |
Mail block - General | Other |
|
51 |
Mail block - Known Spammer | Other |
|
52 |
Mail block - Spam detected | Other |
|
53 |
Mail block - Attachment detected | Other |
|
54 |
Mail block - Relay denied | Other |
|
59 |
Mail block - Unable to connect | Other |
|
60 |
Auto-reply | Other |
|
70 |
Transient bounce | Other |
|
90 |
Unsubscribe request | Hard |
|
100 |
Challenge response | Other |
|
110 |
Over GreenArrow throttle limit | Other |
|
120 |
Queue dumped | Other |
|
121 |
Delivery paused then message expired | Other |
|
122 |
Suppressed by System due to Subscriber Inactivity | Other |
|
123 |
Blocked due to System policy enforcement | Other |
|
200 |
Spam complaint | NA | NA |
0 - Non-bounce
This occurs when the bounce processor receives an email that it determines is not a bounce notification.
29 - Soft bounce - Unable to connect
This is a soft bounce where we were unable to connect to the remote server. If there are many bounces with this code for a single domain, this usually means that the domain in not working or that the domain is blocking your mail server.
59 - Mail block - Unable to connect
This is a bounce where we were unable to connect to the remote server (much like code 29
), however, this is to a large domain name, so we are reasonably confident that the domain name did not cease to exist, but that they are blocking all connections from your IP address. Some large domains, when blacklisting, will completely block your IP from connecting to their servers.
110 - Over GreenArrow throttle limit
This bounce happens when a message has been in the queue past the queuelifetime limit, is scheduled for a delivery attempt, but that delivery attempt is can not be made because it would go over the configured throttle settings for that ISP or Relay Server (a connmaxout failure).
120 - Queue dumped
This is a bounce where GreenArrow was told to dump the messages in the queue. All the messages dumped from the queue will bounce with this code.
121 - Delivery paused then message expired
This is a bounce where GreenArrow was told to pause delivery of messages in a queue. After the maximum retry time, the messages are bounced, and they are bounced with this code.
122 - Suppressed by System due to Subscriber Inactivity
This is a bounce where GreenArrow suppressed sending to the recipient because they haven’t taken an action, such as clicking a link or loading images which signals engagement.
123 - Blocked due to System policy enforcement
This is a bounce where GreenArrow suppressed sending to the recipient because of an AUP violation or another policy issue.
Repeat Bounce Counting System
With soft bounces, we want to remove the email address if the email address continues to soft bounce over a period of time. GreenArrow Engine’s repeat bounce counting system implements this.
You can configure the how many times an email address / ListID combination must soft bounce before it is marked as bad, and therefore removed from your list. You can also configure similar requirements for hard bounces. (See note below on setting this for hard bounces.)
The system is designed so that it does the right thing with the typical settings regardless of your mailing frequency -- if you are sending daily, weekly, monthly, or only occasionally.
Name | Description | Typical Setting |
---|---|---|
soft_req_count |
Required number of soft bounces that must happen sequentially before an address will be marked as bad. If you want a single soft bounce to cause the address to be marked as bad, then set this to 1 . |
2 |
soft_req_days |
Minimum number of days between first soft bounce and last soft bounce, in order for an address to be marked as bad. | 10 |
soft_allow_missing |
Number of emails that may be sent without receiving a soft bounce, without interrupting a sequence of soft bounces. | 0 |
hard_req_count |
Same as soft_req_count except for hard bounces. |
1 |
hard_req_days |
Same as soft_req_days except for hard bounces. |
0 |
hard_allow_missing |
same as soft_allow_missing except for hard bounces. |
0 |
These requirements must be met for an email address to be marked as bad:
- The required number of soft or hard bounces must be received for the email address and ListID combination. (This is the
hard_req_count
andsoft_req_count
settings.) - All emails to that email address and ListID combination must have bounced, except that a configurable number may be allowed to not have bounced, (which is the
hard_allowed_missing
andsoft_allowed_missing
settings). - The first bounce and the last bounce must be at least a certain number of days apart. (This is the
hard_req_days
andsoft_req_days
settings.)
Rule #1 is required because we want to make sure that the email address has bounced a certain number of times before we mark it as bad.
Rule #2 is required because we want to make sure that the email address is consistently bouncing, not just occasionally bouncing. For example, if the only requirement was that the email address bounce 10
times, and if we sent daily emails but the email address bounced once per week, without this rule the address would get removed after 10
weeks (because it would have reached 10
bounces). With the hard_allow_missing
and soft_allow_missing
parameters you can allow a few messages to be sent without producing bounces. This can be helpful if you require a large number of bounces because email is not perfect and sometimes messages get lost without producing bounces.
Rule #3 is required because we want to make sure that the email address is consistently bouncing over a long enough period of time to be sure it is actually bad. For example, if you send daily mailings, and if a user goes over quota for one week, you don’t want the 7
bounces generated to trigger a removal. By having soft_req_days
set to 14
, you would require that the error condition exists for at least two weeks.
Examples
With these settings:
Parameter | Value |
---|---|
soft_req_count |
3 |
soft_req_days |
7 |
soft_allow_missing |
1 |
Example #1
This bounce history would not cause the email to get removed because we have four bounces (which qualifies) but only four days between the first and last bounce (which does not qualify):
- Email sent Jan 1 – bounced
- Email sent Jan 3 – bounced
- Email sent Jan 4 – bounced
- Email sent Jan 5 – bounced
Example #2
This bounce history would not cause the email to get removed because we have only two bounces (which does not qualify) and eight days between the first and last bounce (which does qualify):
- Email sent Jan 1 – bounced
- Email sent Jan 9 – bounced
Example #3
This bounce history would cause the email to get removed because we have four bounces (which qualifies) and 8 days between the first and last bounce (which qualifies):
- Email sent Jan 1 – bounced
- Email sent Jan 3 – bounced
- Email sent Jan 6 – bounced
- Email sent Jan 9 – bounced
Example #4
This bounce history would cause the email to get removed, because we have four bounces (which qualifies) and 8 days between the first and last bounce (which qualifies), and only one missing bounce (the email sent on Jan 7) (which qualifies):
- Email sent Jan 1 – bounced
- Email sent Jan 3 – bounced
- Email sent Jan 6 – bounced
- Email sent Jan 7 – did not bounce
- Email sent Jan 9 – bounced
Example #5
This bounce history would not cause the email to get removed, because we have four bounces (which qualifies) and 8 days between the first and last bounce (which qualifies), but two missing bounces (the email sent on Jan 5 and Jan 7) (which does not qualify):
- Email sent Jan 1 – bounced
- Email sent Jan 3 – bounced
- Email sent Jan 5 – did not bounce
- Email sent Jan 6 – bounced
- Email sent Jan 7 – did not bounce
- Email sent Jan 9 – bounced
Considerations for Hard Bounces
GreenArrow allows you to setup repeat bounce counting for hard bounces, but we recommend being very careful with this.
The reason you may want to require more than one hard bounce is that very rarely an ISP will send a hard bounce for an email address that actually exists. Often this is a software error at the ISP. It sounds strange, but we have seen this happen.
The caution is that if you are starting to send to a list that has not had correct bounce processing done (perhaps imported from other software that was not processing bounces correctly), it’s imperative for deliverability that you get the hard bouncing addresses removed as quickly as possible, so you want to deactivate addresses after a single hard bounce.
If your list is already clean, and your hard bounce percentage is low, then to protect against this you can set hard_req_count=2
and hard_req_days=2
.
Viewing Data
You can view statistical information about bounces by looking at a Send’s Statistics in GreenArrow Engine’s web interface. For a particular send, click the Bounce stats
tab to view these stats.
Synchronous and Asynchronous Bounce Messages
There are two kinds of bounce messages, depending on when the failure happens:
Synchronous Bounce Messages
This is where a remote SMTP server rejects the message in the SMTP conversation with a 5xx
error code. (Or if the message is continually deferred, once it reaches the maximum retry time, GreenArrow Engine will consider this an SMTP failure.) Internally, GreenArrow creates a bounce message and sends this to the bounce processor. This bounce message is a synchronous bounce message.
“Synchronous” means same time -- these are bounce messages were the failure happens at the same time as the SMTP conversation.
Asynchronous Bounce Messages
This is where a remote SMTP server accepts the message via SMTP, and then later determines that it can not deliver the email, and returns a bounce message back to the Return-Path
address of the message. This bounce message is an asynchronous bounce message.
This message will show accepted
via SMTP, but then later a bounce will be logged.
“Asynchronous” means NOT at the same time -- these are bounce messages were the failure happens NOT at the same time as the SMTP conversation.
Considerations
The GreenArrow bounce processor processes both synchronous and asynchronous bounce messages.
In the reporting, synchronous bounces contribute to (a) the SMTP failures in the GreenArrow stats (the SMTP Sever Stats
tab, the TOTAL
row, and the Failure
column), and (b) the total number of bounces (the Bounce stats
tab, the Total Bounces
number. Asynchronous bounces only contribute to the total number of bounces (b). This is because asynchronous bounces don’t have a failure in the SMTP conversation.
Service and Logfile
Bounces and spam complaints are processed and logged by the same service. To monitor this service’s log file, execute the following command:
tail -F /var/hvmail/log/bounce-processor/current | tai64nlocal
The bounce processor is run from the /service/hvmail-bounce-processor
service.
To temporarily turn off the bounce processor, run:
svc -d /service/hvmail-bounce-processor
To turn it back on run:
svc -u /service/hvmail-bounce-processor
To check whether the service is on, run:
svstat /service/hvmail-bounce-processor
Bounce Processor Queue
As bounces occur, they get delivered to GreenArrow’s bounce processing queue.
Normally GreenArrow’s bounce processor is able to keep up with the rate at which bounces are queued. You can verify that it is by running the hvmail_status status
command, then looking at the “Bounce processor queue” section of the output. For example, the following output shows that there are 0 messages in the bounce processor’s queue:
Bounce processor queue: 0% used ( 0/ 3000) soft limit
0% used ( 0/ 5000) hard limit
The “hard” and “soft” limits that are referenced in the above output are described in the Bounce Processor Configuration page.