23 votes

Gestion des courriers rebondis en PHP - Des solutions récentes ?

J'ai besoin d'effectuer un traitement du courrier rebondi en utilisant PHP. Parcourir les e-mails n'est pas un problème, mais investir des ressources dans l'écriture de notre propre bibliothèque pour analyser les e-mails renvoyés n'est pas souhaitable.

Il y a 3 solutions PHP que j'ai trouvées qui sont supposées traiter le courrier rebondi, mais elles sont toutes dépassées et ne sont plus maintenues, d'après ce que j'ai pu voir. (PHPList, PHPMailer-BMH, Bounce Handler @ PHPClasses.org)

Quelqu'un connaît-il un ensemble de règles actualisées pour le traitement des courriers électroniques rebondis ? Je n'ai pas nécessairement besoin d'une logique de traitement, même un simple ensemble de règles à jour serait satisfaisant.

Merci de votre aide.

28voto

hakre Points 102271

La gestion des rebonds n'est pas triviale, car vous devez gérer un grand nombre de serveurs et de réponses différents. Cela inclut les serveurs mal configurés et les rebonds dus au fait que votre adresse e-mail/hôte/IP a été mise sur liste noire ou classée dans la catégorie des spams. Et il y a des tonnes de rebonds à cause de réponses automatiques "hors du bureau".

Une solution simple consiste à insérer dans le message des en-têtes propres qui identifient l'adresse du destinataire et l'envoi concret (un jeton). Lorsque le message est renvoyé, le renvoi peut être vérifié sur la base de cette information.

Une autre solution consiste à encoder des informations supplémentaires dans l'adresse de l'expéditeur et à l'analyser en conséquence en cas de rebond. Pour cela, vous devez connaître le fonctionnement du courrier électronique, ce qui est généralement utile si vous avez besoin de bounces.

Il y a une excellente réponse ici sur SO (mais je ne l'ai pas trouvée pour cette réponse) qui donne de nombreux détails sur le sujet. Si je la trouve, je l'ajouterai.

Le point général est que je ne connais pas beaucoup d'outils basés sur PHP pour gérer les bounces, je sais que PHPList (composants PHP pour la gestion des listes de diffusion) a quelque chose dans son dépôt :

Editer : La question connexe dont la réponse est très instructive est la suivante :

Editer : Ce n'est pas grand-chose, juste quelques liens :

Je me demande pourquoi il n'existe pas de norme en matière de rebond d'e-mails qui vous permette d'identifier facilement les rebonds et leur motif - ou existe-t-il une telle norme ? (comme un RFC)

Il y a RFC3834 - Recommandations pour les réponses automatiques au courrier électronique qui sont mises à jour par Mécanisme de notification du tamis RFC5436 : mailto .

Le rebond est également abordé en partie dans RFC5321 Protocole de transfert de courrier simple qui indique clairement la raison pour laquelle un MTA doit signaler qu'un message ne peut pas être délivré.

Le principal problème est que l'adresse de rebond (l'expéditeur) ne peut pas être vérifiée dans le SMTP, de sorte que l'envoi d'un message de rebond comporte le problème qu'il est probablement destiné à une mauvaise personne (spam par rétrodiffusion).

Un expéditeur fiable ne se contente donc pas de vérifier s'il y a des rebonds, mais en fait plus avec le SMTP pour obtenir un certain niveau de qualité, voir :

L'ensemble de la page Wikipédia de la Rapport de non livraison pourrait être intéressant pour un premier aperçu de l'image.

14voto

iWantSimpleLife Points 1533

Voici comment j'ai procédé une fois. Cette méthode permet de capturer au moins plus de 70 % des courriers indésirables de manière constante.

Dans les courriels envoyés, insérer un en-tête personnalisé (comme "x-email-check-id") pour avoir un identifiant unique pour chaque courriel envoyé (peut-être créer un GUID et le stocker dans la base de données pour chaque courriel).

Du côté du serveur, écrivez une tâche cron pour télécharger périodiquement les courriels provenant de l'adresse de rebond, et recherchez cet en-tête dans le message de réponse. De cette façon, vous pouvez faire correspondre l'e-mail de rebond avec l'e-mail envoyé. De cette manière, vous pouvez établir que cet e-mail a été renvoyé et qu'il ne s'agit pas d'un spam.

Ensuite, recherchez des mots-clés spécifiques dans le contenu de l'e-mail afin de déterminer la raison du rebond. Cette liste de mots-clés doit être mise à jour régulièrement, car les nouveaux serveurs de messagerie renvoient des textes différents. Mais voici la liste que j'ai utilisée.

