L'Internet Rapide et Permanent

Le protocole de messagerie IMAP

Christian Caleca

Vous disposez d'une connexion permanente et rapide… et maintenant, vous êtes perdu dans la technique…

Cette série « L'Internet Rapide et Permanent », que Christian Caleca nous a aimablement autorisés à reproduire, est là pour répondre à quelques-unes de ces questions. Cet article parlera du protocole de messagerie IMAP.

N'hésitez pas à commenter cet article ! Commentez

- Titre : L'Internet Rapide et Permanent

- Auteur : Christian Caleca

- Parution : 3 mars 2009

- Public visé :

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2009 Christian Caleca. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- 1. Introduction

- 2. Présentation générale

- 2-1. Pourquoi IMAP4 ?

- 2-1-1. Puisqu'on a POP3…

- 2-1-2. Mais avec IMAP4…

- 2-1-3. Ce qu'IMAP4 sait faire

- 2-2. Alors pourquoi POP3 encore ?

- 2-3. Démonstration

- 2-3-1. Les configurations utilisées

- 2-3-1-1. UW-IMAP

- 2-3-1-2. Cyrus

- 2-3-2. Les tests

- 2-3-2-1. Configuration du client (MUA)

- 2-3-2-2. Création de répertoires

- 2-3-2-3. Réception d'un premier mail

- 2-3-2-4. Manipulations diverses

- 2-3-2-5. Suppression d'un message dans « Inbox »

- 2-3-2-6. Déplacement de messages

- 2-3-2-7. Le cas d'un gros message encombrant

- 2-4. Premières conclusions

- 3. Les commandes d'IMAP

- 3-1. Petit dialogue en IMAP

- 3-2. Points de repère

- 3-2-1. Port par défaut

- 3-2-2. Syntaxe

- 3-2-3. Les « flags »

- 3-2-4. Quelques commandes utiles

- 3-2-4-1. CAPABILITY

- 3-2-4-2. LSUB et LIST

- 3-2-4-3. SELECT

- 3-2-4-4. UID et FETCH

- 3-2-4-5. STARTTLS

- 3-2-5. Supprimer un message

- 3-2-5-1. Marqué avec \Deleted

- 3-2-5-2. EXPUNGE ou CLOSE

- 3-3. Jouons un peu

- 3-3-1. État initial

- 3-3-2. Jeu de commandes

- 3-3-3. État final

- 3-4. Conclusion

- 4. Remerciements Developpez

1 - Introduction

Internet Mail Access Protocol est un protocole de relève des messages électroniques, fonctionnellement comparable à POP.

Il présente toutefois de nombreux avantages et l'on peut se demander pourquoi il n'est pas plus souvent utilisé.

Ce chapitre essaye de montrer les avantages de ce protocole et les limites des actuels clients de messagerie.

Pour y arriver, nous utiliserons comme d'habitude des outils de base :

- Telnet, le terminal à tout faire ;

- Ethereal, le sniffeur habituel ;

- Thunderbird, un client de messagerie issu du projet Mozilla. Il existe pour les plateformes Windows, GNU/Linux et Mac OS X. Vous le trouverez sur le site du projet Mozilla.

Nous utiliserons des serveurs IMAP locaux, Dovecot principalement, comme indiqué dans l'article « SMTP/IMAP en pratique ».

2 - Présentation générale

Initialement, IMAP représentait un acronyme de : « Interactive Message Access Protocol ». Le nom a été modifié en « Internet Message Access Protocol ». Pour tenir compte des derniers ajouts au protocole (actuellement en version 4 révision 1).

Il est défini par le RFC 2060, remplacé par le RFC 3501.

2-1 - Pourquoi IMAP4 ?

2-1-1 - Puisqu'on a POP3…

Le protocole POP3 remplit tout à fait son rôle de relève de courrier, nous l'avons vu. Alors, pourquoi changer ?

POP3 permet de travailler en modes « hors-ligne » et « déconnecté », autrement dit, il est possible :

- de rapatrier tous ses messages en local et de les effacer du serveur, ce qui permet d'interrompre la connexion et de gérer ses messages localement (mode « hors-ligne ») ;

- de faire la même chose, mais en rapatriant une copie locale des messages, laissant les messages « originaux » sur le serveur (mode « déconnecté »).

Le mode « hors-ligne » est tout à fait utilisable si l'on ne gère sa messagerie que depuis un seul poste de travail, ce qui n'est pas toujours le cas.

Le mode « déconnecté » permet quant à lui une gestion depuis plusieurs postes, mais pose tout de même le problème de la purge du serveur. En effet, il faudra bien faire de la place de temps en temps si l'on ne veut pas voir sa boîte exploser. Et les messages une fois détruits sur le serveur ne pourront plus y être remis autrement qu'en se les renvoyant.

Lorsque l'on est dans des conditions de connexion difficiles, POP3 se révèle peu puissant pour se tirer d'embarras si un message volumineux se trouve dans la file. Il est possible, en exploitant toutes les finesses de POP3, d'éliminer ce message ou du moins de ne pas le rapatrier, mais peu de MUA savent gérer ces possibilités et le message non lu représentera toujours un écueil, à chaque consultation.

2-1-2 - Mais avec IMAP4…

Ici, le protocole autorise des manipulations infiniment plus souples. De plus, et c'est probablement là le point le plus décisif, les messages peuvent être entièrement gérés en restant sur le serveur. IMAP propose en effet les possibilités suivantes :

- lecture des objets des messages seulement (sans le corps) ;

- création de dossiers sur le serveur ;

- déplacement de messages sur le serveur d'un dossier à l'autre, sans avoir à rapatrier tout le message en local ;

- effacement de message sans l'avoir lu ;

- lecture des messages en les laissant sur le serveur ;

- marquage des messages sur le serveur. Par exemple, vous lisez un message sur un poste client A, lorsque vous ouvrez votre messagerie sur un poste client B, le message apparaitra comme lu. Il y a d'autres marqueurs que nous verrons plus loin ;

- il est possible, si votre fournisseur de service le permet, de poser sur le serveur des filtres qui classeront vos messages à leur arrivée sur le serveur. Ainsi, en ouvrant une session IMAP, vous trouverez vos messages déjà triés dans les bons dossiers.

Cette notion de dossiers de stockage sur le serveur n'est absolument pas exploitable en POP3, qui ne sait lire que le contenu de INBOX, le point d'entrée des nouveaux messages.

Toutes ces possibilités nécessitent bien entendu d'être connecté en permanence, donc en mode interactif, d'où le nom initial du protocole.

Mais IMAP fait encore plus, dans la mesure où les modes « hors-ligne » et « déconnecté » sont également possibles.

2-1-3 - Ce qu'IMAP4 sait faire

- consulter seulement les objets des messages ;

- effacer, déplacer des messages sans les lire, éventuellement avec des règles de tri automatiques ;

- rapatrier en local certains messages et pas d'autres, en faisant une copie ou un déplacement, éventuellement avec des règles de tri automatique ;

