TUTORIEL PHP 
Conception d'un client de messagerie IMAP (1)
Dans cette approche des fonctions IMAP de PHP sont abordés le téléchargement et l'affichage des e-mails du serveur. (05/05/2005)
  Présentation et mise en place | Le coeur du code

PHP est connu pour présenter par défaut un grand nombre de fonctions permettant de gérer directement les développements Web les plus courants. L'e-mail ne fait pas défaut. Si la plupart des développeurs PHP ont déjà rencontré la fonction mail() (ne serait-ce que pour passer outre les limitations d'un hébergeur), certains ne ce sont pas penchés de l'autre côté du miroir, là où PHP peut recevoir des messages via les protocoles habituels.

Mise en place et présentation
Par ses fonctions IMAP, PHP peut donc gérer le quotidien de l'e-mail -la gestion plus avancée requérant cependant l'utilisation de fonctionnalités adéquates, via les bibliothèques Mail de PEAR. Notre petite application utilise majoritairement les fonctions internes de PHP, ne faisant appel à PEAR que pour la gestion des types MIME. Les fonctions IMAP ne sont pas toujours disponibles par défaut, mais il suffit la plupart du temps de décommenter (ou d'ajouter) "extension=php_imap.dll" dans la section Extension du fichier php.ini pour y avoir accès (à vérifier via un phpinfo()).

Pour ce qui est de PEAR, nous n'utiliserons que Mail/mimeDecode.php, mais installer l'ensemble des extensions Mail ne peut pas faire de mal si l'on souhaite pousser ses recherches plus loin.

Notre application commence donc de la manière la plus simple qui soit : voir s'il y a des nouveaux messages sur le serveur, si oui les télécharger et les afficher dans un tableau. Le tableau n'affichera que date, auteur et titre, le contenu du message étant caché via CSS et affiché par un script JavaScript lancé en cliquant sur le titre.

Le code
La première chose à faire est de définir le compte e-mail à accéder (nous utilisons ici le protocole POP3), de s'y connecter et de voir le nombre de messages. Nous introduisons également l'appel au module Mail::mimeDecode, donc nous nous servirons bientôt, et nous en profitons pour mettre en place quelques-unes des options qui y sont rattachées.

$boite = "INBOX";
$serveur_entrant = "pop.domaine.com";
$port = ":110";
$protocole = "/pop3/notls";
$identifiant = "borderie%domaine.com";
$mot_de_passe = "LikeIdTellYou";

if ($mail_cnx = imap_open ("{".$serveur_entrant.$port.$protocole."}".$boite, $identifiant, $mot_de_passe) ) {
  $nbr_mails = imap_num_msg($mail_cnx);
  echo "Messages dans votre B.A.L. : ".$nbr_mails."<br />";
  }
else {
  ?>Et non !<?
  }

require_once("Mail/mimeDecode.php");
$mimeParams = array();
$mimeParams['decode_headers'] = true;
$mimeParams['crlf'] = "\r\n";
$mimeParams['include_bodies'] = true;
$mimeParams['decode_bodies'] = true;


Les options de tableau $mimeParams définissent ici certains traitements que mimeDecode doit appliquer au message en cours de lecture : décoder les entêtes, reconnaître les retours à la ligne, décoder le corps...

Dès lors que $mail_cnx est vrai, on peut continuer à y travailler. On va commencer à afficher à l'utilisateur le nombre de mail dont il dispose, et profiter de cette valeur qui nous est donnée pour lancer une boucle for() qui lira chaque e-mail l'un après l'autre, recueillant les informations nécessaires en passant. Ces informations consistent principalement en les en-têtes des messages, mais également son corps qui doit être analysé et traité (notamment dans le cas où se trouve un fichier dans l'e-mail).

Voici le code par ordre d'apparition :

  if ($nbr_mails == 0) {
    echo "Pas de nouveau mail<br />\n";
    }
  else {
    for ($i = 1; $i <= $nbr_mails; $i++) {
      $fichier = "";
      $header = imap_fetchheader($mail_cnx, $i, FT_PREFETCHTEXT);
      $body = imap_body($mail_cnx, $i, FT_PEEK);
      $mimeParams['input'] = $header.$body;
      $message = Mail_mimeDecode::decode($mimeParams);


Dès qu'il y a au moins un message, la boucle for() se lance et parcourt la liste. $fichier est une chaîne pour le moment vide qui nous permettra dans le cas d'un fichier de l'indiquer à l'utilisateur. $header est un chaîne contenant l'en-tête du message, à savoir sa date, son auteur, son sujet et tant d'autres jolies choses. $body, de son côté, contient le corps brut de l'e-mail, qu'il nous faudra traiter. Ayant récupéré ces deux chaînes, nous pouvons construire la dernière option $mimeParams, regroupant en-têtes et corps. Tout ceci est traité par la fonction decode(), et placé dans la variable $message. C'est de celle-ci que tous les nouveaux traitements partiront maintenant.

  Présentation et mise en place | Le coeur du code
 
Xavier Borderie, JDN Développeurs
 
Accueil | Haut de page
 
 





Quand achetez-vous le plus en ligne ?
Du lundi au vendredi
Le samedi
Le dimanche

Tous les sondages