Traiter les emails avec php
Posté par le 5 avr 2011 dans PHP • 47 commentairesNous avons vu comment faire du email piping. Tous les emails pour support@votresite.com sont donc maintenant redirigés vers mailpiping.php. Ce fichier devra donc lire ces emails, éventuellement extraire les pièces jointes, et ensuite appliquer un traitement. Vous déciderez plus tard de ce traitement en fonction de vos besoins, mais cet article vous montrera comment récupérer, lire et décoder les emails.
Si vous n'avez pas encore lu comment rediriger les emails / email piping je vous invite à le faire.
Vous pouvez écrire vous-même votre script de lecture/décodage d’emails, mais pour des raisons pratiques, il est préférable de trouver une classe qui effectue ce travail pour vous, et de préférence une classe facile à utiliser, efficace et largement testée. J’ai cherché pour vous, et Pear ::Mail_mimeDecode(http://pear.php.net/package/Mail_mimeDecode) est la classe qu’il nous faut. Pour ceux qui l’ignorent, PEAR est un dépôt de packages PHP réutilisables recouvrant un grand nombre de besoins quotidiens (au point qu’avant d’écrire une application, vérifiez d’abord si elle n’existe pas déjà dans PEAR). La différence de PEAR avec tous les autres dépôts du genre est que les packages n’y sont admis qu’après avoir été soumis à un contrôle qualité et respectés un certain nombre de normes. PEAR est issu de la communauté PHP elle-même, et on peut donc y trouver une certaine fiabilité.
Installer un package PEAR est très facile lorsqu’on est sur un serveur dédié (ça peut être aussi simple que pear install Mail_mimeDecode en ligne de commande, et c’est tout). Sur un hébergement mutualisé ou un WAMP, ça prend un peu plus de temps, mais pas beaucoup. Vous pouvez consulter les pages suivantes pour savoir comment installer PEAR ::mail_mimeDecode.
http://pear.php.net/manual/en/guide.users.commandline.installing.php
http://php.developpez.com/cours/pear/installation/
http://www.zdnet.fr/builder/programmation/technologies_web/0,39021000,39149250-1,00.htm
http://www.6ma.fr/tuto/installer+pear+avec+wamp-455
http://pear.php.net/manual/en/installation.introduction.php
Une fois mime_Decode installé sur votre serveur, vous l’incluez dans le script avec
require_once 'Mail/mimeDecode.php';
Vous récupérez ensuite le contenu de l'email qui a été rerouté vers le script :
$fd = fopen("php://stdin", "r");
$email = "";
while (!feof($fd)) {
$email .= fread($fd, 1024);
}
fclose($fd);
A la première ligne, fopen tente d’ouvrir le flux qu’il reçoit sur son entrée standard (stdin). Ici, c’est le contenu de l’email qui est envoyé vers le flux standard du fichier à travers la redirection. Le deuxième argument, « r », signifie que nous allons ouvrir le flux en lecture seulement.
Nous copions ensuite le contenu du flux, par tranche de 1024 octets dans la variable $email, jusqu’à ce que le flux soit copié intégralement. Nous fermons enfin le flux, puisque nous l’avons désormais copié entièrement dans $email.
$decoder = new Mail_mimeDecode($email);
Nous allons ensuite passer au décodage de l'email proprement dit avec la classe Mime_mailDecode. On lui passe la variable $mail, contenant le contenu brut de l’email, dans son constructeur (si vous ne savez pas ce qu’est un email brut, ouvrez les propriétés d’un email dans votre client de messagerie préféré, ou faites Ctrl-F3 sur Outlook Express/Windows Mail. Notre objectif est de transformer ce texte assez compliqué (très compliqué lorsqu’il y a une ou plusieurs pièces jointes) en texte et fichier utilisable.
$structure = $decoder->decode($params);
Nous appelons ensuite la méthode decode() de Mail_mimeDecode, qui effectue le décodage proprement dit et sépare le contenu brut en plusieurs éléments contenus dans une structure (texte normal, texte HTML, pièces jointes). decode() reçoit en paramètres un tableau qui lui indique ce qu’il doit faire avec le texte brut (voir le code au complet à la fin). Ici, include_bodies indique si le corps du mail doit être inclus dans la structure ; decode_bodies indique si le corps du mail doit être décodé, decode_headers indique si les en-têtes du mail doivent être décodés.
$subject = $structure->headers['subject']; $name = $structure->headers['from']; $message = $structure->parts['0']->body;
Nous récupérons ensuite les éléments contenus dans $structure dans différentes variables afin de pouvoir les utiliser plus facilement. Tous les éléments du mail sont donc maintenant décodés et répartis dans le tableau $structure.
La première ligne récupère l’objet de l’email, la seconde ligne récupère le champ ‘from’ du message, qui comporte le nom de l’expéditeur et/ou son email ; enfin la troisième récupère le message lui-même, qui est le premier élément du tableau parts (d’où l’index zéro).
Nous avons donc déjà récupéré le sujet, l’expéditeur et le message. Reste à voir si l’email comporte des pièces jointes. C’est le rôle de la partie suivante.
foreach ($structure->parts as $part) {
// On va sauvegarder si c'est une pièce jointe
if (isset($part->disposition) && ($part->disposition=='attachment')) {
$file_realname = $part->ctype_parameters['name'];
$pathinfo = pathinfo($part->ctype_parameters['name']);
$file_name = $file_realname;
$fileobject = new SplFileObject($file_name, 'w');
$fileobject->fwrite($part->body);
}
}
Nous excluons d’abord toute autre partie qui ne soit pas une pièce jointe. Nous récupérons ensuite le nom de la pièce jointe, tel que précisé dans l’email brut à la ligne Content-Type et qui est contenu dans le variable ctype_parameters[‘name’] de chaque élément du tableau $structure. Nous créons ensuite un objet SplFileObjet. La classe SplFileObjet permet de manipuler les fichiers en mode programmation par objet. Si vous n’avez qu’une vague idée de la POO, cela veut juste dire qu’avec une seule ligne, nous créons ici un nouveau fichier portant le nom $file_name et on annonce à PHP qu’on va tenter d’y écrire quelque chose. Avec la deuxième ligne, nous écrivons concrètement le contenu de la pièce jointe dans le fichier. La pièce jointe sera alors automatiquement enregistrée dans le même dossier le script. Cette opération sera répétée autant de fois qu’il y a de pièces jointes dans l’email.
A la fin, vous aurez donc d’une part le nom de l’expéditeur (ou son email) et l’objet du message dans les variables $from et $subject respectivement, le message dans la variable $message et les pièces jointes éventuelles seront enregistrées dans le dossier.
Le code complet du script : mailpiping.php
Si vous n’avez pas de serveur mail sous la main, vous pouvez quand même tester ce script en remplaçant le flux entrant (stdin) par le nom d’un fichier texte dans lequel vous aurez copié la source d’un email, de préférence avec une ou plusieurs pièces jointes (Ctrl+F3 sur Outlook Express/Windows Live Mail). Enregistrez le fichier dans le même dossier que le script et ensuite modifiez la ligne suivante :
$fd = fopen("php://stdin", "r");
en
$fd = fopen("fichiercontenantlemail.txt", "r");
Lancez ensuite le script, soit depuis le navigateur s’il est accessible sur le Web, ou par l’exécutable PHP s’il ne l’est pas (en ligne de commande, mettez-vous dans le dossier du script et tapez : php mailpiping.php ). Vous verrez ensuite les pièces jointes apparaître dans le même dossier.
Vous pourrez par la suite étendre ce script de plusieurs manières, comme filtrer les pièces jointes en fonction de leur nature, accepter uniquement les emails provenant d’une liste préétablie d’expéditeurs (white list), envoyer une réponse automatique, etc… Votre imagination et vos besoins sont vos limites !
Autres articles dans la catégorie PHP
- Traiter les emails avec php
- Faire du email piping avec PHP et CPanel
- Présentation de l’interface Iterator de PHP
- Manipulation de répertoires en php avec la SPL
- Géolocalisation IP avec PHP et WordPress
- script php de sauvegarde mysql
- Monitoring de site avec alerte mail et SMS
- Communiquer entre serveurs par requêtes xml
- Une classe php complète pour la détection du navigateur
- 6 fonctions PHP indispensables








Géniale, un script qui li, extraire et traite les Emails!!! je vé certainement essayer ça. Merci pour l’info
c superrrrrr … superrr
Je travaille avec Joomla mais je preffere utilizer dreamweaver et PHP pour me contact forms.
Cela me fait penser au temps de mes études ^^
Maintenant, avec tous les outils en open source, très peu, malheureusement, prennent le temps d’étudier de tes codes …
Merci pour ce script, et bonne journée
très bon tuto et bonne source de packages, je ne connaissais pas PEAR.
Merci
Bravo pour le travail effectué !
Merci pour le partage d’infos, je le mets en test cet après midi et je reviens demain avec des commentaires.
A demain donc !
Bonjour, je débute en php et je suis arrivé à la section « gérer vos envois de mails » ( avec un livre sur le PHP 5 ).
Apparemment vos astuces peuvent se révéler bien sympa à tester. Par contre je ne saisi pas tout. Qu’est que c’est feof ? ( while (!feof($fd)) { ) C’est un booléen ?
Merci pour ces petits scripts php bien pratiques..
Super!
Un grand merci à l’auteur!
Voilà un nouvel outil très intéressant pour nous qui traitant des centaines de mail par jour.
Ouais, ça m’a l’air plutôt intéressant tout ça. Un bon petit script bien pratique.
Si j’ai le temps, je le mets en place ce soir.
Merci beaucoup pour ces scripts qui vont m’être fort utiles. Très beau travail merci
Merci pour les scripts c’est ce que je cherchais depuis une semaine
Ces sont des scriptes pratique et utiles bravo!!:)
Plus que super!!!!lol
Pratique en effet, ça fait gagner quelques précieuses minutes chaque jour !
ca va me facilité la tache merci
Ah enfin! exactement ce que je cherchais
Bon, je n’en ai pas besoin immédiatement, mais à coup sûr cela va me servir dans un avenir proche. Donc je met l’article dans ma poche et je retweet…
Pareil je me suis emmerdé pas possible avec ça et c’est maintenant que je tombe dessus ! Ton site avait qu’a être mieux référencé merde !
En tout cas merci c’est cool je vais tout revoir maintenant !
Purée c’est excellent ! Merci pour ces infos très précieuses !!!
Le tuto est assez ludique, le problème étant les évolutions et les nouvelles versions, sont-elles compatibles par la suite? php4, php5
Je fais attention avant de toucher le code comme ça.
David.
Vous les Francais, vous avez du boulot a faire! Il va faloir que vous parliez englais pour coder dans le PHP. ahahhaha.
Merci pour ce tuto et ces scripts très précieux. Vraiment du bon boulot.
Merci, c’est super pour un début en PHP!
heu…bonjour…est ce que ce site est encore utilisé ? ou est il en stand by ?
Car les infos sont intéressantes, non ?
Mici ^^
Il est difficile de trouver des gens compétents sur ce sujet, mais vous parlez comme vous savez ce que vous parlez! Merci
Merci pour le code et le petit tutoriel, je n’ai pas encore besoin de cette article pour le moment, mais c’est sure à 100% que j’en aurai besoin tôt ou tard, donc je bookmark la page
Ah merci, c’est le genre d’information dont j’ai besoin. Super le code accompagné du tutto sans lequel je me serais perdu!
Pour ceux que ça intéresse on peut également parcourir les emails dans une base de données (si vous les avez stocker ainsi bien sur) :
$base = mysql_query(« SELECT email FROM base_mails LIMIT 0, 1800″);
$i = 1;
while ($data = mysql_fetch_assoc($base)) {
//email
$data['email'];
//Traitement…
//Timer
sleep(2);
$i++;
}
Merci pour ce tuto et ce code. Cela va me servir très prochainement dans ma vie professionnelle.
Je me suis fait une petite classe pour envoyer un mail, mais je ne savais pas qu’il existait déjà des classes pour lire/écrire facilement des mails. Dommage pour moi ! Merci en tout cas j’ai mis cet article en favoris pour un futur projet.
Merci pour le tuto qui est bien utile, je cherche en ce moment même à faire un script php qui envoi un mail avec une pièce jointe, et c’est pas évident
Je le trouve très utile ce tuto
Géniale le tuto, merci, le php c’est la vie!
Merci, la solution simplifie bien la vie avec les mails qui arreivnt de plein de sources différentes.
Excellent article !
C’est une technique intéressante qui va grandement me faciliter la tâche.
Merci pour l’article, c’est très bien expliqué et c’est toujours bon de savoir que cela existe.
Site agréable et complet, ca peut être très intéressant si on a déjà énormément de client.
Bonjour, je ne connaissais pas cette alternative, je vais voir ce que ça donne…en espérant ne pas avoir trop de mal à paramétrer tout ce bazard!
exactement ce que je cherchais, merci pour cette information et bonne continuation
Cette classe a des problèmes avec les accents
Merci bien pour toutes ces infos, je sens que ça va m’être très utile !
Merci pour ton article. Si je peux me permettre, il y a une classe très bien fichu qui s’appelle phpmailer. Pour les débutants en PHP, elle est peut être plus adaptée.
Merci pour ce script que je viens de mettre en place sur le site d’un client, ca marche impec’
Trés bon merci,
pratique pour mettre en place l’automatisation du traitement de mes mails.
Yes un grand merci pour ce script ! Marche niquel ! Ca faisait 1h que je bataillais à trouver quelque chose de correct sur google
Super le script, merci beaucoup. je vais mettre ça en place.