TUTORIEL PHP 
Conception d'un client de messagerie IMAP (2)
Nous améliorons ici notre script de lecture d'e-mails en ajoutant des fonctionnalités d'effacement. (06/06/2005)
Notre première approche du client e-mail (lire l'article du 05/05/2005) nous a permis d'établir les fondements de l'opération de lecture des messages, au travers d'une interface très simple. Celle-ci autorisait le lecteur à afficher les informations en rapport aux e-mails contenus au sein d'une boîte POP3, et à afficher ledit message, chargé mais caché, d'un clic de souris sur un appel DOM/CSS (Document Object Model/Feuille de style).

Cette interface avait ses limites : elle n'affichait que le titre et la première ligne d'un e-mail. Nous allons tâcher ici, donc, de construire petit à petit une proposition plus complète. Cela demandera quelques efforts de refactorisation du code, et nous ajouterons une méthode permettant d'effacer un ou plusieurs messages.

Commençons donc par cette fonction primordiale face à l'éternelle mais inéluctable recrudescence du spam. Cela implique d'imbriquer le tableau de présentation que nous utilisons déjà dans un formulaire, et d'ajouter une colonne pour chaque ligne, celle-ci comportant la case à cocher salvatrice. Un bouton de validation complètera le tout.

Voici la reprise du début de notre tableau, avec les premières modifications :

<form name="mails" action="mail-delete.php" method="post" >
<input type="hidden" name="origine" value="<?=$_SERVER["SCRIPT_NAME"];?>">

<table border="1">
  <tr>
    <th>n°</th>
    <th>Date</th>
    <th>Auteur</th>
    <th>Sujet</th>
    <th>Effacer</th>
  </tr>
<?php

Quatre modifications ici : l'ouverture de la balise du formulaire, l'ajout d'une colonne "n°" (pour le numéro du message, à titre indicatif) et d'une autre "Effacer", et enfin l'apparition d'une balise cachée dans le formulaire, qui contient le nom du script principal (dans le cas où il changerait, pour éviter de devoir modifier aussi mail-delete.php).

Notons que l'attribut action du formulaire renvoie vers une autre page, mail-delete.php, qui ne prend en compte que la sélection de l'utilisateur, pour l'effacer et la renvoyer aussitôt vers le script principal. Ceci évite que l'utilisateur supprime sans le vouloir des messages en rechargeant la page. En effet, les e-mails ne sont pas affichés par un identifiant unique, mais par leur position dans la boîte à lettres.

Une fois le message effacé, son numéro sera donc repris par le message qui le suit immédiatement. Relancer l'effacement avec les mêmes numéros serait donc fatal à des messages innocents, ce que nous souhaitons bien sûr éviter.

Les modifications continuent plus loin. Tout d'abord, la colonne n° sera rempli à l'aide, tout simplement, de la variable d'incrémentation :

<td><?=$i;?></td>

La colonne d'effacement, quant à elle, prendre cette forme :

<td><input type="checkbox" name="delete[]" value="<?=$i;?>"></td>

Comme l'indique le [] de delete[], nous prévoyons le cas où l'utilisateur sélectionnera plus d'un message, et gérons d'entrée de jeu un tableau. La valeur correspond ici encore à la variable d'incrémentation, c'est-à-dire la position du mail dans la boîte.

Tout ceci se termine ainsi :

      <tr>
        <td colspan="4"> </td>
        <td ><input align="right" type="submit" name="effacer" value="Effacer"></td>
      </tr>

    </table>
  </form>


Une fois la boucle terminée, nous ne faisions que fermer le tableau. Nous allons ici non seulement le fermer, mais également fermer le formulaire, et ajouter au tableau une ligne à deux colonnes, donc une se situera en dessous de la colonne Effacer et présentera un bouton approprié.

Reste le fichier mail-delete.php, qui est très rapide à mettre en place :

<?php
include_once('configuration.php');
if ($mail_cnx = imap_open ("{".$serveur_entrant.$port.$protocole."}".$boite, $identifiant, $mot_de_passe) ) {
  if (isset($_POST['effacer']) && $_POST['effacer'] == "Effacer"){
    $numeros = implode(", ", $_POST['delete']);
    imap_delete($mail_cnx, $numeros);
    imap_expunge($mail_cnx);
    }
  }
header("Location: http://".$_SERVER['HTTP_HOST'].$_POST['origine']);
?>


Notre script principal affiche la liste des messages dans la boîte, très bien. Notre script de suppression renvoie vers celui-ci dès sa tâche accomplie, afin que l'utilisateur puisse constater de visu que les messages ont bien été effacés.

Deux paramètres parviennent au script via la variable globale $_POST : le nom du script d'origine, et un tableau comportant les numéros des messages à effacer. Ils nous suffit de décomposer ce tableau à l'aide de la fonction implode(), pour ensuite marquer ce(s) message(s) pour effacement via imap_delete(), et confirmer leur effacement avec imap_expunge().

Le combo delete/expunge permet de marquer des messages pour effacement sans pour autant les effacer. Cela permet de revenir en arrière avec la fonction imap_undelete(). Cependant, nous travaillons ici en POP3, et seules les boîtes IMAP supportent ce comportement. Pour couper court à tout débat, nous choisissons d'effacer les messages manu militari...

  Forum

Réagissez dans les forums de JDN Développeurs

Le passage par mail-delete.php est donc transparent pour l'utilisateur, et la liste se met à jour dès le clic sur le bouton. Par la suite, nous implémenterons plus de fonctionnalités cosmétiques, et toucherons aux réponses et transferts.
 
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