Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bounced mail Handling in PHP - Any up-to-date solutions? [closed]

Tags:

I need to do some bounced mail processing using PHP. Going through the e-mails is no problem, but investing the resources in writing our own library to parse the bounced e-mails is very undesirable.

There are 3 PHP solutions that I've found that are supposed to be for processing bounced mail, but they are all way out of date and no longer maintained, from what I can see. (PHPList, PHPMailer-BMH, Bounce Handler @ PHPClasses.org)

Does anyone know of an up-to-date set of rules for processing bounced e-mails? I don't necessarily need any handling logic, even just an up-to-date ruleset would be satisfactory.

Thanks for any assistance.

like image 589
DrSpock Avatar asked Apr 06 '11 19:04

DrSpock


People also ask

How do you handle a bounced email?

Try sending an email to the "Undeliverable" email address again. If the address keeps bouncing, you should remove it from your lists. If possible, get in touch with the contact to see if they have a new email address.

How do you check PHP mail function is working or not?

to check if it is sending mail as intended; <? php $email = "[email protected]"; $subject = "Email Test"; $message = "this is a mail testing email function on server"; $sendMail = mail($email, $subject, $message); if($sendMail) { echo "Email Sent Successfully"; } else { echo "Mail Failed"; } ?>

What are the two types of bounces in email marketing explain?

Specifically, it's an explanation of delivery failure related to server or spam issues, whether they are permanent or temporary. Typically, it is a metric expressed as a percentage of subscribers who didn't receive your message. There are two types of bounces: hard and soft.


2 Answers

Bounce handling is non-trivial as you need to deal with a lot of different servers and responses. This includes those servers that are misconfigured and bounces because your email/host/IP has been blacklisted / spam-scored. And there are tons of bounces because of "out of office" auto-replies.

A simple solution I know is to put own headers into the message that identify the receiver address and the concrete sending (a token). When it bounces, the bounce can be verified based upon this.

Another solution is to encode additional information into the sender address and parse it accordingly for bounces. For this you need to know about how email works, which generally is useful if you need with bounces.

  • Bounce Email handling with PHP?
  • Tool for parsing SMTP logs that finds bounces
  • How to check if an email address exists without sending an email?
  • Specifying the bounce-back address for email

