Interface Mail/WEB

 

1. Cahier des charges

Cette interface doit :
· Afficher et envoyer des mails avec des attachements MIME.
· Gérer les répertoires pour pouvoir y déplacer les mails reçus.
· Gérer un carnet d'adresses grâce auquel l'utilisateur pourra ajouter modifier ou effacer les adresses de son choix. Par son carnet d'adresses il pourra aussi envoyer des messages à des groupes via une mailing-list.
· Être en français.

 

 

2. Analyse de l'existant

Il existe beaucoup d'interfaces Mail/WEB existantes, malheureusement, il n'en existe pas beaucoup qui réunissent tous les points du cahier des charges.

Par exemple, anyemail écrit en perl, gère les comptes POP3 mais pas les répertoires ni la lecture de message avec des fichiers attachés, la langue de l'interface est en anglais. Il demande lors du login, l'adresse complète de l'utilisateur, ou bien il déduit l'adresse du serveur POP d'après celle de l'e-mail : l'utilisation de cette interface demandera à l'utilisateur de rentrer entièrement son adresse e-mail à chaque connexion. Comme cette interface est écrite en perl, il est facile de modifier le code pour pallier cet inconvénient, mais elle ne possède pas de licence GPL, ce qui rend sa modification interdite.
Une autre interface est IMP écrite en PHP3 dispose, quant à elle, d'une licence libre et gratuite. Cette interface utilise une connexion avec un serveur IMAP et permet la gestion des répertoires mais pas celle des carnets d'adresses et l'envoie de mail avec des fichiers attachés. Pour ces deux dernières raisons, nous ne pourrons pas la retenir.
Il existe d'autres interfaces gratuites (AtDot, CWMail, QDPOP...) que je n'ai pas développé ici pour des raisons de similitude avec les deux précédentes.

En ce qui concerne les interfaces commerciales, il y a Mail 2000 de 3RSoft. C'est une interface qui est très complète, mais son point noir est son prix : à partir de $800 (pour 20 utilisateurs) jusqu'à $12.000 (de 5000 à 10000 utilisateurs). Ce prix est trop élevé pour l'utilisation qui en sera faite.

Après avoir vu les interfaces existantes et étant donnée la puissance du langage script PHP3 (notamment en ce qui concerne le support IMAP), il semblerait plus judicieux de concevoir soi-même cette interface...

 

 

3. Conception de l'interface

a) Fonctionnement

L'utilisateur possède un compte de type POP dans le groupe 'popusers'. Les répertoires (ou boîtes aux lettres IMAP) qui serviront pour le déplacement des mails seront créés dans le répertoire mailboxes contenu dans le répertoire utilisateur.
Le carnet d'adresses de l'utilisateur sera contenu dans une base de données MySQL ainsi qui les mailing-lists et leurs descriptions, pour permettre une recherche par activités des groupes via l'explorateur.

Les tables dont nous avons besoin pour l'interface sont les suivantes:
· Comptes : contenant les renseignements sur les comptes utilisateur (login, mot de passe, nom et prénom de l'utilisateur),
· Adresses_Groupes : contenant l'adresse e-mail d'un groupe, d'une association ou d'un club ainsi que ses caractéristiques (activités…),
· Carnets_Adresses : contenant les adresses personnelles des utilisateurs.

 

create table Comptes (
  
numero int auto_increment not null primary key,
   login char(10) not null,
   nom_utilisateur char(30) not null,
   prenom_utilisateur char(30) not null,
   mot_passe char(8) not null,
   type char(1) not null
);

create table Adresses_Groupes(
  numero int auto_increment primary key,
   email char(100),
   nom char(50),
   type char(20),
   activite char(20),
   commentaires char(100)
);

create table Carnets_Adresses(
   numero int auto_increment primary key,
   utilisateur char(10),
   email char(100),
   nom char(30),
   prenom char(30),
   adresse char(100),
   telephone char(14)
);

 

b) Connexion au compte utilisateur