$Email__Full[] = 'databytes limit';
$Email__Full[] = 'exceeded dropfile size';
$Email__Full[] = 'exceeded email quota';
$Email__Full[] = 'exceeded storage';
$Email__Full[] = 'exceeding receiving limits';
$Email__Full[] = 'exceeds the maximum size';
$Email__Full[] = 'folder is full';
$Email__Full[] = 'mail system full';
$Email__Full[] = 'mailbox exceeds allowed size';
$Email__Full[] = 'mailbox full';
$Email__Full[] = 'mailbox has exceeded the limit';
$Email__Full[] = 'mailbox is full';
$Email__Full[] = 'mail box full';
$Email__Full[] = 'out of disk space';
$Email__Full[] = 'out of diskspace';
$Email__Full[] = 'over disk quota';
$Email__Full[] = 'over quota';
$Email__Full[] = 'over the allowed quota';
$Email__Full[] = 'problem with the recipient\'s mailbox';
$Email__Full[] = 'quota exceeded';
$Email__Full[] = 'quota violation';
$Email__Full[] = 'space has been used up';
$Email__Full[] = 'space not enough';
$Email__Full[] = 'status: 5.2.1';
$Email__Full[] = 'status: 5.2.2';
$Email__Full[] = 'status: 5.2.3';
$Email__Full[] = 'status: 5.3.3';

$Email__NotExist[] = '/var/mail/nobody';
$Email__NotExist[] = '550 5.1.1';
$Email__NotExist[] = 'account expired';
$Email__NotExist[] = 'account inactive';
$Email__NotExist[] = 'account suspended';
$Email__NotExist[] = 'address is administratively disabled';
$Email__NotExist[] = 'address is not recognized';
$Email__NotExist[] = 'address is rejected';
$Email__NotExist[] = 'address not recognized';
$Email__NotExist[] = 'address rejected';
$Email__NotExist[] = 'bad destination email address';
$Email__NotExist[] = 'cname lookup failed';
$Email__NotExist[] = 'connection refused';
$Email__NotExist[] = 'couldn\'t find any host';
$Email__NotExist[] = 'could not be found';
$Email__NotExist[] = 'deactivated mailbox';
$Email__NotExist[] = 'delivery time expired';
$Email__NotExist[] = 'destination server not responding';
$Email__NotExist[] = 'disabled or discontinued';
$Email__NotExist[] = 'does not exist';
$Email__NotExist[] = 'does not like recipient';
$Email__NotExist[] = 'doesn\'t have a yahoo.com account';
$Email__NotExist[] = 'doesn\'t have a yahoo.com.sg account';
$Email__NotExist[] = 'domain is for sale';
$Email__NotExist[] = 'find a mail exchanger';
$Email__NotExist[] = 'find any host named';
$Email__NotExist[] = 'following address(es) failed';
$Email__NotExist[] = 'host unknown';
$Email__NotExist[] = 'i couldn\'t find any host by that name';
$Email__NotExist[] = 'illegal user';
$Email__NotExist[] = 'in the queue too long';
$Email__NotExist[] = 'inactive recipient';
$Email__NotExist[] = 'inactive user';
$Email__NotExist[] = 'incorrectly addressed';
$Email__NotExist[] = 'invalid recipient';
$Email__NotExist[] = 'invalid user';
$Email__NotExist[] = 'isn\'t in my control/locals file';
$Email__NotExist[] = 'mailbox not available';
$Email__NotExist[] = 'mailbox not found';
$Email__NotExist[] = 'mailbox unavailable';
$Email__NotExist[] = 'mail is looping';
$Email__NotExist[] = 'message is looping';
$Email__NotExist[] = 'name is not recognized';
$Email__NotExist[] = 'name not found';
$Email__NotExist[] = 'name not recognized';
$Email__NotExist[] = 'no local mailbox';
$Email__NotExist[] = 'no longer accepts mail';
$Email__NotExist[] = 'no longer an employee';
$Email__NotExist[] = 'no longer on server';
$Email__NotExist[] = 'no longer valid';
$Email__NotExist[] = 'no mailbox';
$Email__NotExist[] = 'no route found to domain';
$Email__NotExist[] = 'no such user';
$Email__NotExist[] = 'none of the mail servers for the destination domain has so far responded';
$Email__NotExist[] = 'no valid host';
$Email__NotExist[] = 'no valid recipients';
$Email__NotExist[] = 'not a valid mailbox';
$Email__NotExist[] = 'not listed';
$Email__NotExist[] = 'not listed in domino';
$Email__NotExist[] = 'possible mail loop';
$Email__NotExist[] = 'recipient cannot be verified';
$Email__NotExist[] = 'recipient unknown';
$Email__NotExist[] = 'recipients are invalid';
$Email__NotExist[] = 'recipnotfound';
$Email__NotExist[] = 'relaying denied';
$Email__NotExist[] = 'several matches found in domino';
$Email__NotExist[] = 'status: 5.1.1';
$Email__NotExist[] = 'status: 5.1.3';
$Email__NotExist[] = 'status: 5.1.4';
$Email__NotExist[] = 'status: 5.1.6';
$Email__NotExist[] = 'status: 5.1.7';
$Email__NotExist[] = 'this user doesn\'t have a yahoo';
$Email__NotExist[] = 'too many hops';
$Email__NotExist[] = 'unable to deliver';
$Email__NotExist[] = 'unable to relay';
$Email__NotExist[] = 'unknown address';
$Email__NotExist[] = 'unknown recipient';
$Email__NotExist[] = 'unknown user';
$Email__NotExist[] = 'unrouteable address';
$Email__NotExist[] = 'user doesn\'t have';
$Email__NotExist[] = 'user unknown';
$Email__NotExist[] = 'x-notes; 550 5.1.1';
$Email__NotExist[] = 'x-notes; recipient\'s domino directory';
$Email__NotExist[] = '$B%G%#%l%/%H%j$K$O8+$D$+$j$^$;$s!#'; //* Returned from japanese domino . Somehow means directory is not found.

