e107 = e107::getInstance(); if (($override === FALSE) || !is_array($override)) { // Set up from prefs $override['mail_bounce_user'] = $pref['mail_bounce_user']; $override['mail_bounce_pass'] = $pref['mail_bounce_pass']; $override['mail_bounce_email'] = $pref['mail_bounce_email']; $override['mail_bounce_pop3'] = $pref['mail_bounce_pop3']; $override['mail_bounce_type'] = varset($pref['mail_bounce_type'],'pop3'); } if($override['mail_bounce_type']=='imap') { $port = varset($override['mail_bounce_port'], '143'); $strConnect='{'.$override['mail_bounce_pop3'].':'.$port. '}INBOX'; } else { $port = varset($override['mail_bounce_port'], '110'); // POP3 port $servertype = '/'.varset($override['mail_bounce_type'], 'pop3'); $strConnect='{'.$override['mail_bounce_pop3'].':'.$port. $servertype.'}INBOX'; } $this->server = $strConnect; $this->username = $override['mail_bounce_user']; $this->password = $override['mail_bounce_pass']; $this->email = $override['mail_bounce_email']; $this->delBounce = ($pref['mail_bounce_delete']) ? true : false; } function connect() //Connect To the Mail Box { $this->mailResource=imap_open($this->server,$this->username,$this->password); } function getTotalMails() //Get Total Number off Unread Email In Mailbox { $headers=imap_headers($this->mailResource); return count($headers); } function getHeaders($mid) // Get Header info { $mail_header=imap_header($this->mailResource,$mid); $sender=$mail_header->from[0]; $sender_replyto=$mail_header->reply_to[0]; $stat = !(strtolower($sender->mailbox) != 'mailer-daemon' && strtolower($sender->mailbox) != 'postmaster'); if(strpos($mail_header->subject,"delayed")) { $stat = FALSE; } $mail_details=array( 'from'=>strtolower($sender->mailbox).'@'.$sender->host, 'fromName'=>$sender->personal, 'toOth'=>strtolower($sender_replyto->mailbox).'@'.$sender_replyto->host, 'toNameOth'=>$sender_replyto->personal, 'subject'=>$mail_header->subject, 'to'=>strtolower($mail_header->toaddress), 'bounce'=>$stat, 'date'=>$mail_header->date ); return $mail_details; } protected function get_mime_type(&$structure) //Get Mime type Internal Private Use { $primary_mime_type = array("TEXT", "MULTIPART", "MESSAGE", "APPLICATION", "AUDIO", "IMAGE", "VIDEO", "OTHER"); if($structure->subtype) { return $primary_mime_type[(int) $structure->type] . '/' . $structure->subtype; } return "TEXT/PLAIN"; } protected function get_part($stream, $msg_number, $mime_type, $structure = false, $part_number = false) //Get Part Of Message Internal Private Use { if(!$structure) { $structure = imap_fetchstructure($stream, $msg_number); } if($structure) { if($mime_type == $this->get_mime_type($structure)) { if(!$part_number) { $part_number = '1'; } $text = imap_fetchbody($stream, $msg_number, $part_number); if($structure->encoding == 3) { return imap_base64($text); } else if($structure->encoding == 4) { return imap_qprint($text); } else { return $text; } } if($structure->type == 1) /* multipart */ { foreach($structure->parts as $index => $sub_structure) { if($part_number) { $prefix = $part_number . '.'; } $data = $this->get_part($stream, $msg_number, $mime_type, $sub_structure, $prefix . ($index + 1)); if($data) { return $data; } } } } return false; } function getBody($mid,$mode='') // Get Message Body { if($mode != 'plain') { $body = $this->get_part($this->mailResource, $mid, 'TEXT/HTML'); } if (($body == '') || $mode == 'plain') { $body = $this->get_part($this->mailResource, $mid, 'TEXT/PLAIN'); } if ($body == '') { return ''; } return $body; } function deleteMails($mid) // Delete That Mail { imap_delete($this->mailResource,$mid); } function close_mailbox() //Close Mail Box { imap_close($this->mailResource,CL_EXPUNGE); } /** * Loop reading all emails from the bounces mailbox. If an email address and/or e107 header are * identified, process the bounce. * Delete all emails after processing, if $pref flag is set. * * @return void */ public function processBounces() { $identifier = deftrue('MAIL_IDENTIFIER', 'X-e107-id'); $this->connect(); $tot = $this->getTotalMails(); // Get all the emails for ($i = 1; $i <= $tot; $i++) { $head = $this->getHeaders($i); // Get the headers if ($head['bounce']) { //print_a($head); $body = $this->getBody($i); $e107Header = ''; if (preg_match('#.*'.$identifier.':(.*?)[\n\r]#',$body, $result)) { $e107Header = varset($result[1],''); } $emailAddress = ''; if (preg_match("/[\._a-zA-Z0-9-]+@[\._a-zA-Z0-9-]+/i",$body,$result)) { $emailAddress = varset($result[0],''); if ($emailAddress == $this->email) { $emailAddress = ''; // Email address found is that of the bounce email account } } // Call the bounce handler here if ($this->mailManager === FALSE) { require_once(e_HANDLER.'mail_manager_class.php'); $this->mailManager = new e107MailManager(); } echo "Email: {$emailAddress}
Header: {$e107Header}
"; $this->mailManager->markBounce($e107Header, $emailAddress); } // Now delete the email, if option set (do it regardless of whether a bounce email) if ($this->delBounce) { $this->deleteMails($i); // Not actually deleted until we close the mailbox } } $this->close_mailbox(); } }