La gestion des e-mails de rebond avec PHP?

Voici mon scénario:

j'ai 2 comptes email: admin@domain.com et bounce@domain.com.

je veux envoyer un e-mail à tous mes utilisateurs avec admin@domain.com mais ensuite "répondre à" bounce@domain.com (jusqu'ici, mon script PHP peut le gérer).

quand, l'email ne peut pas être envoyé, il est envoyé à bounce@domain.com, le message d'erreur pourrait être 553 (email inexistant ...) etc.

ma question Est: Comment puis-je dirigez tous ces e-mails de rebond (ne pouvait pas-e-mails envoyés) à bounce@domain.com à travers un script de manipulation pour vérifier les codes d'erreur de rebond?

quel langage de programmation devrais-je utiliser pour le "traitement du script"?

à quoi ressemblerait le "script de manipulation"? Pouvez-vous nous donner un exemple?

en d'autres termes:

quelles sont les procédures que je devrais suivre pour traiter le courriel de rebond ?

28
demandé sur BartoszKP 2009-06-18 13:26:19

14 réponses

Le meilleur scénario est de pouvoir classer le type de rebondir: doux, dur...

ce que nous utilisons est BounceStudio . Vous devez le compiler et ajouter les bibliothèques php... pas mal du tout. Vous avez la version gratuite et payante de ce produit

une fois que nous détectons le sorte de rebond nous utilisons PEAR:: MAIL:: MIME pour rechercher des en-têtes personnalisés que nous avons ajouté précédemment à l'e-mail, permet de dire:

X-user-id: XXXXX
X-campaign-id: YYYYYY 
X-recipient-id: SSSSSSSSS

de cette façon, nous pouvons connaître le destinataire réel que nous avons envoyé l'e-mail.

j'espère que cela vous aidera! vous pouvez donc m'aider à atteindre les 500 points: p

29
répondu Gabriel Sosa 2009-06-18 14:36:23

pourquoi ne pas créer un bounce@domain.com et utilisez php pour lire ces e-mails et faire ce que vous voulez?

modifier après votre commentaire : S'il vous plaît chec my link whcih a un script php qui vous apprendra comment ouvrir et boîte de courriel en utilisant php et lire les courriels. Vous pouvez utiliser ce sac pour vérifier les messages d'erreur.

7
répondu Shoban 2009-06-18 09:59:14

laisser les e-mails rebondir à une adresse qui est vraiment une adresse e-mail (avec les détails de connexion, etc.).

crée un script php qui exécute toutes les x minutes (par exemple avec un travail cron). Ce script php doit faire ce qui suit. - Récupérez tous les e-mails de la boîte (utilisez par exemple Zend Mail ) - Vérifiez l'erreur dans le message (par exemple en effectuant une recherche avec des expressions régulières) - Faites ce que jamais, il est nécessaire.

Si vous voulez savoir spécifiquement qui a rebondi vous pouvez utiliser des adresses rebond spécifiques à l'utilisateur. (Voir par exemple ce site )

5
répondu Peter Smit 2009-06-18 10:58:40

peut-être que c'est un peu tard pour la réponse, mais vous pouvez toujours essayer quelque chose de nouveau. J'ai eu la dernière semaine une tâche comme celle-ci, et utilisé classe de maître de rebond, Par Chris Fortune, qui découpe le rebond en tableaux associatifs - http://www.phpclasses.org/browse/file/11665.html

cela sera utilisé après que vous vous connectez à la POP3 avec un mailer pour obtenir les primes de celui-ci, puis le parse en morceaux avec ceci, et si le statut que vous avez recherché pour, faire les actions nécessaires.

santé.

4
répondu balazscsaba2006 2010-11-16 11:10:09

si vous avez une boîte aux lettres POP3 configurée pour bounce@domain.com , vous pouvez utiliser un script client POP3 écrit en PHP pour récupérer les messages et vérifier les messages non livrables.

2
répondu Kev 2009-06-18 10:34:46

vous pouvez toujours utiliser quelque chose comme http://cloudmailin.com pour transmettre les e-mails rebondis sur votre serveur php via http cependant vous pouvez être mieux avec un service dédié à l'envoi d'e-mails et l'utilisation de leur api pour récupérer les détails de rebondir.

0
répondu Steve Smith 2011-03-23 11:36:20

j'ai eu assez de malchance à chercher une solution PHP pour cela, mais j'ai couru à travers ce produit qui fait exactement ce dont j'avais besoin.

il fonctionne comme une application native mac/win mais il fait le travail.

http://www.maxprog.com/site/software/internet-marketing/email-bounce-handler_sheet_us.php

0
répondu Jazzy 2011-08-29 00:33:48

je cherchais la réponse à la même question. Il y a plus de parties de la question, et plus d'options.

pour le traitement de l'e-mail rebondi, j'ai trouvé un classe PHP , purement en PHP, aucune compilation ou installation de logiciel supplémentaire nécessaire si vous avez un site alimenté par PHP. Il est très facile à utiliser.

si vous utilisez cPanel, ou InterWorx / SiteWorx, vous pouvez configurer certaines des adresses pour gérer les e-mails avec un script, par exemple un script PHP, vous pouvez écrire votre propre de manutention à l'aide de la classe. Ou bien sûr, vous pouvez toujours créer des comptes e-mail ordinaires et récupérer les mails via POP3 ou IMAP, puis les interpréter. Je pense que le premier est mieux, parce que c'est direct, vous n'avez pas à utiliser d'autres canaux, comme IMAP. Bien sûr, si vous ne pouvez pas configurer votre serveur de messagerie, ou ne savent pas comment le faire, alors que le premier est mieux pour vous.

Bonne chance! :)

