/ Published in: PHP
Expand |
Embed | Plain Text
Copy this code and paste it in your HTML
<?php /*~ phpmailer-bmh_rules.php .---------------------------------------------------------------------------. | Software: PHPMailer-BMH (Bounce Mail Handler) | | Version: 5.0.0rc1 | | Contact: [email protected] | | Info: http://phpmailer.codeworxtech.com | | ------------------------------------------------------------------------- | | Author: Andy Prevost [email protected] (admin) | | Copyright (c) 2002-2009, Andy Prevost. All Rights Reserved. | | ------------------------------------------------------------------------- | | License: Distributed under the General Public License (GPL) | | (http://www.gnu.org/licenses/gpl.html) | | This program is distributed in the hope that it will be useful - WITHOUT | | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | | FITNESS FOR A PARTICULAR PURPOSE. | | ------------------------------------------------------------------------- | | This is a update of the original Bounce Mail Handler script | | http://sourceforge.net/projects/bmh/ | | The script has been renamed from Bounce Mail Handler to PHPMailer-BMH | | ------------------------------------------------------------------------- | | We offer a number of paid services: | | - Web Hosting on highly optimized fast and secure servers | | - Technology Consulting | | - Oursourcing (highly qualified programmers and graphic designers) | '---------------------------------------------------------------------------' Last updated: January 21 2009 13:49 EST /** * next rule number (BODY): 0238 <br /> * default category: unrecognized: <br /> * default rule no.: 0000 <br /> */ global $rule_categories; ); /* * var for new line ending */ $bmh_newline = "<br />\n"; /** * Defined bounce parsing rules for non-standard DSN * @param string $body body of the email * @param string $structure message structure * @param boolean $debug_mode show debug info. or not * @return array $result an array include the following fields: 'email', 'bounce_type','remove','rule_no','rule_cat' * if we could NOT detect the type of bounce, return rule_no = '0000' */ function bmhBodyRules($body,$structure,$debug_mode=false) { // initialize the result array 'email' => '' ,'bounce_type' => false ,'remove' => 0 ,'rule_cat' => 'unrecognized' ,'rule_no' => '0000' ); // ======== rule ========= if (false) { } /* * rule: mailbox unknown; * sample: * no such address here */ $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0237'; $result['email'] = $match[1]; } /* * <[email protected]>: * 111.111.111.111 does not like recipient. * Remote host said: 550 User unknown */ $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0236'; $result['email'] = $match[1]; } /* * rule: mailbox unknown; * sample: * <[email protected]>: * Sorry, no mailbox here by that name. vpopmail (#5.1.1) */ $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0157'; $result['email'] = $match[1]; } /* * rule: mailbox unknown; * sample: * [email protected]<br> * local: Sorry, can't find user's mailbox. (#5.1.1)<br> */ $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0164'; $result['email'] = $match[1]; } /* * rule: mailbox unknown; * sample: * ########################################################## * # This is an automated response from a mail delivery # * # program. Your message could not be delivered to # * # the following address: # * # # * # "|/usr/local/bin/mailfilt -u #dkms" # * # (reason: Can't create output) # * # (expanded from: <[email protected]>) # * # # */ $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0169'; $result['email'] = $match[1]; } /* * rule: mailbox unknown; * sample: * ????????????????: * [email protected] : ????, ?????. */ $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0174'; $result['email'] = $match[1]; } /* * rule: mailbox unknown; * sample: * Unrouteable address */ $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0179'; $result['email'] = $match[1]; } /* * rule: mailbox unknow; * sample: * Delivery to the following recipients failed. */ $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0013'; $result['email'] = $match[1]; } /* * rule: mailbox unknow; * sample: * A message that you sent could not be delivered to one or more of its^M * recipients. This is a permanent error. The following address(es) failed:^M * ^M * unknown local-part "xxxxx" in domain "yourdomain.com"^M */ $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0232'; $result['email'] = $match[1]; } /* * rule: mailbox unknow; * sample: * <[email protected]>:^M * 111.111.111.11 does not like recipient.^M * Remote host said: 550 Invalid recipient: <[email protected]>^M */ elseif (preg_match ("/Invalid.*(?:alias|account|recipient|address|email|mailbox|user).*<(\S+@\S+\w)>/i",$body,$match)) { $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0233'; $result['email'] = $match[1]; } /* * rule: mailbox unknow; * sample: * Sent >>> RCPT TO: <[email protected]>^M * Received <<< 550 [email protected]... No such user^M * ^M * Could not deliver mail to this user.^M * ***************** End of message ***************^M */ elseif (preg_match ("/\s(\S+@\S+\w).*No such.*(?:alias|account|recipient|address|email|mailbox|user)>/i",$body,$match)) { $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0234'; $result['email'] = $match[1]; } /* * rule: mailbox unknow; * sample: * <[email protected]>:^M * This address no longer accepts mail. */ elseif (preg_match ("/<(\S+@\S+\w)>.*\n?.*(?:alias|account|recipient|address|email|mailbox|user).*no.*accept.*mail>/i",$body,$match)) { $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0235'; $result['email'] = $match[1]; } /* * rule: full * sample 1: * <[email protected]>: * This account is over quota and unable to receive mail. * sample 2: * <[email protected]>: * Warning: undefined mail delivery mode: normal (ignored). * The users mailfolder is over the allowed quota (size). (#5.2.2) */ $result['rule_cat'] = 'full'; $result['rule_no'] = '0182'; $result['email'] = $match[1]; } /* * rule: mailbox full; * sample: * ----- Transcript of session follows ----- * mail.local: /var/mail/2b/10/kellen.lee: Disc quota exceeded * 554 <[email protected]>... Service unavailable */ $result['rule_cat'] = 'full'; $result['rule_no'] = '0126'; $result['email'] = $match[1]; } /* * rule: mailbox full; * sample: * Hi. This is the qmail-send program at 263.domain.com. * <[email protected]>: * - User disk quota exceeded. (#4.3.0) */ $result['rule_cat'] = 'full'; $result['rule_no'] = '0158'; $result['email'] = $match[1]; } /* * rule: mailbox full; * sample: * mailbox is full (MTA-imposed quota exceeded while writing to file /mbx201/mbx011/A100/09/35/A1000935772/mail/.inbox): */ $result['rule_cat'] = 'full'; $result['rule_no'] = '0166'; $result['email'] = $match[1]; } /* * rule: mailbox full; * sample: * The message to [email protected] is bounced because : Quota exceed the hard limit */ $result['rule_cat'] = 'full'; $result['rule_no'] = '0168'; $result['email'] = $match[1]; } /* * rule: inactive * sample: * [email protected]<br> * 553 user is inactive (eyou mta) */ $result['rule_cat'] = 'inactive'; $result['rule_no'] = '0171'; $result['email'] = $match[1]; } /* * rule: inactive * sample: * [email protected] [Inactive account] */ $result['rule_cat'] = 'inactive'; $result['rule_no'] = '0181'; $result['email'] = $match[1]; } /* * rule: internal_error * sample: * <[email protected]>: * Unable to switch to /var/vpopmail/domains/domain.com: input/output error. (#4.3.0) */ $result['rule_cat'] = 'internal_error'; $result['rule_no'] = '0172'; $result['bounce_type'] = 'hard'; $result['remove'] = 1; $result['email'] = $match[1]; } /* * rule: internal_error * sample: * <[email protected]>: * can not open new email file errno=13 file=/home/vpopmail/domains/fromc.com/0/domain/Maildir/tmp/1155254417.28358.mx05,S=212350 */ $result['rule_cat'] = 'internal_error'; $result['rule_no'] = '0173'; $result['bounce_type'] = 'hard'; $result['remove'] = 1; $result['email'] = $match[1]; } /* * rule: defer * sample: * <[email protected]>: * 111.111.111.111 failed after I sent the message. * Remote host said: 451 mta283.mail.scd.yahoo.com Resources temporarily unavailable. Please try again later [#4.16.5]. */ elseif (preg_match ("/<(\S+@\S+\w)>.*\n?.*\n?.*Resources temporarily unavailable/i",$body,$match)) { $result['rule_cat'] = 'defer'; $result['rule_no'] = '0163'; $result['email'] = $match[1]; } /* * rule: autoreply * sample: * AutoReply message from [email protected] */ $result['rule_cat'] = 'autoreply'; $result['rule_no'] = '0167'; $result['email'] = $match[1]; } /* * rule: western chars only * sample: * <[email protected]>: * The user does not accept email in non-Western (non-Latin) character sets. */ ]*non-Western/i",$body,$match)) { $result['rule_cat'] = 'latin_only'; $result['rule_no'] = '0043'; $result['email'] = $match[1]; } global $rule_categories, $bmh_newline; if ($result['rule_no'] == '0000') { if ($debug_mode) { echo 'Body:' . $bmh_newline . $body . $bmh_newline; echo $bmh_newline; } } else { if ($result['bounce_type'] === false) { $result['bounce_type'] = $rule_categories[$result['rule_cat']]['bounce_type']; $result['remove'] = $rule_categories[$result['rule_cat']]['remove']; } } return $result; } /** * Defined bounce parsing rules for standard DSN (Delivery Status Notification) * * @param string $dsn_msg human-readable explanation * @param string $dsn_report delivery-status report * @param boolean $debug_mode show debug info. or not * @return array $result an array include the following fields: 'email', 'bounce_type','remove','rule_no','rule_cat' * if we could NOT detect the type of bounce, return rule_no = '0000' */ function bmhDSNRules($dsn_msg,$dsn_report,$debug_mode=false) { // initialize the result array 'email' => '' ,'bounce_type' => false ,'remove' => 0 ,'rule_cat' => 'unrecognized' ,'rule_no' => '0000' ); $action = false; $status_code = false; $diag_code = false; // ======= parse $dsn_report ====== // get the recipient email if (isset($email_arr[0]->host) && $email_arr[0]->host != '.SYNTAX-ERROR.' && $email_arr[0]->host != 'default.domain.name' ) { $result['email'] = $email_arr[0]->mailbox.'@'.$email_arr[0]->host; } if (isset($email_arr[0]->host) && $email_arr[0]->host != '.SYNTAX-ERROR.' && $email_arr[0]->host != 'default.domain.name' ) { $result['email'] = $email_arr[0]->mailbox.'@'.$email_arr[0]->host; } } } $status_code = $match[1]; } // Could be multi-line , if the new line is beginning with SPACE or HTAB $diag_code = $match[1]; } // ======= rules ====== /* email address is empty * rule: full * sample: DSN Message only * User quota exceeded: SMTP <[email protected]> */ $result['rule_cat'] = 'full'; $result['rule_no'] = '0161'; $result['email'] = $match[1]; } } else { /* action could be one of them as RFC:1894 * "failed" / "delayed" / "delivered" / "relayed" / "expanded" */ switch ($action) { case 'failed': /* rule: full * sample: * Diagnostic-Code: X-Postfix; me.domain.com platform: said: 552 5.2.2 Over * quota (in reply to RCPT TO command) */ $result['rule_cat'] = 'full'; $result['rule_no'] = '0105'; } /* rule: full * sample: * Diagnostic-Code: SMTP; 552 Requested mailbox exceeds quota. */ $result['rule_cat'] = 'full'; $result['rule_no'] = '0129'; } /* rule: full * sample 1: * Diagnostic-Code: smtp;552 5.2.2 This message is larger than the current system limit or the recipient's mailbox is full. Create a shorter message body or remove attachments and try sending it again. * sample 2: * Diagnostic-Code: X-Postfix; host mta5.us4.domain.com.int[111.111.111.111] said: * 552 recipient storage full, try again later (in reply to RCPT TO command) * sample 3: * Diagnostic-Code: X-HERMES; host 127.0.0.1[127.0.0.1] said: 551 bounce as<the * destination mailbox <[email protected]> is full> queue as * [email protected] (in reply to end of * DATA command) */ elseif (preg_match ("/(?:alias|account|recipient|address|email|mailbox|user).*full/is",$diag_code)) { $result['rule_cat'] = 'full'; $result['rule_no'] = '0145'; } /* rule: full * sample: * Diagnostic-Code: SMTP; 452 Insufficient system storage */ $result['rule_cat'] = 'full'; $result['rule_no'] = '0134'; } /* rule: full * sample 1: * Diagnostic-Code: X-Postfix; cannot append message to destination file^M * /var/mail/dale.me89g: error writing message: File too large^M * sample 2: * Diagnostic-Code: X-Postfix; cannot access mailbox /var/spool/mail/b8843022 for^M * user xxxxx. error writing message: File too large */ $result['rule_cat'] = 'full'; $result['rule_no'] = '0192'; } /* rule: oversize * sample: * Diagnostic-Code: smtp;552 5.2.2 This message is larger than the current system limit or the recipient's mailbox is full. Create a shorter message body or remove attachments and try sending it again. */ $result['rule_cat'] = 'oversize'; $result['rule_no'] = '0146'; } /* rule: unknown * sample: * Diagnostic-Code: X-Notes; User xxxxx ([email protected]) not listed in public Name & Address Book */ elseif (preg_match ("/(?:alias|account|recipient|address|email|mailbox|user)(.*)not(.*)list/is",$diag_code)) { $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0103'; } /* rule: unknown * sample: * Diagnostic-Code: smtp; 450 user path no exist */ $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0106'; } /* rule: unknown * sample 1: * Diagnostic-Code: SMTP; 550 Relaying denied. * sample 2: * Diagnostic-Code: SMTP; 554 <[email protected]>: Relay access denied * sample 3: * Diagnostic-Code: SMTP; 550 relaying to <[email protected]> prohibited by administrator */ $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0108'; } /* rule: unknown * sample: * Diagnostic-Code: SMTP; 554 qq Sorry, no valid recipients (#5.1.3) */ elseif (preg_match ("/no.*valid.*(?:alias|account|recipient|address|email|mailbox|user)/is",$diag_code)) { $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0185'; } /* rule: unknown * sample 1: * Diagnostic-Code: SMTP; 550 «Dªk¦a§} - invalid address (#5.5.0) * sample 2: * Diagnostic-Code: SMTP; 550 Invalid recipient: <[email protected]> * sample 3: * Diagnostic-Code: SMTP; 550 <[email protected]>: Invalid User */ elseif (preg_match ("/Invalid.*(?:alias|account|recipient|address|email|mailbox|user)/is",$diag_code)) { $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0111'; } /* rule: unknown * sample: * Diagnostic-Code: SMTP; 554 delivery error: dd Sorry your message to [email protected] cannot be delivered. This account has been disabled or discontinued [#102]. - mta173.mail.tpe.domain.com */ elseif (preg_match ("/(?:alias|account|recipient|address|email|mailbox|user).*(?:disabled|discontinued)/is",$diag_code)) { $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0114'; } /* rule: unknown * sample: * Diagnostic-Code: SMTP; 554 delivery error: dd This user doesn't have a domain.com account ([email protected]) [0] - mta134.mail.tpe.domain.com */ $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0127'; } /* rule: unknown * sample: * Diagnostic-Code: SMTP; 550 5.1.1 unknown or illegal alias: [email protected] */ elseif (preg_match ("/(?:unknown|illegal).*(?:alias|account|recipient|address|email|mailbox|user)/is",$diag_code)) { $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0128'; } /* rule: unknown * sample 1: * Diagnostic-Code: SMTP; 450 mailbox unavailable. * sample 2: * Diagnostic-Code: SMTP; 550 5.7.1 Requested action not taken: mailbox not available */ elseif (preg_match ("/(?:alias|account|recipient|address|email|mailbox|user).*(?:un|not\s+)available/is",$diag_code)) { $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0122'; } /* rule: unknown * sample: * Diagnostic-Code: SMTP; 553 sorry, no mailbox here by that name (#5.7.1) */ $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0123'; } /* rule: unknown * sample 1: * Diagnostic-Code: SMTP; 550 User ([email protected]) unknown. * sample 2: * Diagnostic-Code: SMTP; 553 5.3.0 <[email protected]>... Addressee unknown, relay=[111.111.111.000] */ elseif (preg_match ("/(?:alias|account|recipient|address|email|mailbox|user).*unknown/is",$diag_code)) { $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0125'; } /* rule: unknown * sample 1: * Diagnostic-Code: SMTP; 550 user disabled * sample 2: * Diagnostic-Code: SMTP; 452 4.2.1 mailbox temporarily disabled: [email protected] */ elseif (preg_match ("/(?:alias|account|recipient|address|email|mailbox|user).*disabled/is",$diag_code)) { $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0133'; } /* rule: unknown * sample: * Diagnostic-Code: SMTP; 550 <[email protected]>: Recipient address rejected: No such user ([email protected]) */ elseif (preg_match ("/No such (?:alias|account|recipient|address|email|mailbox|user)/is",$diag_code)) { $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0143'; } /* rule: unknown * sample 1: * Diagnostic-Code: SMTP; 550 MAILBOX NOT FOUND * sample 2: * Diagnostic-Code: SMTP; 550 Mailbox ( [email protected] ) not found or inactivated */ elseif (preg_match ("/(?:alias|account|recipient|address|email|mailbox|user).*NOT FOUND/is",$diag_code)) { $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0136'; } /* rule: unknown * sample: * Diagnostic-Code: X-Postfix; host m2w-in1.domain.com[111.111.111.000] said: 551 * <[email protected]> is a deactivated mailbox (in reply to RCPT TO * command) */ elseif (preg_match ("/deactivated (?:alias|account|recipient|address|email|mailbox|user)/is",$diag_code)) { $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0138'; } /* rule: unknown * sample: * Diagnostic-Code: SMTP; 550 <[email protected]> recipient rejected * ... * <<< 550 <[email protected]> recipient rejected * 550 5.1.1 [email protected]... User unknown */ elseif (preg_match ("/(?:alias|account|recipient|address|email|mailbox|user).*reject/is",$diag_code)) { $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0148'; } /* rule: unknown * sample: * Diagnostic-Code: smtp; 5.x.0 - Message bounced by administrator (delivery attempts: 0) */ $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0151'; } /* rule: unknown * sample: * Diagnostic-Code: SMTP; 550 <maxqin> is now disabled with MTA service. */ $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0152'; } /* rule: unknown * sample: * Diagnostic-Code: SMTP; 551 not our customer */ $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0154'; } /* rule: unknown * sample: * Diagnostic-Code: smtp; 5.1.0 - Unknown address error 540-'Error: Wrong recipients' (delivery attempts: 0) */ elseif (preg_match ("/Wrong (?:alias|account|recipient|address|email|mailbox|user)/is",$diag_code)) { $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0159'; } /* rule: unknown * sample: * Diagnostic-Code: smtp; 5.1.0 - Unknown address error 540-'Error: Wrong recipients' (delivery attempts: 0) * sample 2: * Diagnostic-Code: SMTP; 501 #5.1.1 bad address [email protected] */ elseif (preg_match ("/(?:unknown|bad).*(?:alias|account|recipient|address|email|mailbox|user)/is",$diag_code)) { $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0160'; } /* rule: unknown * sample: * Diagnostic-Code: SMTP; 550 Command RCPT User <[email protected]> not OK */ elseif (preg_match ("/(?:alias|account|recipient|address|email|mailbox|user).*not OK/is",$diag_code)) { $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0186'; } /* rule: unknown * sample: * Diagnostic-Code: SMTP; 550 5.7.1 Access-Denied-XM.SSR-001 */ $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0189'; } /* rule: unknown * sample: * Diagnostic-Code: SMTP; 550 5.1.1 <[email protected]>... email address lookup in domain map failed^M */ elseif (preg_match ("/(?:alias|account|recipient|address|email|mailbox|user).*lookup.*fail/is",$diag_code)) { $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0195'; } /* rule: unknown * sample: * Diagnostic-Code: SMTP; 550 User not a member of domain: <[email protected]>^M */ elseif (preg_match ("/(?:recipient|address|email|mailbox|user).*not.*member of domain/is",$diag_code)) { $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0198'; } /* rule: unknown * sample: * Diagnostic-Code: SMTP; 550-"The recipient cannot be verified. Please check all recipients of this^M */ elseif (preg_match ("/(?:alias|account|recipient|address|email|mailbox|user).*cannot be verified/is",$diag_code)) { $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0202'; } /* rule: unknown * sample: * Diagnostic-Code: SMTP; 550 Unable to relay for [email protected] */ $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0203'; } /* rule: unknown * sample 1: * Diagnostic-Code: SMTP; 550 [email protected]:user not exist * sample 2: * Diagnostic-Code: SMTP; 550 sorry, that recipient doesn't exist (#5.7.1) */ elseif (preg_match ("/(?:alias|account|recipient|address|email|mailbox|user).*(?:n't|not) exist/is",$diag_code)) { $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0205'; } /* rule: unknown * sample: * Diagnostic-Code: SMTP; 550-I'm sorry but [email protected] does not have an account here. I will not */ $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0207'; } /* rule: unknown * sample: * Diagnostic-Code: SMTP; 550 This account is not [email protected] */ elseif (preg_match ("/(?:alias|account|recipient|address|email|mailbox|user).*is not allowed/is",$diag_code)) { $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0220'; } /* rule: inactive * sample: * Diagnostic-Code: SMTP; 550 <[email protected]>: inactive user */ elseif (preg_match ("/inactive.*(?:alias|account|recipient|address|email|mailbox|user)/is",$diag_code)) { $result['rule_cat'] = 'inactive'; $result['rule_no'] = '0135'; } /* rule: inactive * sample: * Diagnostic-Code: SMTP; 550 [email protected] Account Inactive */ elseif (preg_match ("/(?:alias|account|recipient|address|email|mailbox|user).*Inactive/is",$diag_code)) { $result['rule_cat'] = 'inactive'; $result['rule_no'] = '0155'; } /* rule: inactive * sample: * Diagnostic-Code: SMTP; 550 <[email protected]>: Recipient address rejected: Account closed due to inactivity. No forwarding information is available. */ elseif (preg_match ("/(?:alias|account|recipient|address|email|mailbox|user) closed due to inactivity/is",$diag_code)) { $result['rule_cat'] = 'inactive'; $result['rule_no'] = '0170'; } /* rule: inactive * sample: * Diagnostic-Code: SMTP; 550 <[email protected]>... User account not activated */ elseif (preg_match ("/(?:alias|account|recipient|address|email|mailbox|user) not activated/is",$diag_code)) { $result['rule_cat'] = 'inactive'; $result['rule_no'] = '0177'; } /* rule: inactive * sample 1: * Diagnostic-Code: SMTP; 550 User suspended * sample 2: * Diagnostic-Code: SMTP; 550 account expired */ elseif (preg_match ("/(?:alias|account|recipient|address|email|mailbox|user).*(?:suspend|expire)/is",$diag_code)) { $result['rule_cat'] = 'inactive'; $result['rule_no'] = '0183'; } /* rule: inactive * sample: * Diagnostic-Code: SMTP; 553 5.3.0 <[email protected]>... Recipient address no longer exists */ elseif (preg_match ("/(?:alias|account|recipient|address|email|mailbox|user).*no longer exist/is",$diag_code)) { $result['rule_cat'] = 'inactive'; $result['rule_no'] = '0184'; } /* rule: inactive * sample: * Diagnostic-Code: SMTP; 553 VS10-RT Possible forgery or deactivated due to abuse (#5.1.1) 111.111.111.211^M */ $result['rule_cat'] = 'inactive'; $result['rule_no'] = '0196'; } /* rule: inactive * sample: * Diagnostic-Code: SMTP; 553 mailbox [email protected] is restricted */ elseif (preg_match ("/(?:alias|account|recipient|address|email|mailbox|user).*restrict/is",$diag_code)) { $result['rule_cat'] = 'inactive'; $result['rule_no'] = '0209'; } /* rule: inactive * sample: * Diagnostic-Code: SMTP; 550 <[email protected]>: User status is locked. */ elseif (preg_match ("/(?:alias|account|recipient|address|email|mailbox|user).*locked/is",$diag_code)) { $result['rule_cat'] = 'inactive'; $result['rule_no'] = '0228'; } /* rule: user_reject * sample: * Diagnostic-Code: SMTP; 553 User refused to receive this mail. */ elseif (preg_match ("/(?:alias|account|recipient|address|email|mailbox|user) refused/is",$diag_code)) { $result['rule_cat'] = 'user_reject'; $result['rule_no'] = '0156'; } /* rule: user_reject * sample: * Diagnostic-Code: SMTP; 501 [email protected] Sender email is not in my domain */ $result['rule_cat'] = 'user_reject'; $result['rule_no'] = '0206'; } /* rule: command_reject * sample: * Diagnostic-Code: SMTP; 554 Message refused */ $result['rule_cat'] = 'command_reject'; $result['rule_no'] = '0175'; } /* rule: command_reject * sample: * Diagnostic-Code: SMTP; 550 5.0.0 <[email protected]>... No permit */ $result['rule_cat'] = 'command_reject'; $result['rule_no'] = '0190'; } /* rule: command_reject * sample: * Diagnostic-Code: SMTP; 553 sorry, that domain isn't in my list of allowed rcpthosts (#5.5.3 - chkuser) */ $result['rule_cat'] = 'command_reject'; $result['rule_no'] = '0191'; } /* rule: command_reject * sample: * Diagnostic-Code: SMTP; 553 AUTH FAILED - [email protected]^M */ $result['rule_cat'] = 'command_reject'; $result['rule_no'] = '0197'; } /* rule: command_reject * sample 1: * Diagnostic-Code: SMTP; 550 relay not permitted^M * sample 2: * Diagnostic-Code: SMTP; 530 5.7.1 Relaying not allowed: [email protected] */ $result['rule_cat'] = 'command_reject'; $result['rule_no'] = '0201'; } /* rule: command_reject * sample: * * Diagnostic-Code: SMTP; 550 not local host domain.com, not a gateway */ $result['rule_cat'] = 'command_reject'; $result['rule_no'] = '0204'; } /* rule: command_reject * sample: * Diagnostic-Code: SMTP; 500 Unauthorized relay msg rejected */ $result['rule_cat'] = 'command_reject'; $result['rule_no'] = '0215'; } /* rule: command_reject * sample: * Diagnostic-Code: SMTP; 554 Transaction failed */ $result['rule_cat'] = 'command_reject'; $result['rule_no'] = '0221'; } /* rule: command_reject * sample: * Diagnostic-Code: smtp;554 5.5.2 Invalid data in message */ $result['rule_cat'] = 'command_reject'; $result['rule_no'] = '0223'; } /* rule: command_reject * sample: * Diagnostic-Code: SMTP; 550 Local user only or Authentication mechanism */ $result['rule_cat'] = 'command_reject'; $result['rule_no'] = '0224'; } /* rule: command_reject * sample: * Diagnostic-Code: SMTP; 550-ds176.domain.com [111.111.111.211] is currently not permitted to * relay through this server. Perhaps you have not logged into the pop/imap * server in the last 30 minutes or do not have SMTP Authentication turned on * in your email client. */ $result['rule_cat'] = 'command_reject'; $result['rule_no'] = '0225'; } /* rule: content_reject * sample: * Diagnostic-Code: SMTP; 550 Content reject. FAAAANsG60M9BmDT.1 */ $result['rule_cat'] = 'content_reject'; $result['rule_no'] = '0165'; } /* rule: content_reject * sample: * Diagnostic-Code: SMTP; 552 MessageWall: MIME/REJECT: Invalid structure */ $result['rule_cat'] = 'content_reject'; $result['rule_no'] = '0212'; } /* rule: content_reject * sample: * Diagnostic-Code: smtp; 554 5.6.0 Message with invalid header rejected, id=13462-01 - MIME error: error: UnexpectedBound: part didn't end with expected boundary [in multipart message]; EOSToken: EOF; EOSType: EOF */ $result['rule_cat'] = 'content_reject'; $result['rule_no'] = '0217'; } /* rule: content_reject * sample: * Diagnostic-Code: SMTP; 553 Mail data refused by AISP, rule [169648]. */ $result['rule_cat'] = 'content_reject'; $result['rule_no'] = '0218'; } /* rule: dns_unknown * sample: * Diagnostic-Code: SMTP; 550 Host unknown */ $result['rule_cat'] = 'dns_unknown'; $result['rule_no'] = '0130'; } /* rule: dns_unknown * sample: * Diagnostic-Code: SMTP; 553 Specified domain is not allowed. */ $result['rule_cat'] = 'dns_unknown'; $result['rule_no'] = '0180'; } /* rule: dns_unknown * sample: * Diagnostic-Code: X-Postfix; delivery temporarily suspended: connect to * 111.111.11.112[111.111.11.112]: No route to host */ $result['rule_cat'] = 'dns_unknown'; $result['rule_no'] = '0188'; } /* rule: dns_unknown * sample: * Diagnostic-Code: SMTP; 550 unrouteable address */ $result['rule_cat'] = 'dns_unknown'; $result['rule_no'] = '0208'; } /* rule: defer * sample: * Diagnostic-Code: SMTP; 451 System(u) busy, try again later. */ $result['rule_cat'] = 'defer'; $result['rule_no'] = '0112'; } /* rule: defer * sample: * Diagnostic-Code: SMTP; 451 mta172.mail.tpe.domain.com Resources temporarily unavailable. Please try again later. [#4.16.4:70]. */ $result['rule_cat'] = 'defer'; $result['rule_no'] = '0116'; } /* rule: antispam, deny ip * sample: * Diagnostic-Code: SMTP; 554 sender is rejected: 0,mx20,wKjR5bDrnoM2yNtEZVAkBg==.32467S2 */ $result['rule_cat'] = 'antispam'; $result['rule_no'] = '0101'; } /* rule: antispam, deny ip * sample: * Diagnostic-Code: SMTP; 554 <unknown[111.111.111.000]>: Client host rejected: Access denied */ $result['rule_cat'] = 'antispam'; $result['rule_no'] = '0102'; } /* rule: antispam, mismatch ip * sample: * Diagnostic-Code: SMTP; 554 Connection refused(mx). MAIL FROM [[email protected]] mismatches client IP [111.111.111.000]. */ $result['rule_cat'] = 'antispam'; $result['rule_no'] = '0104'; } /* rule: antispam, deny ip * sample: * Diagnostic-Code: SMTP; 554 Please visit http:// antispam.domain.com/denyip.php?IP=111.111.111.000 (#5.7.1) */ $result['rule_cat'] = 'antispam'; $result['rule_no'] = '0144'; } /* rule: antispam, deny ip * sample: * Diagnostic-Code: SMTP; 554 Service unavailable; Client host [111.111.111.211] blocked using dynablock.domain.com; Your message could not be delivered due to complaints we received regarding the IP address you're using or your ISP. See http:// blackholes.domain.com/ Error: WS-02^M */ $result['rule_cat'] = 'antispam'; $result['rule_no'] = '0201'; } /* rule: antispam, reject * sample: * Diagnostic-Code: SMTP; 550 Requested action not taken: mail IsCNAPF76kMDARUY.56621S2 is rejected,mx3,BM */ $result['rule_cat'] = 'antispam'; $result['rule_no'] = '0147'; } /* rule: antispam * sample: * Diagnostic-Code: SMTP; 552 sorry, the spam message is detected (#5.6.0) */ $result['rule_cat'] = 'antispam'; $result['rule_no'] = '0162'; } /* rule: antispam * sample: * Diagnostic-Code: SMTP; 554 5.7.1 Rejected as Spam see: http:// rejected.domain.com/help/spam/rejected.html */ $result['rule_cat'] = 'antispam'; $result['rule_no'] = '0216'; } /* rule: antispam * sample: * Diagnostic-Code: SMTP; 553 5.7.1 <[email protected]>... SpamTrap=reject mode, dsn=5.7.1, Message blocked by BOX Solutions (www.domain.com) SpamTrap Technology, please contact the domain.com site manager for help: (ctlusr8012).^M */ $result['rule_cat'] = 'antispam'; $result['rule_no'] = '0200'; } /* rule: antispam, mailfrom mismatch * sample: * Diagnostic-Code: SMTP; 550 Verify mailfrom failed,blocked */ $result['rule_cat'] = 'antispam'; $result['rule_no'] = '0210'; } /* rule: antispam, mailfrom mismatch * sample: * Diagnostic-Code: SMTP; 550 Error: MAIL FROM is mismatched with message header from address! */ $result['rule_cat'] = 'antispam'; $result['rule_no'] = '0226'; } /* rule: antispam * sample: * Diagnostic-Code: SMTP; 554 5.7.1 Message scored too high on spam scale. For help, please quote incident ID 22492290. */ $result['rule_cat'] = 'antispam'; $result['rule_no'] = '0211'; } /* rule: antispam * sample: * Diagnostic-Code: SMTP; 554 5.7.1 reject: Client host bypassing service provider's mail relay: ds176.domain.com 8? elseif (preg_match ("/Client host bypass/is",$diag_code)) { $result['rule_cat'] = 'antispam'; $result['rule_no'] = '0229'; } /* rule: antispam * sample: * Diagnostic-Code: SMTP; 550 sorry, it seems as a junk mail */ $result['rule_cat'] = 'antispam'; $result['rule_no'] = '0230'; } /* rule: antispam * sample: * Diagnostic-Code: SMTP; 553-Message filtered. Please see the FAQs section on spam */ $result['rule_cat'] = 'antispam'; $result['rule_no'] = '0227'; } /* rule: antispam, subject filter * sample: * Diagnostic-Code: SMTP; 554 5.7.1 The message from (<[email protected]>) with the subject of ( *(ca2639) 7|-{%2E* : {2"(%EJ;y} (SBI$#$@<K*:7s1!=l~) matches a profile the Internet community may consider spam. Please revise your message before resending. */ $result['rule_cat'] = 'antispam'; $result['rule_no'] = '0222'; } /* rule: internal_error * sample: * Diagnostic-Code: SMTP; 451 Temporary local problem - please try later */ $result['rule_cat'] = 'internal_error'; $result['rule_no'] = '0142'; } /* rule: internal_error * sample: * Diagnostic-Code: SMTP; 553 5.3.5 system config error */ $result['rule_cat'] = 'internal_error'; $result['rule_no'] = '0153'; } /* rule: delayed * sample: * Diagnostic-Code: X-Postfix; delivery temporarily suspended: conversation with^M * 111.111.111.11[111.111.111.11] timed out while sending end of data -- message may be^M * sent more than once */ $result['rule_cat'] = 'delayed'; $result['rule_no'] = '0213'; } // =========== rules based on the dsn_msg =============== /* rule: unknown * sample: * ----- The following addresses had permanent fatal errors ----- * ----- Transcript of session follows ----- * ... while talking to mta1.domain.com.: * >>> DATA * <<< 503 All recipients are invalid * 554 5.0.0 Service unavailable */ elseif (preg_match ("/(?:alias|account|recipient|address|email|mailbox|user)(.*)invalid/i",$dsn_msg)) { $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0107'; } /* rule: unknown * sample: * ----- Transcript of session follows ----- * [email protected]... Deferred: No such file or directory */ $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0141'; } /* rule: unknown * sample: * Failed to deliver to '<[email protected]>'^M * LOCAL module(account xxxx) reports:^M * mail receiving disabled^M */ $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0194'; } /* rule: unknown * sample: * - These recipients of your message have been processed by the mail server:^M * [email protected]; Failed; 5.1.1 (bad destination mailbox address) */ $result['rule_cat'] = 'unknown'; $result['rule_no'] = '227'; } /* rule: full * sample 1: * This Message was undeliverable due to the following reason: * The user(s) account is temporarily over quota. * sample 2: * Recipient address: [email protected] * Reason: Over quota */ $result['rule_cat'] = 'full'; $result['rule_no'] = '0131'; } /* rule: full * sample: * Sorry the recipient quota limit is exceeded. * This message is returned as an error. */ $result['rule_cat'] = 'full'; $result['rule_no'] = '0150'; } /* rule: full * sample: * The user to whom this message was addressed has exceeded the allowed mailbox * quota. Please resend the message at a later time. */ $result['rule_cat'] = 'full'; $result['rule_no'] = '0187'; } /* rule: full * sample 1: * Failed to deliver to '<[email protected]>' * LOCAL module(account xxxxxx) reports: * account is full (quota exceeded) * sample 2: * Error in fabiomod_sql_glob_init: no data source specified - database access disabled * [Fri Feb 17 23:29:38 PST 2006] full error for caltsmy: * that member's mailbox is full * 550 5.0.0 <[email protected]>... Can't create output */ $result['rule_cat'] = 'full'; $result['rule_no'] = '0132'; } /* rule: full * sample: * gaosong "(0), ErrMsg=Mailbox space not enough (space limit is 10240KB) */ $result['rule_cat'] = 'full'; $result['rule_no'] = '0219'; } /* rule: defer * sample 1: * ----- Transcript of session follows ----- * [email protected]... Deferred: Connection refused by nomail.tpe.domain.com. * Message could not be delivered for 5 days * Message will be deleted from queue * sample 2: * 451 4.4.1 reply: read error from www.domain.com. * [email protected]... Deferred: Connection reset by www.domain.com. */ $result['rule_cat'] = 'defer'; $result['rule_no'] = '0115'; } /* rule: dns_unknown * sample: * ----- The following addresses had permanent fatal errors ----- * Tan XXXX SSSS <[email protected]> * ----- Transcript of session follows ----- * 553 5.1.2 XXXX SSSS <[email protected]>... Invalid host name */ $result['rule_cat'] = 'dns_unknown'; $result['rule_no'] = '0109'; } /* rule: dns_unknown * sample: * ----- Transcript of session follows ----- * [email protected]... Deferred: mail.domain.com.: No route to host */ $result['rule_cat'] = 'dns_unknown'; $result['rule_no'] = '0109'; } /* rule: dns_unknown * sample: * ----- Transcript of session follows ----- * 550 5.1.2 [email protected]... Host unknown (Name server: .: no data known) */ $result['rule_cat'] = 'dns_unknown'; $result['rule_no'] = '0140'; } /* rule: dns_unknown * sample: * ----- Transcript of session follows ----- * 451 HOTMAIL.com.tw: Name server timeout * Message could not be delivered for 5 days * Message will be deleted from queue */ $result['rule_cat'] = 'dns_unknown'; $result['rule_no'] = '0118'; } /* rule: dns_unknown * sample: * ----- Transcript of session follows ----- * [email protected]... Deferred: Connection timed out with hkfight.com. * Message could not be delivered for 5 days * Message will be deleted from queue */ $result['rule_cat'] = 'dns_unknown'; $result['rule_no'] = '0119'; } /* rule: dns_unknown * sample: * ----- Transcript of session follows ----- * [email protected]... Deferred: Name server: domain.com.: host name lookup failure */ $result['rule_cat'] = 'dns_unknown'; $result['rule_no'] = '0121'; } /* rule: dns_loop * sample: * ----- Transcript of session follows -----^M * 554 5.0.0 MX list for znet.ws. points back to mail01.domain.com^M * 554 5.3.5 Local configuration error^M */ $result['rule_cat'] = 'dns_loop'; $result['rule_no'] = '0199'; } /* rule: internal_error * sample: * ----- Transcript of session follows ----- * 451 4.0.0 I/O error */ $result['rule_cat'] = 'internal_error'; $result['rule_no'] = '0120'; } /* rule: internal_error * sample: * Failed to deliver to '[email protected]'^M * SMTP module(domain domain.com) reports:^M * connection with mx1.mail.domain.com is broken^M */ $result['rule_cat'] = 'internal_error'; $result['rule_no'] = '0231'; } /* rule: other * sample: * Delivery to the following recipients failed. */ elseif (preg_match ("/Delivery to the following recipients failed.*\n.*\n.*".$result['email']."/i",$dsn_msg)) { $result['rule_cat'] = 'other'; $result['rule_no'] = '0176'; } // Followings are wind-up rule: must be the last one // many other rules msg end up with "550 5.1.1 ... User unknown" // many other rules msg end up with "554 5.0.0 Service unavailable" /* rule: unknown * sample 1: * ----- The following addresses had permanent fatal errors -----^M * <[email protected]>^M * (reason: User unknown)^M * sample 2: * 550 5.1.1 [email protected]... User unknown^M */ $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0193'; } /* rule: unknown * sample: * 554 5.0.0 Service unavailable */ $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0214'; } break; case 'delayed': $result['rule_cat'] = 'delayed'; $result['rule_no'] = '0110'; break; case 'delivered': case 'relayed': case 'expanded': // unhandled cases break; default : break; } } global $rule_categories, $bmh_newline; if ($result['rule_no'] == '0000') { if ($debug_mode) { echo 'email: ' . $result['email'] . $bmh_newline; echo 'Action: ' . $action . $bmh_newline; echo 'Status: ' . $status_code . $bmh_newline; echo 'Diagnostic-Code: ' . $diag_code . $bmh_newline; echo "DSN Message:<br />\n" . $dsn_msg . $bmh_newline; echo $bmh_newline; } } else { if ($result['bounce_type'] === false) { $result['bounce_type'] = $rule_categories[$result['rule_cat']]['bounce_type']; $result['remove'] = $rule_categories[$result['rule_cat']]['remove']; } } return $result; } ?>
URL: http://sourceforge.net/projects/bmh