web-dev-qa-db-fra.com

Bounce Email manipulation avec PHP?

Voici mon scénario:

J'ai 2 comptes de messagerie: [email protected] et [email protected].

Je souhaite envoyer un courrier électronique à tous mes utilisateurs avec [email protected], mais "répondre à" [email protected] (jusqu'à maintenant, mon script PHP peut le gérer).

Quand, l'email ne peut pas être envoyé, il est envoyé à [email protected], le message d'erreur pourrait être 553 (email inexistant, etc.), etc.

Ma question est la suivante: comment diriger tous ces courriels de rebond (courriels n'ayant pas pu être envoyés) vers [email protected] via un script de traitement pour vérifier les codes d'erreur de rebond?

Quel langage de programmation dois-je utiliser pour le "script de traitement"?

À quoi ressemblerait le "script de manipulation"? Pouvez-vous donner un échantillon?

en d'autres termes:

Quelles sont les procédures que je devrais suivre pour gérer l'e-mail de rebond?

29
mcfadder_09

Le meilleur scénario est de pouvoir classer le type de rebond: soft, hard ...

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

une fois que nous avons détecté le type de rebond , nous utilisons PEAR :: MAIL :: MIME pour rechercher les en-têtes personnalisés que nous avons ajoutés précédemment à l'e-mail.

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

de cette manière, nous pouvons connaître le destinataire réel auquel nous avons envoyé le courrier électronique.

espérons que cela vous aidera! afin que vous puissiez m'aider à atteindre les 500 points: P

29
Gabriel Sosa

Pourquoi ne pas créer un [email protected] et utiliser php pour lire ces emails et faire ce que vous voulez?

Edit Après votre commentaire: S'il vous plaît, cliquez sur mon lien qui a un script php qui vous apprendra comment ouvrir une boîte de messagerie en utilisant php et lire les emails. Vous pouvez utiliser ce script pour vérifier les messages d'erreur.

7
Shoban

Laissez les emails renvoyer à une adresse qui est vraiment une adresse email (avec les informations de connexion, etc.).

Faire un script php qui s'exécute toutes les x minutes (par exemple avec un travail cron). Ce script php doit faire ce qui suit .- Récupérer tous les emails de la boîte (utiliser par exemple Zend Mail ) - Vérifier l’erreur dans le message (par exemple en le cherchant avec des expressions régulières)- Faites ce qui est nécessaire.

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

5
Peter Smit

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 semaine dernière une tâche comme celle-ci, et j'ai utilisé BOUNCE HANDLER Class, de Chris Fortune, qui divise le rebond en tableaux associatifs - http://www.phpclasses.org/browse/file/11665.html

Cela sera utilisé une fois que vous vous êtes connecté au POP3 avec un logiciel de messagerie pour obtenir les rebonds de celui-ci, puis analysez-le en morceaux avec celui-ci et, s'il a le statut que vous avez recherché, effectuez les actions nécessaires.

À votre santé.

4
balazscsaba2006

Si une boîte aux lettres POP3 est configurée pour [email protected], vous pouvez utiliser un script client POP3 écrit avec PHP pour récupérer les messages et rechercher les messages non distribuables.

2
Kev

J'ai eu le même problème, la situation exacte. Par défaut, mon serveur de messagerie envoie tous les messages renvoyés au même compte que celui à partir duquel il a été envoyé, avec msg automatique "La remise du courrier a échoué: le message est renvoyé à l'expéditeur"

Je ne veux pas vraiment savoir pourquoi il a été retourné, il y avait tellement de courriers électroniques que je voulais juste supprimer les mauvais. Ne pas avoir le temps de vérifier la règle spécifique telle que Doestn Exist, Unavailable, etc , je veux juste marquer pour la suppression et continuer.

Les e-mails de rebond sont si triviaux que vous devez gérer de nombreux types de serveurs et de réponses. Chaque scénario de logiciel anti-spam ou de système d'exploitation peut envoyer un code d'erreur différent avec l'e-mail renvoyé.

Je vous recommande de lire et de télécharger cette version corrigée et corrigée de Gestion des courriels rebondis - UTILISER PHPMAILER-BMH AND AUTHSMTP de KIDMOSES ici http://www.kidmoses.com/blog-article.php?bid = 40 si vous souhaitez configurer IMAP et envoyer vos propres en-têtes personnalisés, envoyez-les à votre [email protected] puis croisez les doigts pour voir si le script intercepte les en-têtes que vous avez écrits. le courrier rebondi. J'ai essayé, ça marche.

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

1 - Téléchargez la meilleure version du site KIDMOSES ou de mon site, au cas où KIDMOSES souhaite déménager ailleurs http://chasqui.market/downloads/KIDMOSES-phpmailer-bmh.Zip

2 - La variable qui contient le texte de votre courrier renvoyé est $ body et contient elle-même le mauvais email renvoyé (SO ETS A ARRAY MULTIDIMENSIONAL ARRAY). (Contient également le courrier de vos serveurs et d’autres mails DNS, mais nous recherchons le BAD MAIL BOUNCED.

3 - Puisque votre OWN SERVICE vous renvoie l’email rebondi, il est peu probable que son format et ses en-têtes soient modifiés, renvoyant des emails rebondis. Vous pouvez donc choisir l’ordre de retour du tableau d’emails rebondis. Dans mon cas, il y avait toujours le même modèle de format. (Sauf si vous changez de système ou de fournisseur)

4 - Nous examinons ce $ body, recherchons toutes les variables de chaîne de courrier électronique et les extrayons en les plaçant dans un tableau à deux dimensions appelé $ correspondances 

5 - Nous sélectionnons la position du tableau en imprimant le tableau avec print_r (array_values ​​($ matches)));

6 - C’est le code que vous devez modifier. C'est autour de la ligne 500 du fichier class.phpmailer-bmh.php

  // 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;

Nous oublions donc les en-têtes renvoyés et nous nous concentrons sur les mauvais courriels. Vous pouvez les Excel, MySQL ou les traiter comme bon vous semble.

IMPORTANT Commentez les échos dans callback_echo.php dans le répertoire samples sinon vous aurez tous les fichiers indésirables 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;
}

MON SORTIE

Connected to: mail.chasqui.market ([email protected])
Total: 271 messages 
Running in disable_delete mode, not deleting messages from mailbox

[email protected]

...

[email protected]

Closing mailbox, and purging messages
Read: 271 messages
0 action taken
271 no action taken
0 messages deleted
0 messages moved
0
Luis H Cabrejo

Voici une solution prête à l'emploi pour traiter les rebonds à l'aide d'IMAP.

J'ai changé l'en-tête Return-Path de mon instance Mail en un espace dédié [email protected]

La seule méthode que je puisse facilement considérer comme viable est la suivante: elle vérifie via POP3 la boîte de réception dédiée et peut gérer chaque courrier électronique en fonction du message reçu.

$inst=pop3_login('mail.xxxxxx.us','110','[email protected]','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
Dustin Flick

Vous pouvez utiliser imap_open pour accéder à vos mails depuis PHP.

Cette fonction fonctionne également pour POP3, mais toutes les fonctions ne fonctionnent pas ici. Cependant, je suppose qu'en 2018, la plupart des clients de messagerie devraient prendre en charge IMAP.

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

Voici un petit exemple, comment parcourir vos courriels:

  /* 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 la livraison de mon courrier échoue toujours de [email protected]. Donc, je pourrais identifier les rebonds comme ça:

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

Tu as dit:

Lorsque le courrier électronique ne peut pas être envoyé, il est envoyé à [email protected], le fichier le message d'erreur pourrait être 553 (email inexistant ...) etc.

Donc, si vos e-mails de rebond ont pour objet "Échec de la livraison du courrier: erreur 553", vous pouvez les identifier comme suit:

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

L'adresse e-mail ayant échoué ne figure pas dans l'en-tête. Vous devez donc l'analyser à partir de la variable $message avec un code intelligent.

0
Adam

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

Pour gérer le courrier rebondi, j'ai trouvé une classe PHP , uniquement en PHP, aucune compilation ni installation de logiciel supplémentaire si vous avez un site propulsé par PHP. C'est très facile à utiliser.

Si vous utilisez cPanel ou InterWorx/SiteWorx, vous pouvez configurer certaines adresses pour traiter les e-mails reçus avec un script, par exemple un script PHP, de sorte que vous puissiez écrire votre propre traitement à l'aide la classe mentionnée. Ou bien sûr, vous pouvez toujours créer des comptes de messagerie ordinaires et récupérer les messages via POP3 ou IMAP, puis les interpréter. Je pense que le premier est meilleur, parce que c'est direct, vous n'avez pas à utiliser de canaux supplémentaires, comme IMAP. Bien sûr, si vous ne pouvez pas configurer votre serveur de messagerie, ou ne savez pas comment le faire, le premier est meilleur pour vous.

Bonne chance! :)

0
Tamás Barta

Nous utilisons Procmail pour filtrer ce type de courrier. Après avoir examiné certaines des solutions déjà mentionnées ici, nous avons abouti à une simple recette de Procmail pour détecter les messages renvoyés. Selon l'exactitude dont vous avez besoin, cela pourrait s'appliquer à votre situation.

Pour plus de détails, consultez cette entrée de blog .

0
claasz

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

vous utilisez le cinquième paramètre et ajoutez "-f" à celui-ci.

Donc, vous utilisez "-f [email protected]" comme paramètre

le gestionnaire de newsletter de phpList utilise ceci pour gérer les rebonds.

Une fois que les rebonds se sont remplis dans la boîte aux lettres, vous pouvez les POP et les traiter. C'est la façon la plus simple de traiter avec eux, plutôt que de les gérer quand ils arrivent.

0
michiel

je n’ai pas eu beaucoup de chance à la recherche d’une solution PHP pour cela, mais j’ai rencontré ce produit qui répond exactement à mes besoins. 

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
Jazzy

Vous pouvez toujours utiliser quelque chose comme http://cloudmailin.com pour transférer les courriels renvoyés sur votre serveur php via http. Toutefois, vous pouvez utiliser un service dédié à l'envoi de courriels et à l'aide de leur API pour récupérer les détails du renvoi. .

0
Steve Smith