0
répondu Tamás Barta 2011-11-16 16:02:25

dans la commande php mail http://php.net/mail

vous utilisez le cinquième paramètre et d'ajouter "-f".

donc, vous utilisez " - f mybouncebox@mydomain.com "comme paramètre

le phplist newsletter manager utilise ceci pour gérer les primes.

une fois que les rebonds se remplissent dans la boîte aux lettres, vous pouvez les POP, et les traiter. C'est la façon la plus facile de traiter avec et non pas les manipuler à leur arrivée.

0
répondu michiel 2012-02-08 04:10:22

Voici une solution en conserve pour traiter les rebonds en utilisant IMAP.

j'ai changé l'en-tête Return-Path de mon instance Mail en un en-tête dédié bounce@xxxxxx.us

la seule méthode assez facile pour moi de considérer viable est la suivante, qui vérifie via POP3 la boîte de réception dédiée et peut gérer chaque email basé sur le message reçu.

$inst=pop3_login('mail.xxxxxx.us','110','bounce@xxxxxx.us','pass');
$stat=pop3_stat($inst);
//print_r($stat);
if($stat['Unread']>0){
    echo "begin process<br><br>";
    $list=pop3_list($inst);
    //print_r($list);
    foreach($list as $row){
        if(strpos($row['from'],'MAILER-DAEMON')!==FALSE){
            $msg=imap_fetchbody($inst,$row['msgno'],'1');
            if(strpos($msg,'550')!==FALSE){
                echo "handle hard bounce".$msg."<br><br>";
                //WHATEVER HERE TO PROCESS BOUNCE
            }   
        }
        else{
            $msg=imap_fetchbody($inst,$row['msgno'],'1');
            echo "not from my server. could be spam, etc.".$msg."<br><br>";
            //PROBABLY NO ACTION IS NEEDED
        }   
        //AFTER PROCESSING
        //imap_delete ( resource $imap_stream , int $msg_number [, int $options = 0 ] )
        //commented out because I havent implemented yet. see IMAP documentation
    }   
}   
else{
    echo "no unread messages";  
}


//imap_close ( resource $imap_stream [, int $flag = 0 ] )
//commented out because I havent implemented yet. see IMAP documentation.
//flag: If set to CL_EXPUNGE, the function will silently expunge the mailbox before closing, removing all messages marked for deletion. You can achieve the same thing by using imap_expunge()




function pop3_login($host,$port,$user,$pass,$folder="INBOX",$ssl=false) 
{ 
    $ssl=($ssl==false)?"/novalidate-cert":""; 
    return (imap_open("{"."$host:$port/pop3$ssl"."}$folder",$user,$pass)); 
} 
function pop3_stat($connection)        
{ 
    $check = imap_mailboxmsginfo($connection); 
    return ((array)$check); 
} 
function pop3_list($connection,$message="") 
{ 
    if ($message) 
    { 
        $range=$message; 
    } else { 
        $MC = imap_check($connection); 
        $range = "1:".$MC->Nmsgs; 
    } 
    $response = imap_fetch_overview($connection,$range); 
    foreach ($response as $msg) $result[$msg->msgno]=(array)$msg; 
        return $result; 
} 
function pop3_retr($connection,$message) 
{ 
    return(imap_fetchheader($connection,$message,FT_PREFETCHTEXT)); 
} 
function pop3_dele($connection,$message) 
{ 
    return(imap_delete($connection,$message)); 
} 
0
répondu Dustin Flick 2012-11-01 04:51:37