- recopier sur le serveur des messages que vous avez en local ;

- bien d'autres choses encore.

Vous le voyez, il semble n'y avoir aucune bonne raison de ne pas passer à IMAP, même si tous les MUA n'exploitent pas pleinement les possibilités de ce protocole.

2-2 - Alors pourquoi POP3 encore ?

S'il ne semble y avoir que de bonnes raisons de passer à IMAP, il y en a aussi (mais sont-elles bonnes ?) pour rester sur POP3.

IMAP4 est un protocole beaucoup plus compliqué que POP3 et pour cause, il est plus puissant. Cette complexité relative amène plusieurs effets négatifs :

- tous les fournisseurs de services Internet ne proposent pas encore de serveur IMAP, et ceux qui en proposent, pour des raisons diverses, les amputent parfois de certaines de leurs possibilités ;

- rares sont les clients de messagerie (MUA) qui gèrent toutes les possibilités offertes par IMAP4, si l'on se limite à ce que sait faire POP3, alors, autant utiliser POP3 ;

- garder tous ses messages sur le serveur, même bien classés dans divers dossiers n'a pas que des avantages, l'espace disponible est souvent limité et le stockage sur le serveur va rapidement remplir cet espace, encore que cette situation évolue rapidement. Il faudra donc adopter des stratégies de purge qui restreindront les avantages du système.

Mais nous sommes ici pour parler d'IMAP4. Pas moins de 25 commandes alors que POP3 n'en propose que 12. Nous ne les verrons pas toutes en détail, le but étant davantage de comprendre l'intérêt du protocole que de le manipuler avec Telnet.

2-3 - Démonstration

2-3-1 - Les configurations utilisées

Pour cette démonstration, nous disposons de deux serveurs IMAP différents. Nous nous contenterons de les utiliser pour une première approche des possibilités de ce protocole.

Note : cette démonstration date un peu, mais elle reste d'actualité.

2-3-1-1 - UW-IMAP

Un serveur développé à l'université de Washington, installé pour l'occasion sur mon poste de travail. Le serveur SMTP utilisé est Postfix. La machine s'appelle poétiquement pchris2.maison.mrs.

Ce serveur utilise le format « MAILBOX ».

2-3-1-2 - Cyrus

Un serveur développé à l'université de Carnegie Mellon, installé sur une Debian « Etch ». Le SMTP employé ici est également Postfix. La machine s'appelle cyrus.nain-t.net.

Ce serveur utilise le format « MAILDIR ».

2-3-2 - Les tests

2-3-2-1 - Configuration du client (MUA)

Sur chacune de ces machines, un compte de messagerie est créé :

- testimap@pchris2.maison.mrs pour le serveur Uw-imap ;

- testimap@cyrus.nain-t.net pour le serveur Cyrus.

Un client de messagerie, « Thunderbird », est installé sur la machine : pchris2.maison.mrs, qui fonctionne sous Ubuntu.

Nous allons créer ces deux comptes sur Thunderbird :

Deux remarques immédiates :

- les deux comptes contiennent déjà deux dossiers, « Inbox » et « Trash » ;

- sur pchris2 (uw-imap) les deux dossiers sont au même niveau de hiérarchie, alors que sur cyrus, « Trash » est un sous-dossier de « Inbox ». Cette subtilité trouvera son explication plus loin dans cet exposé.

2-3-2-2 - Création de répertoires

Ceci n'est pas un cours sur l'emploi de Thunderbird. Nous nous dispenserons donc de développer le mode opératoire.

Thunderbird aime bien disposer de répertoires supplémentaires :

- Sent, pour stocker les messages envoyés ;

- Drafts, pour stocker les brouillons ;

- Templates, pour stocker les modèles.

Nous allons les créer pour chaque compte, sur les serveurs respectifs.

Encore deux remarques :

- avec uw-imapd, il n'est pas possible de créer ces dossiers dans « Inbox », tous les dossiers sont obligatoirement au même niveau de hiérarchie ;

- avec Cyrus, les dossiers ne peuvent être créés que dans « Inbox » (ou dans un sous-dossier de « Inbox »). Il est possible de construire une arborescence complexe, même si ce n'est pas forcément souhaitable.

2-3-2-3 - Réception d'un premier mail

Nous avons plus de moyens que vous ne pensez. Depuis une quatrième machine (Windows, celle-là, mais qui utilise aussi Thunderbird), nous envoyons un message sur ces deux comptes :

Bien entendu, ça fonctionne et nous retrouvons sur pchris2 ce message dans chaque BAL :

2-3-2-4 - Manipulations diverses

Voyons un peu la configuration de notre Thunderbird :

Par défaut, Thunderbird place une copie des messages envoyés dans le dossier « Sent », sur le serveur IMAP du compte employé. Vérifions ça en répondant à ce premier message depuis le compte sur gw2 :

il y est.

Le dossier « Sent » est bien sur le serveur IMAP de gw2.maison.mrs et le message envoyé s'y trouve bien. Nous allons le vérifier tout de suite, puisque nous avons le serveur sous la main :

/home/testimap# ls -la
total 28
drwxr-xr-x    2 testimap nogroup      4096 Dec 20 10:53 .
drwxrwsr-x    6 root     staff        4096 Nov 30 16:42 ..
-rw-r--r--    1 testimap nogroup        28 Dec 20 10:20 .mailboxlist
-rw-------    1 testimap nogroup       513 Dec 20 10:19 Drafts
-rw-------    1 testimap nogroup      1190 Dec 20 10:53 Sent
-rw-------    1 testimap nogroup       513 Dec 20 10:20 Templates
-rw-------    1 testimap nogroup       513 Dec 20 10:03 Trash

Nous avons bien quatre fichiers qui correspondent aux quatre dossiers créés et un cinquième, caché, qui s'appelle .mailboxlist. Étant d'un naturel curieux, impossible de résister à l'envie de regarder son contenu :

/home/testimap# cat .mailboxlist
Trash
Drafts
Sent
Templates

Un peu décevant… Il ne contient que la liste des noms des répertoires.

Voyons maintenant le contenu du fichier « Sent » :

sysop:/home/testimap# cat Sent
From MAILER-DAEMON Sat Dec 20 10:20:02 2003
Date: 20 Dec 2003 10:20:02 +0100
From: Mail System Internal Data <MAILER-DAEMON@sysop.eme-enseignement.fr>
Subject: DON'T DELETE THIS MESSAGE -- FOLDER INTERNAL DATA
X-IMAP: 1071912002 0000000000
Status: RO

This text is part of the internal format of your mail folder, and is not
a real message.  It is created automatically by the mail system software.
If deleted, important folder data will be lost, and it will be re-created
with the data reset to initial values.

