Aller au contenu

RegExp et Bounce...


Sujets conseillés

Posté

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

Posté

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];
}
?>

Posté

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];
}
}
//...
}
}

Posté

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 its
recipients. 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

Posté

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 its
recipients. 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 !

Posté

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

Posté

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 its
recipients. 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];
}

Posté

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.

Posté

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

Posté


$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 )

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...