nous utilisons Procmail pour filtrer ce genre de courrier. Après avoir examiné quelques-unes des solutions déjà mentionnées ici, nous nous sommes retrouvés avec une recette simple de Procmail pour détecter les messages de rebond. Selon la précision dont vous avez besoin, cela peut s'appliquer à votre situation.

pour plus de détails, consultez ce article de blog .

0
répondu claasz 2013-12-16 11:19:47

j'ai eu le même problème, la même situation. Par défaut, mon serveur de messagerie, est l'envoi de tous mes mails retournés au même compte qu'il a été envoyé à l'origine à partir, avec MSG automatique "Mail delivery failed: returning message to sender" .

Je ne veux pas vraiment savoir pourquoi il a été retourné, avait tellement de transactions postales que je veux juste enlever les mauvaises. Ne pas avoir le temps de vérifier la règle spécifique comme Doestn existe, indisponible, etc ,,, Je veux juste marquer pour la suppression et continuer.

les e-mails de rebond sont si triviaux que vous avez besoin de traiter avec un grand nombre de serveurs et de types de réponses différents. Chaque logiciel anti-spam ou scénario de système d'exploitation peut envoyer un code d'erreur différent avec l'email rebondi.

je vous recommande de lire et de télécharger cette version déboguée fixe de manipulation de courrier électronique rebondi-en utilisant PHPMAILER-BMH et AUTHSMTP de KIDMOSES ici http://www.kidmoses.com/blog-article.php?bid=40 si vous voulez configurer IMAP et et envoyer vos propres en-têtes personnalisés, envoyez - les à votre bounce@domain.com et puis croise les doigts pour voir si le script attrape les en-têtes que vous avez envoyés écrits dans le courrier rebondi. Je l'ai essayé, fonctionne.

mais si vous voulez suivre ma solution rapide et facile qui a résolu mon problème, voici le secret.

1 - Téléchargez la meilleure version à partir de KIDMOSES site ou à partir de mon site, juste au cas où KIDMOSES veulent se déplacer ailleurs http://chasqui.marché/téléchargements/KIDMOSES-phpmailer-bdm.zip

