Portekoi Posté 22 Février 2012 Posté 22 Février 2012 Bonjour, J'essaie d'utiliser une classe qui gère les bounces (erreur de mail) Dedans, il y a ce genre de chose : /* * rule: mailbox unknow; * sample: * Delivery to the following recipients failed. * xxxxx@yourdomain.com */ elseif (preg_match ("/delivery[^\n\r]+failed\S*\s+(\S+@\S+\w)\s/is",$body,$match)) { $result['rule_cat'] = 'unknown'; $result['rule_no'] = '0013'; $result['email'] = $match[1]; } Et moi, lorsqu'un mail me revient en erreur, j'ai ceci : his message was created automatically by mail delivery software. A message that you sent could not be delivered to one or more of its recipients. The following addresses failed: <fsdfsdfs46sd4f6s4dfs@gmail.com> Etant une grosse quiche en RegExp, j'aurai besoin d'un coup de main... Merci Portekoi
Portekoi Posté 22 Février 2012 Auteur Posté 22 Février 2012 Tant qu'on y est : Pourquoi cela ne fonctionne pas ça? <?Php$body = "Delivery to the following recipients failed.\n\r";$body .= "xxxxx@yourdomain.com";$match = "";if (preg_match ("/delivery[^\n\r]+failed\S*\s+(\S+@\S+\w)\s/is",$body, $macth)) { echo "Erreur"; echo "\r\n" . $macth[1]; }?>
SStephane Posté 22 Février 2012 Posté 22 Février 2012 voici la méthode inachevée d'une de mes classes qui gère ça si ça peut te mettre sur la voie : $this->message est un Zend_Mail_Message mais ca se transpose (ZF v1.1) class LigamsBounceHandler {//... /** * @var \Zend_Mail_Message */ private $message; public function __construct($message) { $this->message = $message; } function isBounce() { if(isset($this->bBounce)) return $this->bBounce; try { $this->subject = $this->message->getHeader('Subject'); if (preg_match("/(mail delivery failed|failure notice|warning: message|delivery status notif|delivery failure|delivery problem|spam eater|returned mail|undeliverable|returned mail|delivery errors|mail status report|mail system error|failure delivery|delivery notification|delivery has failed|undelivered mail|returned email|returning message to sender|returned to sender|message delayed|mdaemon notification|mailserver notification|mail delivery system|nondeliverable mail|mail transaction failed)|auto.{0,20}reply|vacation|(out|away|on holiday).*office/i", $this->subject)) $this->bBounce = true; if ($this->message->headerExists('precedence') && preg_match('/auto_reply/', $this->message->getHeader('Precedence'))) $this->bBounce = true; if (preg_match("/^(postmaster|mailer-daemon)\@?/i", $this->message->getHeader('From'))) $this->bBounce = true; } catch(Zend_Mail_Exception $e) { print ($e->getMessage()); } if(!isset($this->bBounce)) $this->bBounce = false; return $this->bBounce; } //... function getStatusCode() { if($this->isBounce() || $this->isFeedbackLoop()) { if (preg_match('@Status:\s*([45]\.\d\.\d)@i', $this->message->getContent(), $matches)) { return $matches[1]; } } //... }}
Portekoi Posté 22 Février 2012 Auteur Posté 22 Février 2012 Merci pour ta réponse mais je préfèrerais garder la class que tu m'as conseillée (Phpmailer BMH) Pour le code : <?Php$body = "Delivery to the following recipients failed.\n\r";$body .= "xxxxx@yourdomain.com";$match = "";if (preg_match ("/delivery[^\n\r]+failed\S*\s+(\S+@\S+\w)\s/is",$body, $macth)) { echo "Erreur"; echo "\r\n" . $macth[1]; }?> Le dernier \s était en trop... j'ai créé celui ci mais... marche pas. J'aimerais que, si je trouve "automatically" et "delivery" dans "$body", je puisse récupérer le mail... $body = "This message was created automatically by mail delivery software.A message that you sent could not be delivered to one or more of itsrecipients. This is a permanent error. The following address(es) failed: qsddqsds46468787qdsqdsq@hotmail.com";if (preg_match ("/automatically\s[^\n\r]+delivery\s+(\S+@\S+\w)/is",$body,$match)) {echo "<br> 2 - " . $match[1];} Mais je trouve pas mon erreur.... Portekoi
SStephane Posté 23 Février 2012 Posté 23 Février 2012 En fait, chaque système de mail te renvoi un peu ce qu'il souhaite, c'est là qu'est l'os (-yapu d'hélice-). Aussi, je te conseille vivement de découper ta classe et de définir des regex dans des fichiers de configuration. Ceci à part, s'il s'agit d'une newsletter, ajoute un return-path, ainsi, tu pourras considérer que l'immense majorité des retours à cette adresse sont des bounces. Pour en revenir à ton souci, je pense que tu ne considères pas les sauts de ligne après delivery : $body = "This message was created automatically by mail delivery software.A message that you sent could not be delivered to one or more of itsrecipients. This is a permanent error. The following address(es) failed: qsddqsds46468787qdsqdsq@hotmail.com";if (preg_match ('/automatically\s[^\n\r]+delivery\s+(.*)?(\S+@\S+\w)/is',$body,$match)) {echo "<br> 2 - " . $match[1];} Mais je te déconseille néanmoins ta méthode, tu vas galérer, commence par traiter les entêtes, tu as énormément de chose à exploiter à ce niveau !
Portekoi Posté 23 Février 2012 Auteur Posté 23 Février 2012 Bonjour, Qu'appelles tu les entêtes? S'il s'agit de ceci : Return-path: <noreply@mondomaine.com> Received: from localhost ([127.0.0.1] helo=mondomaine.com) by ns220280.ovh.net with esmtpa (Exim 4.77) (envelope-from <noreply@mondomaine.com>) id 1S0Cws-0007U3-6l for sqdd4646qsdqsdqsd@yahoo.com; Wed, 22 Feb 2012 15:13:38 +0100 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Date: Wed, 22 Feb 2012 15:13:38 +0100 From: noreply@mondomaine.com To: <sqdd4646qsdqsdqsd@yahoo.com> Subject: qsdqsdsqd Message-ID: <b6a2943906c777d8c19b8ea79d35f62e@mondomaine.com> X-Sender: noreply@mondomaine.com User-Agent: Roundcube Webmail/0.7.1 Le problème est qu'ils varient suivant le serveur d'envoi du mail et que j'ai besoin d'une solution qui marche sur différents configurations. Je pense que c'est pour cela que la class de PhpMailer BMH s'appuie sur le contenu du haut et non les entêtes. Portekoi
Portekoi Posté 23 Février 2012 Auteur Posté 23 Février 2012 Et merci pour ton code, il m'a servi d'exemple $body = "This message was created automatically by mail delivery software.A message that you sent could not be delivered to one or more of itsrecipients. This is a permanent error. The following address(es) failed: qsddqsds46468787qdsqdsq@hotmail.com";if (preg_match ('/automatically\s[^\n\r]+delivery\s+(.*)\s+(\S+@\S+\w)/is',$body,$match)) {echo "<br> 2 - " . $match[2];}
SStephane Posté 23 Février 2012 Posté 23 Février 2012 Dans le mail que tu envois (avant de récupérer un bounce), ajoute des headers du genre : reply-to : envoyeur@domain.com return-path: le_mail_qui_gere_les_bounces@domain.com le_mail_qui_gere_les_bounces@domain.com recevra les bounces (mais pas tous). Ce que je veux dire, c'est que tu as 2 headers à exploiter prioritairement avant le corps du mail : subject et from par exemple (si subject ou from contient mailer-daemon par exemple). Ensuite, tu peux éventuellement t'attaquer au body si tu penses qu'un mail est un bounce et qu'il n'est pas reconnu comme tel en le parsant comme tu le fait. Si ton mail est reconnu comme bounce après tes tests, tu peux tenter de déterminer de quel type de bounce il s'agit selon le status de retour généralement indiqué dans le mail (objet de la 2e méthode que j'ai mise dans ma classe) : http://tools.ietf.org/html/rfc3463 Je ne sais pas ce que ce parser vaut, mais il a l'air plus récent : http://search.cpan.org/~mstevens/Mail-DeliveryStatus-BounceParser-1.530/ Celui que j'ai fait s'inspire un peu de tout, mais il est greffé à ZF, du coup c'est moins évident.
Portekoi Posté 23 Février 2012 Auteur Posté 23 Février 2012 Merci pour ta réponse Pour le return-path, j'ai eu du mal à trouver comment le spécifier. En faites, il fallait ajouter "-f noreply@mondomaine.com" en 5ième argument de la fonction mail. Je vais voir tout ça. Merci
SStephane Posté 23 Février 2012 Posté 23 Février 2012 $headers = "From: $from\r\n";$headers.="Return-Path:<name@example.com>\r\n";mail('machin@machin.com','foo','bar', $headers); attention quand tu testes si tu utilises la fonction mail() (cf doc : L'en-tête From définit également l'en-tête Return-Path sous Windows )
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant