XF 1.4 Automated Bounce Email Handling

Most forums need to deal with members whose email address becomes invalid. Sometimes the user will go ahead and change it, but other times your forum will fire off emails to this now invalid address. When this happens, if you have a bounce email address setup in XenForo (and possibly with the -f option enabled in the mail configuration), you will receive an email telling you about the failure.

Email delivery failures can happen for a wide variety of reasons. If you continually send to an address that has been disabled, for example, this can count against your domain/IP's email reputation. A lower email reputation can lead to reduced email deliverability as your domain may appear to be a spammer.

Therefore, when you are notified that an email can't be delivered, you may want to prevent further emails from being sent to that user. XenForo 1.3 added a new user state that represents an invalid email, but you had to manually change users into this state. With a decent size forum, this could be tedious and time consuming at best and impossible to manage at worst.

To handle this, XenForo 1.4 implements an automated bounce email processing system. This is a fairly detailed and technical system, but it allows an important maintenance action to be automated.

Automated Bounce Parsing
ss-2014-07-11_17-27-16.webp

The core component of this system is a process that reads emails from a specific account and then parses those emails to determine if they are bounce messages.

As bounce notifications will be sent to the value you enter for the "Bounced Email Address", you would enter the POP3 or IMAP details for that account here. Once you do that, the system will automatically start checking this account for bounce messages. Note that the emails in this account will be removed after reading so this account needs to be dedicated to bounces from your forum only.

Every email that is read from this account will be analyzed to determine if it fits a known type and the appropriate action will be taken (changing the user state to indicate that the email is invalid, if appropriate). This is all displayed in the email bounce log in the control panel:

ss-2014-07-11_17-38-46.webp


The action taken will depend on the content of the email. The sections below discuss why an email could be untrusted and the distinction between soft and hard bounces.

Bounce email notification parsing is notoriously difficult due to a wide range of servers that don't actually give good bounce responses. We have covered a number of common cases but this will certainly need to be expanded over time, so if you use this feature, keep an eye on the bounce log and let us know if you see emails that aren't being handled correctly. The "view original" link will take you to a raw output of the original email (headers and all encoded data). This data can be used to help us determine any additional cases to handle.

Note that you may get non-bounce emails to this address, such as delay notifications, challenge verifications and auto-replies. These will be logged, but they don't represent any errors so no action will be taken.

Bounce email logs will be maintained for 30 days.

VERP and Validation
While you would think that a bounce notification would always tell you who the email was sent to, you'd be wrong. Sometimes, the notification will only show you the address of the final recipient, and maybe they forwarded their email to another address. In rare cases, it might not list any address.

A common way around this is with a technique called Variable Envelope Return Path (VERP). The concept behind VERP is to encode the recipient email into the Return-Path header (which is where the bounce notification is sent).

Another important component is validating that the original email was actually sent by your forum. Without this, someone could manually create a bounce notification, send it to your bounce address, and trigger the bounce behavior for any email. By adding a validation hash into the return path, we can simply ignore any email that doesn't validate. This is what the "untrusted" component is in the email bounce log screenshot.

Let's look at a quick VERP example:
  • Bounce handler address: bounce@yourdomain.com
  • Email recipient: user@example.com
The VERP may look like: bounce+1234abcd+user=example.com@yourdomain.com. The "1234abcd" part is the validation key that is generated using a secret key.

Keep in mind that the Return-Path is never shown to the end user (unless they look at the raw email contents). The Return-Path and the From/Sender values are always unrelated.

ss-2014-07-11_17-58-14.webp


We would recommend enabling VERP support if you enable the automated bounce handling option. However, it does require that your SMTP server ignores anything after the + sign. This is quite common these days; Gmail does it, for example.

If you don't (or can't) enable the VERP option, we will embed this data in the original email via another header. Some bounce notifications include the original message (or the headers from it) and we can parse this data out of that. However, it may not be as reliable as the VERP option.

Soft and Hard Bounces
Bounce notifications report a wide range of issues. Some of these are unlikely to ever be resolved and others may be temporary or specific to a single message. This is where a soft and hard bounce distinction becomes necessary.

When a hard bounce happens, action will be taken immediately (setting the user state to indicate that their email is invalid). These issues are unlikely to ever be resolved, except maybe through dumb luck. Most commonly, this will be an invalid mailbox (the part to the left of the @ in the address).

Soft bounces include:
  • The recipient's mailbox being full
  • DNS/connectivity issues
  • The message being too long (as other messages may go through)
Soft bounces don't trigger the user state change until multiple messages bounce. The exact behavior is defined by a set of criteria:
ss-2014-07-11_18-06-50.webp

The criteria is designed to give the recipient (or their server admin) a chance to resolve the issue. If the limit was based solely on the number of emails, a flurry of messages in a short time span could trigger the soft bounce threshold.