2-la variable qui contient le texte de votre mail retourné est $body et elle-même contient le mauvais email retourné (donc son tableau multidimensionnel ). (Contient aussi le courrier de vos serveurs et d'autres trucs de courrier DNS, mais nous sommes à la recherche du mauvais courrier qui a rebondi.

3-depuis votre propre Le SERVICE vous renvoie l'email rebondi, puis il est peu probable de changer son format et ses propres en-têtes, en envoyant des e-mails rebondi, de sorte que vous êtes en sécurité pour choisir l'ordre du tableau de l'email rebondi retourné. Dans mon cas a toujours été le même modèle de format. (Sauf si vous changez de système ou de fournisseur)

4 - nous examinons ce $body et cherchons toutes les variables de chaîne de courriel et les extrayons les positionnant dans un tableau bidimensionnel appelé $ matches

5 - nous sélectionnons la position du tableau, en imprimant le tableau en utilisant print_r( array_values ($matches ));

6 - C'est le code que vous devez modifier. C'est aux alentours de la ligne 500 de la classe .phpmailer-bdm.php fichier

  // process bounces by rules
  $result = bmhDSNRules($dsn_msg,$dsn_report,$this->debug_dsn_rule);
} elseif ($type == 'BODY') {
  $structure = imap_fetchstructure($this->_mailbox_link,$pos);
  switch ($structure->type) {
    case 0: // Content-type = text
      $body = imap_fetchbody($this->_mailbox_link,$pos,"1");
      $result = bmhBodyRules($body,$structure,$this->debug_body_rule);

      //MY RULE IT WORKS at least on my return mail system..
      $pattern = '/[a-z0-9_\-\+]+@[a-z0-9\-]+\.([a-z]{2,3})(?:\.[a-z]{2})?/i';
      preg_match_all($pattern, $body, $matches);
        //print_r( array_values( $matches ));     //To select array number of bad returned mail desired, usually is 1st array $matches[0][0]          
        echo "<font color = red>".$matches[0][0]."</font><br>";
      break;

alors on oublie les en-têtes retournés et on se concentre sur les mauvais emails. Vous pouvez les surpasser, vous pouvez MySQL, ou le processus à tout ce que vous voulez faire.

IMPORTANT Commentaire les echos dans callback_echo.php dans le répertoire samples sinon vous obtenez tout le bazar avant impression.

function callbackAction ($msgnum, $bounce_type, $email, $subject,      $xheader, $cheader, $remove, $rule_no=false, $rule_cat=false, $rule_msg='', $totalFetched=0) {
  $displayData = prepData($email, $bounce_type, $remove);
  $bounce_type = $displayData['bounce_type'];
  $emailName   = $displayData['emailName'];
  $emailAddy   = $displayData['emailAddy'];
  $remove      = $displayData['remove'];
  //echo "<br>".$msgnum . ': '  . $rule_no . ' | '  . $rule_cat . ' | '  . $bounce_type . ' | '  . $remove . ' | ' . $email . ' | '  . $subject . ' | ';
  //echo 'Custom Header: '  . $cheader . " | ";
  //echo 'Bounce Message: '  . $rule_msg . " | ";
  return true;
}

MY OUTPUT

Connected to: mail.chasqui.market (bounce@chasqui.market)
Total: 271 messages 
Running in disable_delete mode, not deleting messages from mailbox

kty2001us@starmedia.com

...

entv@nuevoface.com

Closing mailbox, and purging messages
Read: 271 messages
0 action taken
271 no action taken
0 messages deleted
0 messages moved
0
répondu Lucho Cabrejo 2015-11-24 18:57:51

vous pouvez utiliser imap_open pour accéder à vos mails à partir de PHP.

cette fonction fonctionne aussi pour POP3 mais toutes les fonctions ne peuvent pas fonctionner ici. Cependant, je pense qu'en 2018, la plupart des clients de messagerie électronique devraient soutenir IMAP.

cette fonction peut également être utilisée pour ouvrir les flux vers POP3 et NNTP serveurs, mais certaines fonctions et fonctionnalités ne sont disponibles que sur IMAP serveur.

voici un petit exemple, comment itérer à travers vos e-mails:

  /* connect to server */
  $hostname = "{$your-server:$your-port}INBOX";
  $username = 'my-username';
  $password = '123';

  /* try to connect */
  $inbox = imap_open($hostname,$username,$password) or die('Cannot connect to mailbox: ' . imap_last_error());

  /* grab emails */
  $emails = imap_search($inbox,'ALL');

  /* if emails are returned, cycle through each... */
  if($emails) {
    /* for every email... */
    foreach($emails as $email_number) {

        $message = imap_body($inbox,$email_number,2);
        $head    = imap_headerinfo($inbox, $email_number,2);
        // Here you can handle your emails
        // ...
        //  ...
      }
  }

dans mon cas, je sais que je reçois toujours ma livraison de courrier a échoué de Mailer-Daemon@myserver.com . Donc je pouvais identifier des rebonds comme ça:

if($head->from[0]->mailbox == 'Mailer-Daemon')
{
  // We have a bounce mail here!
}

vous avez dit:

quand, l'email ne peut pas être envoyé, il est envoyé à bounce@domain.com, le le message d'erreur pourrait être 553 (courriel inexistant ...) etc.

donc si votre rebond les e-mails ont le sujet "mail delivery failed: Error 553" alors vous pouvez les identifier par le sujet comme ceci:

if($head->subject == 'Mail delivery failed: Error 553')
{
  // We have a bounce mail here!
}

l'adresse e-mail manquée n'est pas dans l'en-tête, vous devez donc l'analyser à partir de la variable $message avec un code intelligent.

0
répondu Adam 2018-09-17 11:26:30

vous devriez regarder SwiftMailer. Il est entièrement écrit en PHP et dispose d'un support pour les e-mails "bounce". http://swiftmailer.org/

-1
répondu Brent Baisley 2010-06-04 12:59:39