Home > Webentwicklung > Einfaches BounceMail Managament mit PEAR Net_Imap

Einfaches BounceMail Managament mit PEAR Net_Imap

Wenn man auf seiner Seite Newsletter versendet sollte man darauf achten die zurückkommenden Mails:

  1. zu empfangen (Einen Return-Path beim versenden angeben)
  2. dann zu löschen oder deaktivieren

Um das zu realisieren muss man erstmal ein IMAP Postfach abrufen und die Mails darin auslesen. Ich hatte als letztes dafür das Paket Zend_Mail aus dem Zend Framework verwendet und war nicht so angetan von der Verwendung der Klasse. Der Hauptvorteil der Zend_Mail ist die saubere PHP5 Programmierung. Das Paket PEAR::Mail_IMAPv2 ist nicht wirklich intuitiv aufgebaut und benötigt die imap Extension, die auf meinen lokalen Windows Rechner Probleme machte.

Net_Imap

Ich bin dann auf das wenig dokumentierte Paket Net_Imap gestoßen. Dieses benötigt nicht die imap Extension und auch keine Dokumentation, da die Klasse so intuitiv aufgebaut ist, dass man sofort weiß wie man damit umgehen soll.

Mit dieser einfachen Klasse kann ich somit ein Postfach auslesen und gebe die gefundene Mail Adresse über den Event Dispatcher bekannt.

Klasse Mail_Bounce

<?php
require_once ('Net/IMAP.php');
require_once ('Event/Dispatcher.php');
/**
 * @author Axel Jung
 * @version 1.0
 * @created 14-Jan-2008 15:20:00
 */
class Mail_Bounce{
    private $oNet_IMAP;
    private $oLog;
    private $oEvent_Dispatcher;
    /**
     * @param     Net_IMAP
     * @param    Log
     * @param    Event_Dispatcher
     */
    public function __construct(Net_IMAP $oNet_IMAP,Logger $log,Event_Dispatcher $oEvent_Dispatcher ){
        $this->oNet_IMAP = $oNet_IMAP;
        $this->oLog = $log;
        $this->oEvent_Dispatcher = $oEvent_Dispatcher;
    }
    /**
     * @param string    user
     * @param string    pass
     */
    public function readMailbox( $user, $pass){
        $this->login($user, $pass);
        $num = $this->oNet_IMAP->numMsg();
        if($num >0){
            $aMails = $this->oNet_IMAP->getMessagesList();
            if(PEAR::isError($aMails)){
                $this->oLog->log('Mail_Bounce->readMailbox() getMessagesList() error: '.$aMails->getMessage(),PEAR_LOG_ERR);
            }
            foreach($aMails as $aMail){
                $this->readMail($aMail['msg_id'],$aMail['uidl']);
            }
        }
        $this->logout();
    }
    /**
     * @param string    user
     * @param string    pass
     */
    private function login($user, $pass){
        $this->oLog->log('Mail_Bounce->login() try to login: '.$user,PEAR_LOG_INFO);
        $res = $this->oNet_IMAP->login($user, $pass);
        if(PEAR::isError($res)){
            $this->oLog->log('Mail_Bounce->login() login failed error: '.$res->getMessage(),PEAR_LOG_ERR);
            return false;
        }
        $this->oLog->log('Mail_Bounce->login() login sussess ',PEAR_LOG_INFO);
    }
    private function logout(){
        if(true === $this->oNet_IMAP->disconnect(true)){
             $this->oLog->log('Mail_Bounce->logout() disconnect sussess',PEAR_LOG_INFO);
        }else{
            $this->oLog->log('Mail_Bounce->logout() disconnect failed',PEAR_LOG_ERR);
        }
    }
    /**
     * @param    integer Message ID
     * @param    integer
     */
    private function readMail($msg_id,$uidl){
        $this->oLog->log('Mail_Bounce->readMail() read mail id: '.$msg_id,PEAR_LOG_INFO);
        $body = $this->oNet_IMAP->getBody($msg_id);
        $body = strip_tags($body);
        $aTreffer = array();
        if(preg_match('/To: (([a-z0-9]+([-_.]?[a-z0-9])+)@[a-z0-9äöü]+([-_.]?[a-z0-9])+.[a-z]{2,4})/i',$body,$aTreffer)){
            $email = $aTreffer[1];
            try{
                Event_Dispatcher::getInstance()->post($email,'onBounceEmail');
                $this->oLog->log('Mail_Bounce->readMail() email found: '.$email,PEAR_LOG_INFO);
                $this->deleteMassege($msg_id);
            }
            catch(Exception $e){
                $this->oLog->log('Mail_Bounce->readMail() email found but error: '.$e->getMessage(),PEAR_LOG_ERR);
            }
        }else{
            $this->oLog->log('Mail_Bounce->readMail() readMail To Adress not found'.$body,PEAR_LOG_ERR);
        }
    }
    /**
     * @param    integer     Message ID
     * @param    integer
     */
    private function deleteMassege($msg_id){
        if(true === $this->oNet_IMAP->deleteMessages($msg_id)){
            $this->oLog->log('Mail_Bounce->deleteMassege() delete mail id: '.$msg_id,PEAR_LOG_INFO);
        }else{
            $this->oLog->log('Mail_Bounce->deleteMassege() delete failed mail id: '.$msg_id,PEAR_LOG_ERR);
        }
    }
}
?>

Events abfangen

Mit folgenden Code reagiere ich auf den Event und kann die Mailadresse deaktivieren oder löschen.

<?
require_once 'Event/Dispatcher.php';
$oEvent_Dispatcher = Event_Dispatcher::getInstance();
$oEvent_Dispatcher->addObserver(array(new Dao_MailAbo(),'onBounceEmail'),'onBounceEmail');
?>
Categories: Webentwicklung Tags:
  1. Bisher keine Kommentare
  1. Bisher keine Trackbacks
Du musst Dich anmelden um einen Kommentar zu schreiben