$Email__Banned[] = '_spam_';
$Email__Banned[] = '550 5.7.1';
$Email__Banned[] = '550 access denied';
$Email__Banned[] = '550 no thanks';
$Email__Banned[] = '550 spam';
$Email__Banned[] = '554 5.7.0';
$Email__Banned[] = '554 5.7.1';
$Email__Banned[] = '554 denied';
$Email__Banned[] = '554 message does not conform to standards';
$Email__Banned[] = '554 message refused';
$Email__Banned[] = '571 message Refused';
$Email__Banned[] = 'activated my anti-spam features';
$Email__Banned[] = 'administrative prohibition';
$Email__Banned[] = 'appears to contain uce/spam';
$Email__Banned[] = 'appears to be spam';
$Email__Banned[] = 'appears to be unsolicited';
$Email__Banned[] = 'banned for spamming';
$Email__Banned[] = 'blackholed by uribl.com';
$Email__Banned[] = 'blacklisted by surbl';
$Email__Banned[] = 'blocked by filter';
$Email__Banned[] = 'blocked by kbas system';
$Email__Banned[] = 'blocked by our content filter';
$Email__Banned[] = 'blocked by spamsssassin';
$Email__Banned[] = 'blocked by the recipient';
$Email__Banned[] = 'blocked by user\'s personal blacklist';
$Email__Banned[] = 'blocked due to spam like qualities';
$Email__Banned[] = 'blocked using spam pattern';
$Email__Banned[] = 'blocked using uceprotect';
$Email__Banned[] = 'body part contains disallowed string';
$Email__Banned[] = 'classified as **spam**';
$Email__Banned[] = 'content blacklist';
$Email__Banned[] = 'content filter rejected the message';
$Email__Banned[] = 'consider the message to be spam';
$Email__Banned[] = 'considered spam';
$Email__Banned[] = 'contains spam';
$Email__Banned[] = 'content filter rejection';
$Email__Banned[] = 'content rejected';
$Email__Banned[] = 'denied by policy';
$Email__Banned[] = 'detected your message as spam';
$Email__Banned[] = 'does not accept UCE';
$Email__Banned[] = 'domain is banned';
$Email__Banned[] = 'email abuse detected';
$Email__Banned[] = 'error 553';
$Email__Banned[] = 'help_spam_16.htm';
$Email__Banned[] = 'high on spam scale';
$Email__Banned[] = 'http://www.google.com/mail/help/bulk_mail.html';
$Email__Banned[] = 'http://www.surbl.org/lists.html';
$Email__Banned[] = 'identified as spam';
$Email__Banned[] = 'identified your message as spam';
$Email__Banned[] = 'listed in multi.surbl.org';
$Email__Banned[] = 'looks like spam';
$Email__Banned[] = 'mail rejected by windows live hotmail for policy reasons';
$Email__Banned[] = 'message bounced by administrator';
$Email__Banned[] = 'message content rejected, ube';
$Email__Banned[] = 'message contains a virus or other harmful content';
$Email__Banned[] = 'message has too high spam probability';
$Email__Banned[] = 'message is blacklisted';
$Email__Banned[] = 'message refused';
$Email__Banned[] = 'no spam here';
$Email__Banned[] = 'not accepted here';
$Email__Banned[] = 'not in the whitelist';
$Email__Banned[] = 'not rfc compliant';
$Email__Banned[] = 'permanently rejected message';
$Email__Banned[] = 'policy violation';
$Email__Banned[] = 'refused mail service';
$Email__Banned[] = 'reject spam mail';
$Email__Banned[] = 'reject the mail';
$Email__Banned[] = 'rejected by filter';
$Email__Banned[] = 'rejected as spam';
$Email__Banned[] = 'rejected by 35 antiSpam system';
$Email__Banned[] = 'rejected by antispam system';
$Email__Banned[] = 'rejected by cloudmark anti-spam';
$Email__Banned[] = 'rejected by our Spam Filter';
$Email__Banned[] = 'rejected by spam filtering';
$Email__Banned[] = 'rejected by surbl';
$Email__Banned[] = 'rejected by the anti-spam system';
$Email__Banned[] = 'rejected due to security policies';
$Email__Banned[] = 'rejected for policy reasons';
$Email__Banned[] = 'rejected for spam';
$Email__Banned[] = 'requires that you verify';
$Email__Banned[] = 'scored as spam';
$Email__Banned[] = 'sender address verification';
$Email__Banned[] = 'sender was rejected';
$Email__Banned[] = 'spam detected by spamassassin';
$Email__Banned[] = 'spam filter pattern';
$Email__Banned[] = 'spam-like characteristics';
$Email__Banned[] = 'spam mail detected';
$Email__Banned[] = 'spam mail refused';
$Email__Banned[] = 'spam message was blocked';
$Email__Banned[] = 'spam rejected';
$Email__Banned[] = 'spam score too high';
$Email__Banned[] = 'status: 5.7.1';
$Email__Banned[] = 'support.proofpoint.com';
$Email__Banned[] = 'suspected spam';
$Email__Banned[] = 'suspicious url in message body';
$Email__Banned[] = 'temporarily deferred';
$Email__Banned[] = 'transaction failed';
$Email__Banned[] = 'unacceptable content';
$Email__Banned[] = 'unacceptable mail content';
$Email__Banned[] = 'unsolicited bulk e-mail';
$Email__Banned[] = 'unsolicited bulk email';
$Email__Banned[] = 'unsolicited email is refused';
$Email__Banned[] = 'validate recipient email';
$Email__Banned[] = 'will be deleted from queue';

