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).