L'utilisateur choisit de rentrer sur son compte e-mail ; il est invité à entrer son nom de login et son mot de passe, puis à cliquer sur le bouton "Entrer". Une fois le formulaire contenant le login et le mot de passe envoyé, un script analyse ce contenu par rapport à la table MySQL "Comptes".
Cette table "Comptes" peut sembler inutile puisqu'elle possède toutes les informations concernant les comptes utilisateurs contenues sur le système, par exemple, dans le fichier "/etc/passwd". Mais l'utilisation de la base de données permet une utilisation plus souple de ces informations.
Si les informations que l'utilisateur a fournies sont exactes, le mot de passe est alors crypté avec une clé correspondant au numéro de jour du mois courant. La fonction de cryptage est "crypt(char* chaîne,char*clef)" du PHP3 qui est exactement identique à celle d'UNIX. Ce mot de passe crypte sera passé à chaque changement de page sur le compte utilisateur et comparé avec celui contenu dans la base de données.
Cette opération est faite pour augmenter la sécurité et éviter de passer en clair le mot de passe; dans notre cas, il n'est passé en clair qu'au moment où l'utilisateur envoie le formulaire d'entrée au compte.
Si le mot de passe et le nom de login correspondent, l'utilisateur peut alors entrer sur son compte.
Le script ("test_pass.php3") qui effectue toutes ces vérifications sera, en fait, rappelé par toutes les autres pages constituant l'interface.

 

c) Lecture de la boîte aux lettres

Grâce au cadre de droite, l'utilisateur peut voir sa boîte aux lettres, écrire un message, voir et modifier son carnet d'adresse, gérer ses répertoires et quitter.
Comme nous venons de le dire, le script qui va lire le contenu de la boîte ("voir_mail.php3") va d'abord faire appel à "test_pass.php3", pour vérifier l'identité de l'utilisateur.
Le script va ensuite détruire tous les fichiers qui ont pu être créés lors d'une utilisation ultérieure (fichiers liés par exemple).
Le script va ensuite demander le contenu de la boîte de l'utilisateur au serveur IMAP via le script "boite_mail.php3". Ce script se connecte au serveur IMAP, lui envoie le nom et le mot de passe de l'utilisateur. Il lui demande ensuite le nombre de messages contenus dans la boîte avant de demander les en-têtes de ces derniers pour placer dans un tableau (variable) les chaînes de caractères correspondants à l'expéditeur, au sujet, à la date et au numéro du message dans la liste.
Une fois l'appel à "boite_mail.php", le script "voir_mail.php3" va créer dynamiquement un tableau (HTML) où seront disposées les informations obtenues précédemment, ainsi que les icônes permettant de lire ou de détruire le message.

Une fois que l'utilisateur visualise sa boîte aux lettres, il pourra cliquer sur :
pour visualiser ses messages,
pour supprimer un message (en fait, lorsque l'on clique sur cet icône, on rouvre la page mais en lui passant dans l'URL une certaine variable. Si on assigne le numéro du mail à effacer à la variable $num_mail_det, lorsque le script "boite_mail.php3" sera appelé, il détruira le mail grâce à la fonction imap_delete() avant de rouvrir la boîte.).

 

d) Visualisation d'un message

La visualisation d'un message se fait lorsque l'utilisateur clique sur .Ce "clic" provoque l'ouverture de la page "lecture_message.php3" avec le passage dans l'URL du login, du mot de passe crypte et du numéro du message dans la boîte aux lettres.
Après avoir vérifié la validité du login et du mot de passe, nous faisons appel au script "lecture_mail.php3" qui est très proche de "boite_mail.php3", mais il permet de lire tout le contenu du message et non uniquement l'en-tête.
"lecture_mail" va regarder dans l'en-tête du message s'il y a plusieurs parties (Content-Type = multipart/mixed). Ensuite, il va lire le corps du message en discernant les fichiers liés du texte. Si le fichier lié est une image de type .gif ou .jpg, elle sera affichée à la suite du texte. Si l'on est en présence d'un autre format (.doc, .exe, etc...), on affichera qu'un lien vers ce fichier qui sera mis dans un répertoire temporaire pour son affichage ou son téléchargement.
A partir de cette page, d'autres possibilités sont offertes à l'utilisateur:
· Effacer l'e-mail courant : on retourne sur la page "voir_mail.php3" en passant dans l'URL la variable $num_mail_det avec le numéro du message dans la boîte aux lettres.
· Répondre : on va vers la page "envoyer_mail.php3" avec, dans l'URL, le nom de l'expéditeur dans la variable $champ_to et le sujet dans $champ_subject.
· Déplacer : l'utilisateur choisi dans le menu déroulant le répertoire vers lequel il veut déplacer le mail, puis clique sur le bouton SUBMIT "Déplacer". De la même façon que l'on efface un mail, il suffit de rouvrir la page "voir_mail.php3", passer la variable $num_mail_det, et envoyer aussi la variable $rep_depl initialisée avec le nom du répertoire cible (le déplacement se fera lors de l'appel de "boite_mail.php3" par "voir_mail.php3").

 

e) Ecriture/Réponse à un message