From testimap@sysop.eme-enseignement.fr Sat Dec 20 10:53:12 2003 +0100
Status: R
X-Status:
X-Keywords:
Message-ID: <3FE41C07.1030504@gw2.maison.mrs>
Date: Sat, 20 Dec 2003 10:53:11 +0100
From: testimap-gw2 <testimap@gw2.maison.mrs>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6b) Gecko/20031205 Thunderbird/0.4
X-Accept-Language: en-us, en
MIME-Version: 1.0
To: Christian Caleca <christian.caleca@free.fr>
Subject: Re: un premier test IMAP
References: <3FE4192C.7040107@free.fr>
In-Reply-To: <3FE4192C.7040107@free.fr>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit

Christian Caleca wrote:

> Coucou.

Bien reçu :)

Intéressons-nous pour l'instant à ce qui est surligné : c'est bien le texte de la réponse faite.

Il n'a bien entendu pas échappé à votre sagacité que le dossier « Inbox » n'est pas ici. C'est tout simplement qu'il est ailleurs. Il est dans le spool de messagerie, directement alimenté par le SMTP, via l'agent de distribution local (MDA). Avec EXIM vous le trouverez dans /var/spool/mail

sysop:/var/spool/mail# ls
chris  testimap

Profitons-en pour voir ce qu'il y a dedans :

sysop:/var/spool/mail# cat testimap
From christian.caleca@free.fr Sat Dec 20 10:40:53 2003
Return-path: <christian.caleca@free.fr>
Envelope-to: testimap@gw2.maison.mrs
Received: from pchris.maison.mrs ([192.168.0.10] helo=free.fr)
by sysop.eme-enseignement.fr with esmtp (Exim 3.35 #1 (Debian))
id 1AXdbQ-0000u2-00; Sat, 20 Dec 2003 10:40:52 +0100
Message-ID: <3FE4192C.7040107@free.fr>
Date: Sat, 20 Dec 2003 10:41:00 +0100
From: Christian Caleca <christian.caleca@free.fr>
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.6b) Gecko/20031205 Thunderbird/0.4
X-Accept-Language: en-us, en
MIME-Version: 1.0
To:  testimap@gw2.maison.mrs,  testimap@cyclope.maison.mrs
Subject: un premier test IMAP
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit
X-IMAPbase: 1071913280 2
Status: RO
X-Status: DA
X-Keywords:
X-UID: 1

Coucou.

Le message que l'on a reçu. C'est réconfortant.

2-3-2-5 - Suppression d'un message dans « Inbox »

Le message initial n'ayant pas d'intérêt, nous allons le détruire. Nous devrions théoriquement le retrouver dans la poubelle (Trash) :

Tout va bien, tout se passe comme prévu.

Comme ce message n'a toujours pas d'intérêt, même dans la poubelle, nous vidons aussi la poubelle.

Bien. Vous êtes bien assis ? Alors, allons vérifier tout ça sur le serveur :

/home/testimap# cat Trash

From MAILER-DAEMON Sat Dec 20 11:07:13 2003
Date: 20 Dec 2003 11:07:13 +0100
From: Mail System Internal Data <MAILER-DAEMON@sysop.eme-enseignement.fr>
Subject: DON'T DELETE THIS MESSAGE -- FOLDER INTERNAL DATA
Message-ID: <1071914833@sysop.eme-enseignement.fr>
X-IMAP: 1071911016 0000000001
Status: RO

This text is part of the internal format of your mail folder, and is not
a real message.  It is created automatically by the mail system software.
If deleted, important folder data will be lost, and it will be re-created
with the data reset to initial values.

From christian.caleca@free.fr Sat Dec 20 10:40:53 2003
Return-path: <christian.caleca@free.fr>
Envelope-to: testimap@gw2.maison.mrs
Received: from pchris.maison.mrs ([192.168.0.10] helo=free.fr)
by sysop.eme-enseignement.fr with esmtp (Exim 3.35 #1 (Debian))
id 1AXdbQ-0000u2-00; Sat, 20 Dec 2003 10:40:52 +0100
Message-ID: <3FE4192C.7040107@free.fr>
Date: Sat, 20 Dec 2003 10:41:00 +0100
From: Christian Caleca <christian.caleca@free.fr>
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.6b) Gecko/20031205 Thunderbird/0.4
X-Accept-Language: en-us, en
MIME-Version: 1.0
To:  testimap@gw2.maison.mrs,  testimap@cyclope.maison.mrs
Subject: un premier test IMAP
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit
Status: RO
X-Status: A
X-Keywords:

Coucou.

Ça, c'est ennuyeux. Bien qu'effacé, le message y est toujours !

Et dans le spool, le premier message reçu, puis effacé, y est-il toujours lui aussi ?

sysop:/var/spool/mail# cat testimap

From christian.caleca@free.fr Sat Dec 20 10:40:53 2003
Return-path: <christian.caleca@free.fr>
Envelope-to: testimap@gw2.maison.mrs
Received: from pchris.maison.mrs ([192.168.0.10] helo=free.fr)
by sysop.eme-enseignement.fr with esmtp (Exim 3.35 #1 (Debian))
id 1AXdbQ-0000u2-00; Sat, 20 Dec 2003 10:40:52 +0100
Message-ID: <3FE4192C.7040107@free.fr>
Date: Sat, 20 Dec 2003 10:41:00 +0100
From: Christian Caleca <christian.caleca@free.fr>
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.6b) Gecko/20031205 Thunderbird/0.4
X-Accept-Language: en-us, en
MIME-Version: 1.0
To:  testimap@gw2.maison.mrs,  testimap@cyclope.maison.mrs
Subject: un premier test IMAP
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit
X-IMAPbase: 1071913280 2
Status: RO
X-Status: DA
X-Keywords:
X-UID: 1

Coucou.

Oui…

Ça voudrait dire que petit à petit, l'espace alloué va s'encombrer de déchets et finalement, la BAL va exploser alors même qu'elle sera considérée comme vide ?

La réponse est oui, si l'on ne prend pas une précaution supplémentaire : le compactage des dossiers.

En cliquant sur Inbox du bouton droit et en faisant « Compact This Folder » et en répétant la même opération sur « Trash », nous allons remédier au problème :

/var/spool/mail# ls -l
total 48
-rw-rw----    1 testimap mail            0 Dec 20 11:33 testimap

Le fichier existe toujours, mais fait 0 octet, ce qui prouve qu'il est vide.

Il est donc primordial, avec IMAP, de penser à compacter régulièrement les dossiers de la messagerie.

2-3-2-6 - Déplacement de messages

Nous allons créer pour le compte sur gw2.maison.mrs une règle de filtrage qui va déplacer tout message contenant le mot « trier » dans un dossier spécial intitulé « demotri » et créé à cet effet.

et nous envoyons un message :

Et chez le destinataire :

Ça fonctionne. Le seul fait de lire sa messagerie va faire que le message sera déplacé dans le dossier « demotri » sans qu'il ait été au préalable rapatrié chez le client.

On efface ce message sans intérêt, on vide la poubelle et au bout du compte, notre BAL contiendra toujours trois exemplaires de ce message, invisibles, mais bien présents :