$Email__OutOffice[] = 'away for a vacation';
$Email__OutOffice[] = 'away from the office';
$Email__OutOffice[] = 'not in office';
$Email__OutOffice[] = 'on leave';
$Email__OutOffice[] = 'on vacation';
$Email__OutOffice[] = 'out of office';
$Email__OutOffice[] = 'out of the office';

2voto

encodes Points 660

Il est plus facile que vous ne le pensez d'écrire cela vous-même.

Il suffit de définir le chemin de rebond dans les en-têtes. Ensuite, vous configurez cette adresse électronique pour qu'elle exécute un script de traitement. Vous devez évidemment envoyer une forme d'identification de l'utilisateur.

J'ai déjà utilisé PHPList et je le trouve très bien, il y a de meilleurs services pour faire ce dont vous avez besoin mais il est évident qu'ils ont un coût.

Les rebonds se produisent lorsque l'adresse n'existe pas ou que le serveur de messagerie la renvoie. Certains serveurs de messagerie ne répondent pas (par mesure de sécurité), de sorte que la précision n'est pas optimale.

Un grand nombre de bibliothèques standard offrent des fonctions supplémentaires. déterminer quels liens ont été cliqués et par qui déterminer qui a lu l'e-mail, etc.

Ces objectifs sont faciles à atteindre mais nécessitent des ressources.

Faites-moi savoir si vous avez besoin d'aide pour autre chose.

2voto

neokio Points 2461

Après n'avoir trouvé aucune réponse simple à cette question, j'ai trouvé cette excellente solution sur github :

https://github.com/cfortune/PHP-Bounce-Handler

1voto

preinheimer Points 3227

Je suis un grand fan de la bibliothèque ezComponents, qui comprend un composant Mail qui peut gérer à la fois l'envoi et l'analyse du courrier (ainsi que la connexion à votre MTA pour le récupérer). http://ezcomponents.org/docs/tutorials/Mail#mail-parsers

En lisant la documentation, il semble qu'il devrait être à la hauteur de votre tâche.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X