La page de composition d'un message ("envoyer_mail.php3") est très simple. Elle est constituée d'un formulaire où l'utilisateur doit remplir obligatoirement les champs contenant l'adresse du destinataire, le sujet ainsi que le message ; les champs de copie et d'attachement de fichiers (se fait par un champ de type file) pouvant être rempli de façon optinnelle.
Lorsque l'utilisateur cliquera sur le bouton SUBMIT "Envoyer", on fera appel au script "test_envoyer_mail.php3" qui va tester le bon remplissage des champs obligatoires sont bien remplis. L'envoi d'un message avec le PHP3 se fait grâce à la fonction mail($to,$subject,$donnees,$header). On doit donc générer $donnees contenant le corps du mail et $header contenant son en-tête. La ligne décrivant l'expéditeur ($from) est générée à partir du prénom puis du nom de l'utilisateur suivi de son adresse e-mail.
Les variables $cc (copie carbone) et $to sont aussi mises à jour.
S'il n'y a pas d'attachement, $donnees ne contiendra que le message et $header contiendra la ligne "From: $from", "Cc: $cc" ainsi que la ligne "X-Mailer: PHP3.07". Sinon, on encodera en base64 le fichier attaché puis on mettra à jour $header avec les lignes "From: $from", "X-Mailer: PHP3.07", "Cc: $cc", "MIME-Version: 1.0", "Content-Type : multipart/mixed; boundary="Fab-mail_boundary"".
Le PHP3 permet d'obtenir son type facilement. En effet, si le fichier attaché est contenu dans la variable $champ_attachment, on obtient son nom avec $champ_attachment_name et son type avec $champ_attachment_type. Grâce à cela, il est facile de créer le corps du message : on devra insérer les lignes "-Fab-mail_boundary" suivie de "Content-Type: $champ_attachment_type; name=$champ_attachment_name" et de "Content-Transfer-Encoding: base64"; ensuite on peut insérer le fichier encodé en base64 suivi de la ligne "-Fab-email_boundary-" pour marquer la fin du corps du message.

 

f) Carnet d'adresses

Le carnet d'adresses de l'utilisateur est contenu dans la table Carnets_Adresses de la base de données. Lors de l'accès à cette page, le script "carnet_adresses.php3" va effectuer une requête à la base de données pour obtenir toutes les adresses relatives à l'utilisateur. Les entrées dans le carnet d'adresses sont ensuite rangées dans un tableau créé dynamiquement en laissant apparaître l'adresse e-mail, le nom et le prénom.

A partir de ce tableau, l'utilisateur pourra effacer une adresse en cliquant sur l'icône ou éditer et/ou avoir des informations supplémentaires en cliquant sur ; il peut aussi tout simplement cliquer sur l'adresse e-mail qui est un lien vers la page de composition des messages ("envoyer_mail.php3") en passant l'adresse du destinataire en paramètre, dans l'URL.

Si l'utilisateur décide de détruire l'adresse, cela revient à rouvrir "carnet_adresses.php3" en passant la variable $det_adresse égale au numéro (unique car auto_increment) de l'adresse. Lors du chargement de la page, le script regarde si cette variable est initialisée avant d'envoyer la requête pour la recherche des adresses.

Lorsque l'on clique sur l'icône de demandes d'informations, cela ouvre une nouvelle page : "ajouter_adresse.php3" avec la variable $modif_adresse initialisée. Si cette variable n'est pas initialisée, c'est que l'on a décidé d'ajouter une adresse au carnet en cliquant sur le lien "Ajouter".
Ce script permet, par l'intermédiaire d'un formulaire, de visualiser les informations de l'entrée du carnet. A partir de ce formulaire, il est possible de compléter les champs pour modifier (ou créer) l'adresse. Pour valider ces informations, l'utilisateur devra terminer en cliquant sur le bouton SUBMIT "Ajouter/Modifier".
Si une adresse est créée ou modifiée, on fera alors appel au script "test_ajout_adresse.php3" qui regardera la variable $modif_adresse pour savoir s'il s'agit d'un ajout ou d'une modification et soumettra en fonction une requête différente (insert ou update) à la base de données.