- dans Inbox, parce que le déplacement n'est en réalité qu'une copie suivie d'un effacement ;

- dans demotri ;

- dans Trash.

Pensez donc à compacter les dossiers souvent…

Plus fort encore, nous allons créer une règle de tri qui fera que, lorsqu'un message à destination de testimap@cyclope.maison.mrs contient le mot « distant » dans son objet, il faudra le déplacer dans le répertoire « demotri » du compte testimap@gw2.maison.mrs.

Autrement dit, nous allons déplacer un message d'un serveur à l'autre.

Répétons-le, cette règle est écrite pour le compte [testimap@cyclope.maison.mrs !

Envoi du message :

Et réception :

2-3-2-7 - Le cas d'un gros message encombrant

Vous êtes perdu quelque part de l'autre côté de la fracture numérique et ne disposez que d'une méchante connexion RTC qui plafonne à 28 800 bps et qui se déconnecte toutes les cinq minutes, à cause de la mauvaise qualité de votre ligne téléphonique. Je peux vous indiquer des endroits en France où c'est comme ça que ça se passe.

Comme dans ce cas, vous avez pris la précaution de faire afficher la taille des messages, vous constatez que celui-ci fait 805 Ko, qu'avec votre connexion pourrie, vous n'arriverez jamais à le télécharger, IMAP vous sauve.

En effet, à ce stade, le message n'est pas téléchargé en local. Aussi longtemps que vous ne cliquerez pas dessus du bouton gauche, il ne se téléchargera pas.

Cliquez donc dessus du bouton droit, demandez de le déplacer dans le dossier « Lire_plus_tard », que vous avez créé à cet effet. Le déplacement aura lieu sans que le message ne soit téléchargé localement. Vous pourrez alors aller le lire plus tard, lorsque vous aurez retrouvé une connexion de bonne qualité.

2-4 - Premières conclusions

Si cette démonstration ne vous a pas convaincu de l'intérêt d'IMAP, c'est que vous n'avez pas besoin de consulter votre messagerie depuis des machines différentes, que vous êtes suffisamment sûr de la fiabilité de votre machine locale pour ne pas souhaiter conserver vos messages importants sur le serveur de votre fournisseur, que vous n'avez jamais été confronté au blocage de votre messagerie parce que vous avez une connexion tellement minable qu'un gros message ne peut jamais être rapatrié à cause des déconnexions.

IMAP propose beaucoup de fonctionnalités, c'est une autre affaire que d'en disposer avec son MUA. Thunderbird gère bien mieux l'IMAP que ne le fait Outlook Express, par exemple, qui ne sait pas appliquer de règles de filtrage sur les dossiers IMAP. Cependant, il n'est pas parfait non plus. Il n'est pas possible par exemple de définir simplement une règle de tri en fonction de la taille des messages.

Pourquoi avons-nous fait ces manipulations surtout avec UW-imap ? Parce que c'est le serveur dont la structure est la plus simple. Mais rassurez-vous, nous aurons l'occasion de voir Cyrus plus en détail plus tard.

De ce que nous avons vu pour l'instant, retenons que Cyrus offre plus de souplesse dans l'organisation des répertoires que ne le fait UW-imap. Nous verrons plus loin que ce n'est pas son seul avantage. Mais en ce qui concerne le protocole IMAP lui-même, les deux serveurs se comportent de la même manière.

3 - Les commandes d'IMAP

Entrons maintenant dans le vif du sujet. Il y a quelques RFC qui définissent IMAP4 tel qu'il est utilisé actuellement. Les voici :

RFC

Titre

Commentaire

2060

INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1

Pour mémoire

2087

IMAP4 QUOTA extension

3501

INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1

Obsoletes : 2060

3502

Internet Message Access Protocol (IMAP) - MULTIAPPEND Extension

3691

Internet Message Access Protocol (IMAP) UNSELECT command

4314

IMAP4 Access Control List (ACL) Extension

4315

Internet Message Access Protocol (IMAP) - UIDPLUS extension

4466

Collected Extensions to IMAP4 ABNF

Updates : 2088, 2342, 3501, 3502, 3516

4469

Internet Message Access Protocol (IMAP) CATENATE Extension

Updates : 3501, 3502

4978

The IMAP COMPRESS Extension

5032

WITHIN Search Extension to the IMAP Protocol

Updates : 3501

Et voici la liste des commandes, avec les RFC qui y font référence.

Commande

RFC

APPEND

RFC 3501, RFC 3502, RFC 4466, RFC 4469

AUTHENTICATE

RFC 3501

CAPABILITY

RFC 3501

CHECK

RFC 3501

CLOSE

RFC 3501

COMPRESS

RFC 4978

COPY

RFC 3501

CREATE

RFC 3501, RFC 4466

DELETE

RFC 3501

DELETEACL

RFC 4314

EXAMINE

RFC 3501, RFC 4466

EXPUNGE

RFC 3501

FETCH

RFC 3501, RFC 4466

GETACL

RFC 4314

GETQUOTA

RFC 2087

GETQUOTAROOT

RFC 2087

LIST

RFC 3501

LISTRIGHTS

RFC 4314

LOGIN

RFC 3501

LOGOUT

RFC 3501

LSUB

RFC 3501

MYRIGHTS

RFC 4314

NOOP

RFC 3501

RENAME

RFC 3501, RFC 4466

SEARCH

RFC 3501, RFC 5032

SELECT

RFC 3501, RFC 4466

SETACL

RFC 4314

SETQUOTA

RFC 2087

STARTTLS

RFC 3501

STATUS

RFC 3501

STORE

RFC 3501, RFC 4466

SUBSCRIBE

RFC 3501

UID

RFC 3501, RFC 4315, RFC 4466

UNSELECT

RFC 3691

UNSUBSCRIBE

RFC 3501

X<atom>

RFC 3501

Au minimum, le RFC 3501 gagne à être lu pour mieux comprendre ce qui suit. Les commandes en gras seront plus particulièrement observées.

3-1 - Petit dialogue en IMAP

Suit un dialogue tout simple, entre le MUA Thunderbird et un serveur IMAP (Dovecot) configuré pour accepter les échanges en plaintext. Le compte lu n'a pas de dossiers particuliers, à part la « corbeille » (Trash). Il n'y a pas de nouveaux messages dans la boite. On peut difficilement faire plus simple, comme le montre l'illustration.

No.     Time        Source                Destination           Protocol Info
4 0.000665    janus.maison.mrs      pchris.maison.mrs     IMAP     Response: * OK Dovecot ready.
5 0.010322    pchris.maison.mrs     janus.maison.mrs      IMAP     Request: 1 capability
7 0.010724    janus.maison.mrs      pchris.maison.mrs     IMAP     Response: * CAPABILITY IMAP4rev1 SASL-IR SORT THREAD=REFERENCES MULTIAPPEND UNSELECT LITERAL+ IDLE CHILDREN NAMESPACE LOGIN-REFERRALS QUOTA STARTTLS AUTH=PLAIN
8 0.056690    pchris.maison.mrs     janus.maison.mrs      IMAP     Request: 2 authenticate plain
9 0.057215    janus.maison.mrs      pchris.maison.mrs     IMAP     Response: +
10 0.057487    pchris.maison.mrs     janus.maison.mrs      IMAP     Request: AHN5c29wQG1haXNvbi5tcnMAd3preHJsZQ==
12 1.748651    janus.maison.mrs      pchris.maison.mrs     IMAP     Response: 2 OK Logged in.
13 1.749334    pchris.maison.mrs     janus.maison.mrs      IMAP     Request: 3 namespace
15 1.750784    janus.maison.mrs      pchris.maison.mrs     IMAP     Response: * NAMESPACE (("" ".")) NIL NIL
16 1.752712    pchris.maison.mrs     janus.maison.mrs      IMAP     Request: 4 lsub "" "*"
17 1.753294    janus.maison.mrs      pchris.maison.mrs     IMAP     Response: * LSUB () "." "Trash"
18 1.754174    pchris.maison.mrs     janus.maison.mrs      IMAP     Request: 5 list "" "INBOX"
19 1.754645    janus.maison.mrs      pchris.maison.mrs     IMAP     Response: * LIST (\HasNoChildren) "." "INBOX"
20 1.762273    pchris.maison.mrs     janus.maison.mrs      IMAP     Request: 6 select "INBOX"
21 1.763705    janus.maison.mrs      pchris.maison.mrs     IMAP     Response: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
22 1.764358    pchris.maison.mrs     janus.maison.mrs      IMAP     Request: 7 getquotaroot "INBOX"
23 1.765468    janus.maison.mrs      pchris.maison.mrs     IMAP     Response: * QUOTAROOT "INBOX" ""
24 1.765912    pchris.maison.mrs     janus.maison.mrs      IMAP     Request: 8 UID fetch 1:* (FLAGS)
25 1.767333    janus.maison.mrs      pchris.maison.mrs     IMAP     Response: * 1 FETCH (FLAGS (\Seen) UID 1)
26 1.774399    pchris.maison.mrs     janus.maison.mrs      IMAP     Request: 9 IDLE
27 1.775210    janus.maison.mrs      pchris.maison.mrs     IMAP     Response: + idling
29 8.352640    pchris.maison.mrs     janus.maison.mrs      IMAP     Request: DONE
30 8.352984    janus.maison.mrs      pchris.maison.mrs     IMAP     Response: 9 OK Idle completed.
31 8.353243    pchris.maison.mrs     janus.maison.mrs      IMAP     Request: 10 close
32 8.354027    janus.maison.mrs      pchris.maison.mrs     IMAP     Response: 10 OK Close completed.
33 8.354250    pchris.maison.mrs     janus.maison.mrs      IMAP     Request: 11 logout
34 8.354431    janus.maison.mrs      pchris.maison.mrs     IMAP     Response: * BYE Logging out
35 8.354688    janus.maison.mrs      pchris.maison.mrs     IMAP     Response: 11 OK Logout completed.

Pas moins de 11 commandes sont envoyées au serveur. Regardons-les de plus près.

Commande

Description

capability

demande la liste des possibilités que le serveur supporte.

authenticate

indique au serveur un mécanisme d'authentification. Si le serveur supporte le mécanisme d'authentification demandé, il exécute un échange protocolaire d'authentification afin d'authentifier et identifier le client. Il est aussi possible d'utiliser la commande login, plus rudimentaire car elle ne supporte que le nom d'utilisateur et son mot de passe en texte clair.

namespace

Pour aller vite, cette commande retourne ce qu'il faut pour que l'utilisateur puisse connaître les dossiers auxquels il peut accéder et souscrire, ce qui peut inclure les dossiers partagés, prévus dans le protocole IMAP.

lsub

permet d'obtenir à partir d'un point de référence la liste de dossiers auxquels le client a souscrit (qu'il désire voir dans son client).

list

permet d'obtenir à partir d'un point de référence la liste de dossiers existants.

select

sélectionne une boite aux lettres, ainsi les messages dans la boite aux lettres sont accessibles. Cette commande renvoie le nombre total de messages (EXISTS), et le nombre de nouveaux messages (RECENT).

getquotaroot

Comme son nom le laisse penser, cette commande renvoie l'état d'occupation de l'espace alloué, lorsque les quotas sont activés sur le serveur IMAP.

uid

s'utilise avec les commandes COPY, FETCH, STORE ou encore SEARCH. Son utilité est de renvoyer un index unique plutôt qu'un numéro de séquence, comme le feraient les commandes COPY, FETCH, STORE et SEARCH.

fetch

cette commande dispose d'une syntaxe assez complexe. Il est possible d'obtenir par elle de nombreuses informations sur un message ou un lot de messages. Dans l'exemple, Thunderbird se contente de récupérer les drapeaux attachés à chaque message présent dans INBOX.

idle

lorsque le serveur supporte cette commande, il permet au client d'être informé en temps réel de l'arrivée de nouveaux messages.

close

assez similaire à EXPUNGE, cette commande détruit de façon définitive tous les messages qui ont le drapeau deleted. Elle ne renvoie pas de compte rendu, comme le fait EXPUNGE. Thunderbird n'envoie pas cette commande par défaut. Il faut le lui indiquer dans sa configuration avancée, comme expliqué plus loin.

logout

Logout met fin à la session IMAP.

Comme nous n'allons pas coder un client IMAP, nous n'irons pas beaucoup plus loin. Il est vivement recommandé, si l'on désire approfondir ce protocole, de s'installer un serveur SMTP et un serveur IMAP et de jouer avec par l'entremise de Telnet. Nous allons d'ailleurs avoir dans la suite un petit aperçu de la complexité de ce jeu.

3-2 - Points de repère

Encore une fois, rien ne vaut la lecture du RFC 3501 (ce ne sera pas faute d'avoir insisté). Voici tout de même quelques points forts du protocole.

3-2-1 - Port par défaut

Un serveur IMAP écoute par défaut sur le port 143. Si l'on n'utilise ni TLS ni IMAPS, l'échange se fait en texte clair (y compris éventuellement le nom d'utilisateur et le mot de passe) et Telnet permet de jouer aux MUA les plus évolués.

3-2-2 - Syntaxe

Premier point, les commandes doivent être indexées, contrairement à POP. Autrement dit, chaque commande doit être précédée d'un index unique. Ceci permet dans certaines conditions d'envoyer au serveur une nouvelle commande alors que l'on n'a pas encore reçu la réponse de la précédente.

3-2-3 - Les « flags »

Les commandes peuvent être envoyées en caractères majuscules ou en minuscules. Il vaut mieux le faire en majuscules.

\Seen

Le message a été lu.

\Answered

Il a été répondu au message.

\Flagged

Le message est marqué pour lui donner une attention particulière.

\Deleted

Le message est supprimé pour que plus tard un EXPUNGE ou un CLOSE puisse le supprimer physiquement sur le serveur.

\Draft

Le message n'a pas été entièrement composé. Il est marqué en tant que brouillon.

\Recent

Le message est arrivé dans cette boite aux lettres après la dernière consultation de celle-ci. Les sessions ultérieures ne verront pas l'état \Recent pour ce message. Ce drapeau ne peut être modifié par le client. S'il n'est pas possible de déterminer si oui ou non, cette session est la première session a être notifiée du message, alors ce message DEVRA (SHOULD) être considéré comme récent.

3-2-4 - Quelques commandes utiles

Il existe des commandes qui peuvent être utilisées sans authentification préalable (très peu) et d'autres qui ne peuvent l'être qu'après avoir été authentifié.

3-2-4-1 - CAPABILITY

C'est une commande importante, elle permet au client de savoir ce dont le serveur est capable. Tous les serveurs IMAP n'ont pas les mêmes possibilités. Cette commande peut être envoyée au serveur avant l'authentification. Il est même recommandé de le faire, de manière à choisir le moyen d'authentification le plus approprié. Exemples :

un serveur uw-imapd

10 capability
* CAPABILITY IMAP4REV1 LITERAL+ IDLE UIDPLUS NAMESPACE CHILDREN MAILBOX-REFERRALS BINARY
UNSELECT ESEARCH WITHIN SCAN SORT THREAD=REFERENCES THREAD=ORDEREDSUBJECT MULTIAPPEND
SASL-IR LOGIN-REFERRALS STARTTLS LOGINDISABLED
10 OK CAPABILITY completed

un serveur Dovecot

10 capability
* CAPABILITY IMAP4rev1 SASL-IR SORT THREAD=REFERENCES MULTIAPPEND UNSELECT LITERAL+
IDLE CHILDREN NAMESPACE LOGIN-REFERRALS QUOTA STARTTLS AUTH=PLAIN
10 OK CAPABILITY completed

un autre serveur Dovecot, configuré différemment

10 capability
* CAPABILITY IMAP4rev1 SASL-IR SORT THREAD=REFERENCES MULTIAPPEND UNSELECT LITERAL+
IDLE CHILDREN NAMESPACE LOGIN-REFERRALS STARTTLS AUTH=PLAIN
10 OK CAPABILITY completed

un serveur Courier-imapd

10 capability
* CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES
SORT QUOTA IDLE ACL ACL2=UNION STARTTLS LOGINDISABLED
10 OK CAPABILITY completed

un serveur Cyrus-imapd

10 capability
* CAPABILITY IMAP4 IMAP4rev1 ACL QUOTA LITERAL+ MAILBOX-REFERRALS NAMESPACE UIDPLUS ID
NO_ATOMIC_RENAME UNSELECT CHILDREN MULTIAPPEND BINARY SORT THREAD=ORDEREDSUBJECT
THREAD=REFERENCES ANNOTATEMORE IDLE STARTTLS LOGINDISABLED
10 OK Completed

Notez STARTTLS et LOGINDISABLED. L'une permet de passer en mode chiffré, l'autre indique que la commande LOGIN qui passe le nom d'utilisateur et le mot de passe en clair n'est pas acceptée par le serveur.

3-2-4-2 - LSUB et LIST

Ces deux commandes permettent de savoir quels sont les répertoires souscrits et existants. Exemple :

* OK Dovecot ready.
10 login chris@maison.mrs epikoi
10 OK Logged in.
20 lsub "*" "*"
* LSUB () "." "Trash"
20 OK Lsub completed.
30 list "*" "*"
* LIST (\HasNoChildren) "." "Trash"
* LIST (\HasNoChildren) "." "INBOX"
30 OK List completed.
40 unsubscribe "Trash"
40 OK Unsubscribe completed.
50 lsub "*" "*"
50 OK Lsub completed.
60 list "*" "*"
* LIST (\HasNoChildren) "." "Trash"
* LIST (\HasNoChildren) "." "INBOX"
60 OK List completed.
70 logout
* BYE Logging out
70 OK Logout completed.
Connection closed by foreign host.

Au début de la session, LSUB dit que chris@maison.mrs est abonné au dossier Trash. La commande LIST indique qu'il y a un autre dossier : INBOX. Mais à celui-ci l'utilisateur est obligatoirement abonné.

La commande UNSUBSCRIBE permet de se désabonner à Trash. En effet la commande LSUB n'indique plus rien, ce qui ne veut pas dire que le dossier n'existe plus, puisque la commande LIST l'affiche toujours.

3-2-4-3 - SELECT

Permet de sélectionner un dossier et d'avoir un compte rendu de son contenu. Pour les besoins, envoyons un message à chris@maison.mrs et manipulons un peu :

20 select INBOX
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
* 6 EXISTS
* 1 RECENT
* OK [UNSEEN 5] First unseen.
* OK [UIDVALIDITY 1216295789] UIDs valid
* OK [UIDNEXT 7] Predicted next UID
20 OK [READ-WRITE] Select completed.

Le fait de sélectionner INBOX nous apprend principalement que dedans il y a :

- six messages ;

- un est RECENT ;

- le premier message non lu a l'index 5.

3-2-4-4 - UID et FETCH

Pour en savoir plus, il faut utiliser ce couple infernal, avec la bonne syntaxe. Ici, nous voulons juste avoir le détail des FLAGS pour tous les messages présents dans INBOX :

30 uid fetch 1:* (FLAGS)
* 1 FETCH (FLAGS (\Seen) UID 1)
* 2 FETCH (FLAGS (\Seen) UID 2)
* 3 FETCH (FLAGS (\Seen) UID 3)
* 4 FETCH (FLAGS (\Seen) UID 4)
* 5 FETCH (FLAGS () UID 5)
* 6 FETCH (FLAGS (\Recent) UID 6)
30 OK Fetch completed.

Ce qui nous apprend que :

- les messages 1 à 4 ont été lus ;

- le message 5 était déjà présent lors de la dernière consultation, mais n'a pas été lu ;

- le message 6 est Recent. Il n'était pas présent lors de la dernière consultation.

Est-ce à dire que le seul fait d'ouvrir une session IMAP peut changer des flags ? Absolument. La preuve :

40 logout
40 OK Logout completed.
Connection closed by foreign host.
chris@pchris2:~$ telnet janus.maison.mrs 143
Trying 192.168.0.18...
Connected to janus.maison.mrs.
Escape character is '^]'.
* OK Dovecot ready.
10 login chris@maison.mrs epikoi
10 OK Logged in.
20 select "INBOX"
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
* 6 EXISTS
* 0 RECENT
* OK [UNSEEN 5] First unseen.
* OK [UIDVALIDITY 1216295789] UIDs valid
* OK [UIDNEXT 7] Predicted next UID
20 OK [READ-WRITE] Select completed.
30 uid fetch 1:* (FLAGS)
* 1 FETCH (FLAGS (\Seen) UID 1)
* 2 FETCH (FLAGS (\Seen) UID 2)
* 3 FETCH (FLAGS (\Seen) UID 3)
* 4 FETCH (FLAGS (\Seen) UID 4)
* 5 FETCH (FLAGS () UID 5)
* 6 FETCH (FLAGS () UID 6)
30 OK Fetch completed.

Le seul fait d'avoir fermé la session IMAP puis d'en avoir ouvert une autre fait que le message 6 n'est plus Recent. Soyons clairs. Ceci ne veut pas dire qu'il a été lu. Un message lu a le flag Seen. La preuve :

40 uid FETCH 6 BODY[HEADER]
* 6 FETCH (UID 6 FLAGS (\Seen) BODY[HEADER] {811}
Return-Path: <root@janus.nain-t.net>
Delivered-To: chris@maison.mrs
Received: from localhost (localhost [127.0.0.1])
by janus.nain-t.net (Postfix) with ESMTP id C47C64000B3
for <chris@maison.mrs>; Sun, 20 Jul 2008 17:58:32 +0200 (CEST)
X-Virus-Scanned: Debian amavisd-new at janus.nain-t.net
Received: from janus.nain-t.net ([127.0.0.1])
by localhost (janus.nain-t.net [127.0.0.1]) (amavisd-new, port 0024)
with ESMTP id UPxwk-p3hN85 for <chris@maison.mrs>;
Sun, 20 Jul 2008 17:58:17 +0200 (CEST)
Received: by janus.nain-t.net (Postfix, from userid 0)
id C886740009C; Sun, 20 Jul 2008 17:58:17 +0200 (CEST)
To: chris@maison.mrs
Subject: test IMAP
Message-Id: <20080720155817.C886740009C@janus.nain-t.net>
Date: Sun, 20 Jul 2008 17:58:17 +0200 (CEST)
From: root@janus.nain-t.net (root)

)
40 OK Fetch completed.
40 uid fetch 1:* (FLAGS)
* 1 FETCH (FLAGS (\Seen) UID 1)
* 2 FETCH (FLAGS (\Seen) UID 2)
* 3 FETCH (FLAGS (\Seen) UID 3)
* 4 FETCH (FLAGS (\Seen) UID 4)
* 5 FETCH (FLAGS () UID 5)
* 6 FETCH (FLAGS (\Seen) UID 6)
40 OK Fetch completed.

uid FETCH 6 BODY[HEADER] signifie que l'on souhaite lire le texte du message d'index 6, mais seulement son en-tête. Cette demande fait que par la suite, le message 6 est marqué comme Seen.

3-2-4-5 - STARTTLS

Cette commande permet de négocier entre le client et le serveur une méthode de chiffrement des données échangées. Le serveur doit présenter un certificat (avec sa clé publique) et le client doit accepter ce certificat. Soit automatiquement parce qu'il est signé par une autorité de confiance connue, soit manuellement. STARTTLS employé avant AUTHANTICATE permet de chiffrer aussi la procédure de login. Il n'est que trop conseillé d'utiliser cette méthode si le serveur le permet.

3-2-5 - Supprimer un message

Vous avez bien lu jusqu'au bout tous les RFC impliqués dans le protocole IMAP et vous avez compris qu'il n'y a pas de commande simple prévue pour supprimer un message. La commande DELETE s'applique à des dossiers, pas à des messages. Comment faire alors ? Il y a deux étapes à franchir, et il est absolument fondamental d'en comprendre le principe ! (Notez-le…)

3-2-5-1 - Marqué avec \Deleted

Il faut utiliser la commande STORE pour placer sur le message visé le flag \Deleted :

50 store 6 +FLAGS (\Deleted)
* 6 FETCH (FLAGS (\Deleted \Seen))
50 OK Store completed.
60 uid fetch 1:* (FLAGS)
* 1 FETCH (FLAGS (\Seen) UID 1)
* 2 FETCH (FLAGS (\Seen) UID 2)
* 3 FETCH (FLAGS (\Seen) UID 3)
* 4 FETCH (FLAGS (\Seen) UID 4)
* 5 FETCH (FLAGS () UID 5)
* 6 FETCH (FLAGS (\Deleted \Seen) UID 6)
60 OK Fetch completed.

Vous l'avez compris, ceci n'a rien effacé du tout. Nous avons juste ajouté le flag \Deleted au message d'index 6. Dans les MUA graphiques, cette opération peut être diversement visualisée :

- le message semble avoir disparu, ce qui est une très mauvaise approche, car l'utilisateur non averti peut penser légitimement que le message est détruit ;

- le message apparait barré, mais est toujours visible. C'est probablement la meilleure approche.

Devinez laquelle choisissent la plupart des MUA ? La première bien sûr. Non contents de ça, ils créent automatiquement un répertoire Trash dans lequel ils copient les messages marqués comme effacés. Moralité, l'utilisateur (non averti) croit faire du ménage, en fait, il ajoute des copies de messages en plus dans son espace, en attendant de vider la poubelle.

Ce détail a son importance lorsque l'on a atteint le quota fixé par le fournisseur du service. Refaire un peu de place peut s'avérer impossible si l'on n'a pas compris ce fonctionnement.

3-2-5-2 - EXPUNGE ou CLOSE

EXPUNGE a pour mission de détruire physiquement tous les messages marqués \Deleted dans le dossier courant. CLOSE fait la même chose en refermant le dossier courant. Exemple :

70 close
70 OK Close completed.
80 select "INBOX"
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
* 5 EXISTS
* 0 RECENT
* OK [UNSEEN 5] First unseen.
* OK [UIDVALIDITY 1216295789] UIDs valid
* OK [UIDNEXT 7] Predicted next UID
80 OK [READ-WRITE] Select completed.
90 uid fetch 1:* (FLAGS)
* 1 FETCH (FLAGS (\Seen) UID 1)
* 2 FETCH (FLAGS (\Seen) UID 2)
* 3 FETCH (FLAGS (\Seen) UID 3)
* 4 FETCH (FLAGS (\Seen) UID 4)
* 5 FETCH (FLAGS () UID 5)
90 OK Fetch completed.

Le message d'index 6, qui était marqué \Deleted a bien disparu de INBOX. EXPUNGE et CLOSE sont de vrais effaceurs.

Malheureusement, les MUA communs n'emploient pas par défaut ni l'un ni l'autre de ces effaceurs. Thunderbird peut le faire si on le lui demande, mais il faut passer par la configuration avancée et ce n'est pas trivial pour l'utilisateur (non averti).

3-3 - Jouons un peu

Ami lecteur, le temps est maintenant venu pour toi de vérifier que tu as bien assimilé tout ceci. Pour t'aider dans cette quête, une petite épreuve. Voici une suite de commandes IMAP. À toi de comprendre ce qui est fait et d'expliquer.

3-3-1 - État initial

Notre compte se présente comme ceci dans Thunderbird :

Il y a donc trois messages dans INBOX.

3-3-2 - Jeu de commandes

Nous nous connectons avec Telnet sur le serveur et envoyons les commandes suivantes :

10 login chris@maison.mrs epikoi
10 OK Logged in.
20 list "*" "*"
* LIST (\HasNoChildren) "." "Trash"
* LIST (\HasNoChildren) "." "INBOX"
20 OK List completed.
30 create Dossier_1
30 OK Create completed.
40 create Dossier_1.SousDossier_1
40 OK Create completed.
50 create INBOX.Rangement
50 OK Create completed.
60 subscribe INBOX.Rangement
60 OK Subscribe completed.
70 subscribe Dossier_1
70 OK Subscribe completed.
80 subscribe Dossier_1.SousDossier_1
80 OK Subscribe completed.
90 select INBOX
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
* 3 EXISTS
* 0 RECENT
* OK [UNSEEN 1] First unseen.
* OK [UIDVALIDITY 1216295789] UIDs valid
* OK [UIDNEXT 10] Predicted next UID
90 OK [READ-WRITE] Select completed.
100 rename Dossier_1 Archive
100 OK Rename completed.
110 list "*" "*"
* LIST (\HasNoChildren) "." "Trash"
* LIST (\HasChildren) "." "INBOX"
* LIST (\HasChildren) "." "Archive"
* LIST (\HasNoChildren) "." "INBOX.Rangement"
* LIST (\HasNoChildren) "." "Archive.SousDossier_1"
110 OK List completed.
120 rename Archive.SousDossier_1 Archive.2007-2008
120 OK Rename completed.
130 uid fetch 1:* (FLAGS)
* 1 FETCH (FLAGS () UID 7)
* 2 FETCH (FLAGS () UID 8)
* 3 FETCH (FLAGS () UID 9)
130 OK Fetch completed.
140 copy 1:2 Archive.2007-2008
140 OK Copy completed.
150 copy 3 INBOX.Rangement
150 OK Copy completed.
160 store 1:3 +FLAGS (\Deleted)
* 1 FETCH (FLAGS (\Deleted))
* 2 FETCH (FLAGS (\Deleted))
* 3 FETCH (FLAGS (\Deleted))
160 OK Store completed.
170 expunge
* 3 EXPUNGE
* 2 EXPUNGE
* 1 EXPUNGE
170 OK Expunge completed.
180 logout
* BYE Logging out
180 OK Logout completed.
Connection closed by foreign host.

Ami lecteur, peux-tu prévoir ce que le client va désormais trouver dans son Thunderbird, à la prochaine ouverture ?

3-3-3 - État final

Ami lecteur, avais-tu vu le piège ?

Reprenons avec Telnet :

10 login chris@maison.mrs epikoi
10 OK Logged in.
20 lsub "*" "*"
* LSUB () "." "INBOX.Rangement"
* LSUB () "." "Dossier_1"
* LSUB () "." "Dossier_1.SousDossier_1"
20 OK Lsub completed.

Ce n'est pas parce que l'on a renommé les dossiers que les abonnements ont été mis à jour. Il faut le faire manuellement :

30 unsubscribe Dossier_1
30 OK Unsubscribe completed.
40 unsubscribe Dossier_1.SousDossier_1
40 OK Unsubscribe completed.
50 list "*" "*"
* LIST (\HasNoChildren) "." "Trash"
* LIST (\HasChildren) "." "INBOX"
* LIST (\HasChildren) "." "Archive"
* LIST (\HasNoChildren) "." "INBOX.Rangement"
* LIST (\HasNoChildren) "." "Archive.2007-2008"
50 OK List completed.
60 subscribe Archive
60 OK Subscribe completed.
70 subscribe Archive.2007-2008
70 OK Subscribe completed.
80 logout
* BYE Logging out
80 OK Logout completed.

Voilà qui devrait aller mieux :

Nettement. Les dossiers sont à jour et leur contenu aussi.

Puisque nous y sommes et puisque nous avons la main sur le serveur (Dovecot, en l'occurrence)…

janus:/home/virtual/mail/maison.mrs/chris/Maildir# ls -la
total 44
drwx------ 9 vmail vmail  4096 2008-07-20 19:31 .
drwx------ 3 vmail vmail    20 2008-07-17 13:56 ..
drwx------ 5 vmail vmail    56 2008-07-20 19:10 .Archive
drwx------ 5 vmail vmail   148 2008-07-20 19:35 .Archive.2007-2008
drwx------ 2 vmail vmail     6 2008-07-20 19:21 cur
-rw------- 1 vmail vmail   144 2008-07-20 19:21 dovecot.index
-rw------- 1 vmail vmail 20480 2008-07-20 19:21 dovecot.index.cache
-rw------- 1 vmail vmail  2984 2008-07-20 19:23 dovecot.index.log
-rw------- 1 vmail vmail   377 2008-07-20 19:05 dovecot-uidlist
drwx------ 5 vmail vmail   148 2008-07-20 19:36 .INBOX.Rangement
-rw------- 1 vmail vmail   138 2008-07-20 19:21 maildirsize
drwx------ 2 vmail vmail     6 2008-07-20 19:05 new
-rw------- 1 vmail vmail    42 2008-07-20 19:31 subscriptions
drwx------ 2 vmail vmail     6 2008-07-20 19:05 tmp
drwx------ 5 vmail vmail   148 2008-07-20 19:04 .Trash

Notez les analogies, mais INBOX n'y est pas ?

C'est normal. En fait, Dovecot range dans new les messages qui ne sont pas encore \Seen et dans cur les messages \Seen. INBOX est donc en réalité un « faux dossier » qui représente le contenu de new et de cur.

Nous sommes dans une architecture de type Maildir la plus courante pour faire de l'IMAP. Dovecot, comme Courier-imap rangent les messages à peu près de la même manière. En revanche, Cyrus-imap utilise une autre stratégie, mais pour le client comme pour le protocole, ceci importe peu.

3-4 - Conclusion

Tout ceci avait pour but de montrer la supériorité d'IMAP sur son concurrent POP3. Sa plus grande complexité aussi.

IMAPS, tout comme POP3S, utilise une connexion entièrement chiffrée dès le départ, mais les protocoles demeurent identiques. IMAP, tout comme POP3, peut implémenter la commande STARTTLS, qui met en œuvre un chiffrement, mais après établissement de la connexion. De plus, comme il y a négociation, si le client invoque STARTTLS et que le serveur ne sait pas y répondre, il est possible de continuer sans chiffrement (suivant la configuration du MUA).

IMAPS n'utilise pas le port 143, mais le port 993.

4 - Remerciements Developpez

Vous pouvez retrouver l'article original ici : L'Internet Rapide et Permanent. Christian Caleca a aimablement autorisé l'équipe « Réseaux » de Developpez.com à reprendre son article. Retrouvez tous les articles de Christian Caleca sur cette page.

Nos remerciements à ClaudeLELOUP pour la relecture orthographique de cet article.

N'hésitez pas à commenter cet article ! Commentez