|
|
|
|
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. |
|
|
|
|
|
Quand achetez-vous le plus en ligne ? |
|
|
|
|
|
|
|
|