A partir de la page "carnet_adresses.php3", l'utilisateur pourra choisir de cliquer sur le bouton "Ecrire à un groupe": une page ("choix_groupe.php3") lui permettra de choisir un groupe d'utilisateurs (mailing-list) selon le type du groupe (club, association, etc... ou "tout type") et son activité (lecture, jeux, etc... ou "toute activité") grâce à deux menus déroulants placés dans un formulaire.
Ces menus déroulant sont eux aussi créés dynamiquement, après la lecture des deux fichiers /usr/share/type.fab et /usr/share/activite.fab contenant les listes des activités et des types possibles (voir programme de gestion des mailing-lists).
La recherche du/des groupe(s) sera lancée après un clic sur le bouton SUBMIT "Lancer la recherche". Le script appelé pour la recherche des groupes est "montrer_groupes.php3" qui effectue simplement une requête dans la table Adresses_Groupes selon les paramètres demandés par l'utilisateur et range les résultats dans un tableau créé dynamiquement en laissant apparaître l'adresse e-mail, le nom et les commentaires des groupes. L'utilisateur n'a plus qu'a cliquer sur l'adresse e-mail pour ouvrir la page "envoyer_mail.php3" avec l'adresse du groupe. Il pourra aussi revenir en arrière pour modifier les critères de sa recherche s'il n'est pas satisfait (retour à "choix_groupe.php3").
La mise à jour des groupes est faite par un programme externe que nous étudierons plus tard.

 

g) Gestion des répertoires

L'interface permet de gérer les répertoires. Les répertoires sont en fait des boîtes aux lettres secondaires, c'est-à-dire qu'elles ont le même fonctionnement que la principale (celle qui reçoit le courrier) sauf qu'elles ne peuvent pas recevoir directement le courrier venant de l'extérieur.
L'utilisateur peut donc, créer ou détruire ces répertoires (répertoires situés dans le répertoire mailboxes contenu dans le répertoire utilisateur) et déplacer ses mails dans ces répertoires.
Lorsque l'utilisateur clique sur le lien "Gestion des répertoires" dans le cadre de gauche, il va voir apparaître tous les répertoires contenus sur son compte (dans le répertoire mailboxes). Le script "gestion_repertoires.php3" affiche le contenu du répertoire de l'utilisateur en symbolisant chaque répertoire par un icône.
L'utilisateur peut alors y pénétrer en y cliquant dessus (la destruction d'un répertoire ne peut se faire que lorsque l'on se trouve à l'intérieur).
Il peut aussi en créer un en cliquant sur le lien "Nouveau répertoire"; la création (après avoir saisi le nom) se fait par un rappel du script "gestion_repertoire.php3" en mettant à jour les variables $créer_rep et $champ_nom_rep.

Lorsque l'utilisateur entre dans un répertoire, il va pouvoir voir les mails qui s'y trouvent de la même façon que lorsqu'il ouvre sa boîte ("voir_mail.php3"). Ce script ("lire_repertoire.php3") fait aussi appel au script "boite_mail.php3" pour lire les messages contenus dans le répertoire.
La lecture d'un message se fait par le même script ("lecture_message.php3") que la lecture d'un mail dans la boîte aux lettres principale.

 

 

4. Conclusion

Cette interface semble fonctionner correctement après quelques tests. Son utilisation nécessite la réalisation d'outils de gestion des comptes (pour la création ou la suppression), et de gestion des mailing-lists. La conception de ces outils sera détaillée plus loin.

Je tiens à souligner la puissance du PHP3 et du serveur IMAP, la réalisation de cette interface a été relativement aisée.
Le seul point noir du PHP est sa documentation ; pour les fonctions IMAP, on ne trouve souvent sur le site officiel de PHP, qu'une ou deux lignes d'explication... Ce manque de documentation est comblé par les mailing-lists où certains utilisateurs donnent une réelle explication après avoir passé des heures de manipulations.

Avant la conception de cette interface, j'ai été amené à développer une version POP (cette version est commentée en annexes). Les différences entre les deux versions (POP et IMAP) sont énormes: les fonctions de lecture de l'en-tête et du corps des messages ont dues être totalement écrites (ceci peut entraîner des bugs puisqu'elles ne tiennent pas forcément compte de toutes les variantes que peuvent avoir un message, contrairement aux fonctions IMAP du PHP qui ont été développées proprement).

Comme perspectives d'évolutions de cette interface on pourrait, par exemple, songer à rajouter la gestion des messages lus (uniquement dans la version IMAP).