Using the values in the screenshot, the email would only be considered invalid if:
  • We received 3 or more bounce notifications
  • The bounce notifications happened on 3 or more distinct days
  • The amount of time between the first and last bounce is at least 5 days
These values can be tuned to fit your needs and how strict you want to be.




Phew, that was a long one. Let us know if you have any questions or thoughts and keep an eye out for more 1.4 features being revealed soon.

Just a reminder: Please do not post suggestions in this thread (even if you feel they are related). Use the dedicated suggestion forum so they can be tracked; suggestions made in this thread are unlikely to be implemented.
 
@Jeremy

Nice add
1 question
A lot of share host don't send bounced email but a daily report with all the bounced emails in 1 email.

Will xenforo 1.4 will read report and not only bounced returned emails?

Thank you
 
I assume VERP works with newsletters sent from ACP too?
As of right now, it doesn't actually because those use a lower level system. I will look into tweaking that.

Is there a way to fetch the bounce mails not only from an email account but also from a non Xenforo database table (we already have a central bounce system in place and I want to keep it this way as we have the same users using several of ours forums)?
Well, logically that's something that you'd have to implement in some sort of custom way, but if you're already doing all the work to determine what emails are invalid (the ones you want to take action against), I don't see why you can't implement that now. The invalid email state exists in 1.3. All you have to do is put the user in that state. (It makes their account "invalid", so they are generally treated as a guest, will not receive any emails, and will be prompted to update their email address on each page view.)
 
cPanel servers don't support plus sign things, but I guess I can create a bounce subdomain and a catch all email address for it.
You can use a catch-all account, yes. Obviously you can only have one catch-all account so it's not something that I'd recommend per se. Depending on how you send your mail, most of your bounces (but not necessarily all) will come from your own mail sender. If you send via PHP's default, this is likely something like postfix. Postfix uses the delivery status RFC which is quite easy to work with and gives the original message so we can pull the necessary data/verification out of that.

You could always experiment with not using VERP and see what happens with the bounce logs. (If you don't have a large forum, bounce handling can possibly be handled manually. However, if you're sending hundreds or thousands of emails per day, it's a pain to manage, especially when it comes to keeping track of soft bounces.)
 
What if the bounce notification is due to the recipient server having ours blacklisted? Would this be considered a hard or a soft bounce? Perhaps a different status altogether would be appropriate?

I don't think all recipients @aol.com should be changed if aol.com has our server blacklisted, even after multiple bounces. The recipients could get eventually start getting future emails once we request a de-list from the blacklist.
If I recall correctly, AOL has some horrible bounce messages -- that may have changed though (I've seen multiple formats). I believe we lean towards a soft bounce unless we can specifically identify it as a hard bounce type.

If this isn't hypothetical, you can PM me with the raw email data from this situation and I can see how the system would handle it.
 
You can use a catch-all account, yes. Obviously you can only have one catch-all account so it's not something that I'd recommend per se. Depending on how you send your mail, most of your bounces (but not necessarily all) will come from your own mail sender. If you send via PHP's default, this is likely something like postfix. Postfix uses the delivery status RFC which is quite easy to work with and gives the original message so we can pull the necessary data/verification out of that.

You could always experiment with not using VERP and see what happens with the bounce logs. (If you don't have a large forum, bounce handling can possibly be handled manually. However, if you're sending hundreds or thousands of emails per day, it's a pain to manage, especially when it comes to keeping track of soft bounces.)

Hmm, yeah. Both are small, but automation is nice. I'll try it out when 1.4 is released, and see how everything works together.
 
@Jeremy

Nice add
1 question
A lot of share host don't send bounced email but a daily report with all the bounced emails in 1 email.

Will xenforo 1.4 will read report and not only bounced returned emails?

Thank you
I can't say I've ever heard of a system like that and really that's explicitly against the email specification. If a mail sender accepts an email for delivery, it becomes the one that is required to report back if it later unable to be delivered. The response also goes to the address identified on the envelope of the email being sent (the return-path) which will be (or can be) variable per email.

A bounce report digest would be a totally different system and not something that this would cover.
 
A mail queue already exists (depending on what you're wanting to use it for; it's mostly for performance.)
 
A mail queue already exists (depending on what you're wanting to use it for; it's mostly for performance.)
I'm talking about using an external mail system (vps) and queuing the mail when the mail server is down (which happens a lot in our case as people DDoS it thinking it's the web server)
 
Once you have organized bounced messages, you'd need a way to impact the member. My policy is simply to withdraw a member's privileges when a message bounces until I have a valid email address, but the logical solution would be to automatically put the member with hard bounces into a different member group for which you can change these settings. It would also be appropriate to automatically place a notice in the member's Conversation Inbox to alert them. Quite often they just didn't realize that they had to change a now-defunct address.
 
I someone replies to a forum email manually/intentionally, will it be delivered to the bounce address or the forum address? I still can't seem to wean my members from random replies to forum emails :)
 
Top Bottom