TUTORIEL PHP 
Conception d'un client de messagerie IMAP (6e partie)
Nouvel apport à notre lecteur : une méthode pour gérer l'affichage, enclencher le HTML quand cela est possible ou le format texte par défaut. (25/07/2006)
Nous arrivons à la cinquième partie de notre série d'articles sur la mise en place d'un lecteur de mail IMAP. Lors de notre dernier volet (lire l'article du 25/11/05), nous étions parvenus à isoler les différentes parties de notre e-mail, et à reconnaître et afficher les images contenues dans le mail. Il nous restait à décoder et afficher correctement le corps de ce mail, ce que nous allons faire ici.

En l'état actuel du code, notre programme affiche toutes les sections du mail dans l'ordre où il les trouve. Ainsi, s'il s'agit d'une newsletter avec images liées dans son code HTML, notre lecteur affichera le mail en texte seul, puis en HTML tout à fait correct. S'il s'agit d'un mail en texte seul avec deux images liées, il affichera ce texte, puis chacune des images telles quelles (sans changement de taille). S'il s'agit d'un mail en HTML contenant une image liée au mail, il affichera le mail en texte seul, puis l'image du HTML encodée en base64, puis les autres images liées telles quelles.

Afficher les parties lisibles
La première modification à faire sera donc, lorsque le mail à plusieurs partie, d'afficher la plus lisible. Par exemple, n'afficher le texte seul que dans les cas où il n'y a pas de partie en HTML.

  Forum

Réagissez dans les forums de JDN Développeurs

Notre fonction affichage(), qui prend en charge l'affichage du contenu du mail, se contente pour l'heure d'explorer le fichier mail, et d'afficher ce qu'il y découvre au fur et à mesure de sa progression. Pour mettre en place un ordre de priorité d'affichage (par exemple, "l'affichage du HTML est plus important que celui du texte seul"), il nous faut, plutôt que d'afficher directement lors de la progression, récupérer les types de contenus, et déterminer lequel afficher.

Lors de notre récupération du fichier mail, nous récupérons déjà le nombre de parties de celui-ci, afin de les retrouver correctement. Nous allons y ajouter un fonction get_subtypes() qui, à partir du tableau de ces parties et de leur nombre, permet de créer un petit tableau contenant uniquement les types des parties. On la placera directement après la récupération du nombre de parties (cf. nos articles précédents).
  1. function get_subtypes($parts, $nbr) {
  2.   $i=0;
  3.   while ($i < $nbr) {
  4.     $types[$i] = $parts[$i]->subtype;
  5.     $i++;
  6.     }
  7.   return $types;
  8.   }
Nous disposons ainsi du tableau contenant, par exemple, à la clef 0 le type PLAIN, et à la clef 1 le type HTML. De toute évidence, nous préférons afficher le HTML plutôt que le texte seul (PLAIN), donc nous allons devoir sélectionner la section la plus lisible. Créons donc une fonction get_plusLisible(), qui décide d'un certain ordre d'importance. En l'état, elle ne fonctionne que pour les sections de type HTML puis PLAIN, mais cela reste facilement extensible.

Nous faisons ici usage de la fonction PHP array_flip(), qui inverse clefs et valeurs au sein du tableau, afin qu'après avoir vérifié qu'une valeur se trouve bien dans le tableau, nous puissions extraire la clef de cette valeur.
  1. function get_plusLisible($parts, $types) {
  2.   if (in_array("HTML", $types)) {
  3.     $types = array_flip($types);
  4.     return $types['HTML'];
  5.     }
  6.   elseif  (in_array("PLAIN", $types)) {
  7.     $types = array_flip($types);
  8.     return $types['PLAIN'];
  9.     }
  10.   }
get_subtypes() et get_plusLisible() seront placées l'une après l'autre dans notre code principal, juste après récupération du nombre de parties.
  1. if ($struct->type == 1) {
  2.   $nbrparts = !$struct->parts ? "1" : count($struct->parts);
  3.   $types = get_subtypes($struct->parts, $nbrparts);
  4.   $lisible = get_plusLisible($struct->parts, $types);
  5.   ...
Ceci fait, la boucle originale for(), qui parcourait l'ensemble des sections du mail pour les afficher une à une, doit être enlevée, et son contenu se limiter à la section. Ainsi plutôt que de parcourir les parties du mail avec une incrémentation de $i (for($i = 0; $i < $nbrparts; $i++) ), nous indiquons directement que la partie voulue est celle trouvée avec get_plusLisible() :
  1. $i=$lisible;
  2. $part = !$struct->parts[$i] ? $part = $struct : $part = $struct->parts[$i];
Le reste de l'ancien bloc de la boucle for() n'a pas à être changé : le mail contenant du HTML n'affichera désormais plus que cette partie, sans donner en plus la partie en texte seul.

 
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