Einfaches BounceMail Managament mit PEAR Net_Imap
Wenn man auf seiner Seite Newsletter versendet sollte man darauf achten die zurückkommenden Mails:
- zu empfangen (Einen Return-Path beim versenden angeben)
- 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');
?>