TP 1. Visualisation du contenu d'une boîte aux lettres utilisant le protocole POP

TP donné le: vendredi 17 novembre 2000
A rendre le: vendredi  8 décembre 2000

I. Sujet

On se propose d'implanter un client POP (Post Office Protocol) simple dont le but est d'afficher des informations sur le contenu d'une boîte aux lettres électronique.

II. Objectif

L'objectif de ce TP est de s'initier à la programmation en Tcl/Tk, et à l'accès réseau, au travers de l'écriture d'un client simple. Dans ce TP on manipulera les primitives et commandes du protocole POP pour communiquer avec un serveur de courrier électronique.

Il s'agit d'écrire un client qui:

  1. Se connecte sur un serveur POP, et ouvre une boîte aux lettres spécifiée par l'utilisateur.
  2. Récupère les informations voulues sur les messages en attentes (s'il y en a).
  3. Affiche les informations générales, ainsi que les informations concernant chaque message en attente.
  4. Se déconnecte du serveur.

Les informations générales désirée sont les suivantes:

  1. Le nombre total de messages en attente.
  2. La taille totale des messages en attente (en octet ou Koctets).

Les informations pour chaque message sont les suivantes:

  1. Champs principaux de l'entête:
  2. La taille (en octet ou Koctets).
  3. L'identificateur UIDL.
  4. Les 5 ou 10 premières lignes du corps.

III. Etapes à suivre

III.A Client POP:

Utilisez la commande 'socket' de Tcl côté client; le serveur à utiliser est cuimail.unige.ch, et le port est 110. Ouvrez votre boîte aux lettres (appelée maildrop) à l'aide des requêtes POP 'user user' et 'pass password'. Le user est votre login personel, ainsi que votre password. La requête 'stat' donne le nombre d'octets total  occupé par les messages en attente. La requête 'uidl i' (i = numéro du message) donne un identificateur unique de message, ou UIDL. A la fin fermez la connexion: avec la requête 'quit', et fermez le socket avec 'close'.

Exemple:

  # 1) Ouvrir la connexion avec le serveur
  set socketID [socket $pophost $port]
  gets $socketID line

  # 2) Se logger sur sa boite aux lettres en donnant
  #    son username et son password
  #    Les variables $user et $password auront été définies auparavant
  puts $socketID "USER $user"
  flush $socketID
  gets $socketID line

  puts $socketID "PASS $password"
  flush $socketID
  gets $socketID line
  # ici il est possible de récuperer le nombre de messages
  # en attente sur le serveur -> n

  # 3.a) Exemple: connaitre le nombre de messages en attente,
  #      ainsi que le nombre total d'octets
  puts $socketID "STAT"
  flush $socketID
  gets $socketID line
  # ici on peut stocker le nombre de messages -> n

  # 3.b) Exemple: recuperer l'identification du message
  #      no i (i entre 1 et n)
  puts $socketID "UIDL $i"
  flush $socketID
  gets $socketID line
  # ici on stocker l'uidl...

  # 4) Fermer la connexion
  puts $socketID "QUIT"
  flush $socketID
  gets $socketID line
  close $socketID

Remarque: Il est important de fermer la connexion à la fin de chaque session comme l'exemple ci-dessus ('quit' + fermeture du socket), car un maildrop n'accepte qu'une seule connexion à la fois: votre logiciel de courrier électronique a aussi besoin de se connecter sur le serveur.

III.B Informations demandées:

Les commandes telles que 'stat' et 'uidl' ci-dessus donnent déjà des informations. Concernant l'entête et le corps du message, vous aurez besoin des commandes suivantes: 'retr i', qui rend le contenu complet du message no i, y compris l'entête, et 'top i m' qui rend l'entête + les m 1ères lignes du corps seulement. Pour ces requêtes le serveur répond par plusieurs lignes, la dernière ligne étant un point (".") seul. L'instruction 'regexp' du langage Tcl vous sera probablement utile pour isoler les champs "From", "To" et "Subject". Voici 2 exemples de réponses à la requête 'retr': un message simple , et un message multi-parties au format MIME. Dans ce TP on évitera d'utiliser la commande 'dele', qui sert à supprimer un message du serveur...

Question: qu'est-ce qui vous permet de  distinguer l'entête du corps du message dans la réponse du serveur ?

III.C Interface graphique:

On se contetera d'un interface graphique simple, avec un bouton qui permet de lancer la connexion et la récupération des informations, une fenêtre pouvant contenir du texte afin d'y afficher toutes les informations, et un bouton pour quitter.

Des widgets 'entry' seront utilisés pour spécifier:

  1. le nom du serveur,
  2. le username,
  3. le password.

Il doit être possible de relancer la connexion et l'affichage des informations autant de fois que l'on veut sans quitter le programme, et les paramètres d'entrée ci-dessus doivent pouvoir être modifiés à tout moment. Le password peut être "masqué" à l'aide de l'option '-show *' du widget 'entry'.

IV. Programmation, test et évaluation

Afin de produire un code lisible, il est préférable de commenter les lignes de code que vous écrivez.

Il est aussi demandé de fournir un rapport d'une page afin d'expliquer la conception du client POP que vous avez développé. Vous pouvez également noter les problèmes que vous avez rencontrés ainsi que vos remarques concernant le TP.

Le rapport et le code du programme peuvent être remis par e-mail à l'adresse suivante: Frederic.Deguillaume@cui.unige.ch.

V. Annexe: le protocole POP

Site Hosting: Bronco