There is some great answer here on SO (but I haven't found it for this answer) that goes into many details on the topic. If I find it, I'll add it.

The general point is, that I don't know about many PHP based tools to deal with bounces, I know PHPList (PHP components for mailinglist handling) has something in their repository:

  • Settings for handling bounces (last valid snapshot) (latest equivalent: Bounce Management - PHPList Manual)

Edit: The related question with the very informative answer is:

  • How to send 100,000 emails weekly?

Edit: It's not much, just some links:

I am wondering why there is no standard in email bouncing that allows you easily to identify bounces and the bounce reason - or is there? (like a RFC)

There is RFC3834 - Recommendations for Automatic Responses to Electronic Mail which go updated by RFC5436 Sieve Notification Mechanism: mailto.

Bouncing is also discussed in part in RFC5321 Simple Mail Transfer Protocol, which clearly gives a reason that an MTA must report back if a message can not be delivered.

The main problem is that the bounce-address (the sender) can not be verified in SMTP, so sending a bounce message bears the problem that it probably goes to a wrong person (Backscatter Spam).

A relyable mailer therefore not only checks for bounces but does more with SMTP to gain a certain level of quality, see:

  • Bounce Address Tag Validation (BATV)
  • Sender Policy Framework (SPF)

The whole Wikipedia page of the Non delivery report might be interesting for a first view on the picture.

like image 90
hakre Avatar answered Sep 19 '22 18:09

hakre


Here's how I did it once before. It can capture at least over 70% of the bounce mails consistantly.

In the emails being sent out, put in a custom header (like "x-email-check-id") to have a unique identifer for each email being sent (maybe create a GUID and store that in the database for each email)

On the server end, write a cron job to periodically download emails from the bounce address, and look for this header in the reply message. That way, you can match the bounce mail with the email sent out. This way, you can establish that this email is bounced from your sending and is not a spam email.

After that, search the email content for specific keywords to determine the reason for bounce. This list of keywords should be updated often as newer email servers return different text. But here is the list that I used.

$Email__Full[] = 'databytes limit'; $Email__Full[] = 'exceeded dropfile size'; $Email__Full[] = 'exceeded email quota'; $Email__Full[] = 'exceeded storage'; $Email__Full[] = 'exceeding receiving limits'; $Email__Full[] = 'exceeds the maximum size'; $Email__Full[] = 'folder is full'; $Email__Full[] = 'mail system full'; $Email__Full[] = 'mailbox exceeds allowed size'; $Email__Full[] = 'mailbox full'; $Email__Full[] = 'mailbox has exceeded the limit'; $Email__Full[] = 'mailbox is full'; $Email__Full[] = 'mail box full'; $Email__Full[] = 'out of disk space'; $Email__Full[] = 'out of diskspace'; $Email__Full[] = 'over disk quota'; $Email__Full[] = 'over quota'; $Email__Full[] = 'over the allowed quota'; $Email__Full[] = 'problem with the recipient\'s mailbox'; $Email__Full[] = 'quota exceeded'; $Email__Full[] = 'quota violation'; $Email__Full[] = 'space has been used up'; $Email__Full[] = 'space not enough'; $Email__Full[] = 'status: 5.2.1'; $Email__Full[] = 'status: 5.2.2'; $Email__Full[] = 'status: 5.2.3'; $Email__Full[] = 'status: 5.3.3';  $Email__NotExist[] = '/var/mail/nobody'; $Email__NotExist[] = '550 5.1.1'; $Email__NotExist[] = 'account expired'; $Email__NotExist[] = 'account inactive'; $Email__NotExist[] = 'account suspended'; $Email__NotExist[] = 'address is administratively disabled'; $Email__NotExist[] = 'address is not recognized'; $Email__NotExist[] = 'address is rejected'; $Email__NotExist[] = 'address not recognized'; $Email__NotExist[] = 'address rejected'; $Email__NotExist[] = 'bad destination email address'; $Email__NotExist[] = 'cname lookup failed'; $Email__NotExist[] = 'connection refused'; $Email__NotExist[] = 'couldn\'t find any host'; $Email__NotExist[] = 'could not be found'; $Email__NotExist[] = 'deactivated mailbox'; $Email__NotExist[] = 'delivery time expired'; $Email__NotExist[] = 'destination server not responding'; $Email__NotExist[] = 'disabled or discontinued'; $Email__NotExist[] = 'does not exist'; $Email__NotExist[] = 'does not like recipient'; $Email__NotExist[] = 'doesn\'t have a yahoo.com account'; $Email__NotExist[] = 'doesn\'t have a yahoo.com.sg account'; $Email__NotExist[] = 'domain is for sale'; $Email__NotExist[] = 'find a mail exchanger'; $Email__NotExist[] = 'find any host named'; $Email__NotExist[] = 'following address(es) failed'; $Email__NotExist[] = 'host unknown'; $Email__NotExist[] = 'i couldn\'t find any host by that name'; $Email__NotExist[] = 'illegal user'; $Email__NotExist[] = 'in the queue too long'; $Email__NotExist[] = 'inactive recipient'; $Email__NotExist[] = 'inactive user'; $Email__NotExist[] = 'incorrectly addressed'; $Email__NotExist[] = 'invalid recipient'; $Email__NotExist[] = 'invalid user'; $Email__NotExist[] = 'isn\'t in my control/locals file'; $Email__NotExist[] = 'mailbox not available'; $Email__NotExist[] = 'mailbox not found'; $Email__NotExist[] = 'mailbox unavailable'; $Email__NotExist[] = 'mail is looping'; $Email__NotExist[] = 'message is looping'; $Email__NotExist[] = 'name is not recognized'; $Email__NotExist[] = 'name not found'; $Email__NotExist[] = 'name not recognized'; $Email__NotExist[] = 'no local mailbox'; $Email__NotExist[] = 'no longer accepts mail'; $Email__NotExist[] = 'no longer an employee'; $Email__NotExist[] = 'no longer on server'; $Email__NotExist[] = 'no longer valid'; $Email__NotExist[] = 'no mailbox'; $Email__NotExist[] = 'no route found to domain'; $Email__NotExist[] = 'no such user'; $Email__NotExist[] = 'none of the mail servers for the destination domain has so far responded'; $Email__NotExist[] = 'no valid host'; $Email__NotExist[] = 'no valid recipients'; $Email__NotExist[] = 'not a valid mailbox'; $Email__NotExist[] = 'not listed'; $Email__NotExist[] = 'not listed in domino'; $Email__NotExist[] = 'possible mail loop'; $Email__NotExist[] = 'recipient cannot be verified'; $Email__NotExist[] = 'recipient unknown'; $Email__NotExist[] = 'recipients are invalid'; $Email__NotExist[] = 'recipnotfound'; $Email__NotExist[] = 'relaying denied'; $Email__NotExist[] = 'several matches found in domino'; $Email__NotExist[] = 'status: 5.1.1'; $Email__NotExist[] = 'status: 5.1.3'; $Email__NotExist[] = 'status: 5.1.4'; $Email__NotExist[] = 'status: 5.1.6'; $Email__NotExist[] = 'status: 5.1.7'; $Email__NotExist[] = 'this user doesn\'t have a yahoo'; $Email__NotExist[] = 'too many hops'; $Email__NotExist[] = 'unable to deliver'; $Email__NotExist[] = 'unable to relay'; $Email__NotExist[] = 'unknown address'; $Email__NotExist[] = 'unknown recipient'; $Email__NotExist[] = 'unknown user'; $Email__NotExist[] = 'unrouteable address'; $Email__NotExist[] = 'user doesn\'t have'; $Email__NotExist[] = 'user unknown'; $Email__NotExist[] = 'x-notes; 550 5.1.1'; $Email__NotExist[] = 'x-notes; recipient\'s domino directory'; $Email__NotExist[] = '$B%G%#%l%/%H%j$K$O8+$D$+$j$^$;$s!#'; //* Returned from japanese domino . Somehow means directory is not found.  $Email__Banned[] = '_spam_'; $Email__Banned[] = '550 5.7.1'; $Email__Banned[] = '550 access denied'; $Email__Banned[] = '550 no thanks'; $Email__Banned[] = '550 spam'; $Email__Banned[] = '554 5.7.0'; $Email__Banned[] = '554 5.7.1'; $Email__Banned[] = '554 denied'; $Email__Banned[] = '554 message does not conform to standards'; $Email__Banned[] = '554 message refused'; $Email__Banned[] = '571 message Refused'; $Email__Banned[] = 'activated my anti-spam features'; $Email__Banned[] = 'administrative prohibition'; $Email__Banned[] = 'appears to contain uce/spam'; $Email__Banned[] = 'appears to be spam'; $Email__Banned[] = 'appears to be unsolicited'; $Email__Banned[] = 'banned for spamming'; $Email__Banned[] = 'blackholed by uribl.com'; $Email__Banned[] = 'blacklisted by surbl'; $Email__Banned[] = 'blocked by filter'; $Email__Banned[] = 'blocked by kbas system'; $Email__Banned[] = 'blocked by our content filter'; $Email__Banned[] = 'blocked by spamsssassin'; $Email__Banned[] = 'blocked by the recipient'; $Email__Banned[] = 'blocked by user\'s personal blacklist'; $Email__Banned[] = 'blocked due to spam like qualities'; $Email__Banned[] = 'blocked using spam pattern'; $Email__Banned[] = 'blocked using uceprotect'; $Email__Banned[] = 'body part contains disallowed string'; $Email__Banned[] = 'classified as **spam**'; $Email__Banned[] = 'content blacklist'; $Email__Banned[] = 'content filter rejected the message'; $Email__Banned[] = 'consider the message to be spam'; $Email__Banned[] = 'considered spam'; $Email__Banned[] = 'contains spam'; $Email__Banned[] = 'content filter rejection'; $Email__Banned[] = 'content rejected'; $Email__Banned[] = 'denied by policy'; $Email__Banned[] = 'detected your message as spam'; $Email__Banned[] = 'does not accept UCE'; $Email__Banned[] = 'domain is banned'; $Email__Banned[] = 'email abuse detected'; $Email__Banned[] = 'error 553'; $Email__Banned[] = 'help_spam_16.htm'; $Email__Banned[] = 'high on spam scale'; $Email__Banned[] = 'http://www.google.com/mail/help/bulk_mail.html'; $Email__Banned[] = 'http://www.surbl.org/lists.html'; $Email__Banned[] = 'identified as spam'; $Email__Banned[] = 'identified your message as spam'; $Email__Banned[] = 'listed in multi.surbl.org'; $Email__Banned[] = 'looks like spam'; $Email__Banned[] = 'mail rejected by windows live hotmail for policy reasons'; $Email__Banned[] = 'message bounced by administrator'; $Email__Banned[] = 'message content rejected, ube'; $Email__Banned[] = 'message contains a virus or other harmful content'; $Email__Banned[] = 'message has too high spam probability'; $Email__Banned[] = 'message is blacklisted'; $Email__Banned[] = 'message refused'; $Email__Banned[] = 'no spam here'; $Email__Banned[] = 'not accepted here'; $Email__Banned[] = 'not in the whitelist'; $Email__Banned[] = 'not rfc compliant'; $Email__Banned[] = 'permanently rejected message'; $Email__Banned[] = 'policy violation'; $Email__Banned[] = 'refused mail service'; $Email__Banned[] = 'reject spam mail'; $Email__Banned[] = 'reject the mail'; $Email__Banned[] = 'rejected by filter'; $Email__Banned[] = 'rejected as spam'; $Email__Banned[] = 'rejected by 35 antiSpam system'; $Email__Banned[] = 'rejected by antispam system'; $Email__Banned[] = 'rejected by cloudmark anti-spam'; $Email__Banned[] = 'rejected by our Spam Filter'; $Email__Banned[] = 'rejected by spam filtering'; $Email__Banned[] = 'rejected by surbl'; $Email__Banned[] = 'rejected by the anti-spam system'; $Email__Banned[] = 'rejected due to security policies'; $Email__Banned[] = 'rejected for policy reasons'; $Email__Banned[] = 'rejected for spam'; $Email__Banned[] = 'requires that you verify'; $Email__Banned[] = 'scored as spam'; $Email__Banned[] = 'sender address verification'; $Email__Banned[] = 'sender was rejected'; $Email__Banned[] = 'spam detected by spamassassin'; $Email__Banned[] = 'spam filter pattern'; $Email__Banned[] = 'spam-like characteristics'; $Email__Banned[] = 'spam mail detected'; $Email__Banned[] = 'spam mail refused'; $Email__Banned[] = 'spam message was blocked'; $Email__Banned[] = 'spam rejected'; $Email__Banned[] = 'spam score too high'; $Email__Banned[] = 'status: 5.7.1'; $Email__Banned[] = 'support.proofpoint.com'; $Email__Banned[] = 'suspected spam'; $Email__Banned[] = 'suspicious url in message body'; $Email__Banned[] = 'temporarily deferred'; $Email__Banned[] = 'transaction failed'; $Email__Banned[] = 'unacceptable content'; $Email__Banned[] = 'unacceptable mail content'; $Email__Banned[] = 'unsolicited bulk e-mail'; $Email__Banned[] = 'unsolicited bulk email'; $Email__Banned[] = 'unsolicited email is refused'; $Email__Banned[] = 'validate recipient email'; $Email__Banned[] = 'will be deleted from queue';  $Email__OutOffice[] = 'away for a vacation'; $Email__OutOffice[] = 'away from the office'; $Email__OutOffice[] = 'not in office'; $Email__OutOffice[] = 'on leave'; $Email__OutOffice[] = 'on vacation'; $Email__OutOffice[] = 'out of office'; $Email__OutOffice[] = 'out of the office'; 
like image 23
iWantSimpleLife Avatar answered Sep 21 '22 18:09

iWantSimpleLife