Outils pour utilisateurs

Outils du site


Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
090_applicatifs:190imap:030_commandes [le 16/02/2025 à 14:36] – supprimée - modification externe (Date inconnue) 127.0.0.1090_applicatifs:190imap:030_commandes [le 16/02/2025 à 14:36] (Version actuelle) – ↷ Page déplacée de 050_applicatifs:190imap:030_commandes à 090_applicatifs:190imap:030_commandes prof
Ligne 1: Ligne 1:
 +====== Les commandes d'IMAP ======
 +
 +Entrons maintenant qans le vif du sujet. Il y a quelques RFCs qui définissent IMAP4 tel qu'il est utilisé actuellement. Les voici :
 +^RFC^Titre^Commentaire|
 +|[[ftp://ftp.rfc-editor.org/in-notes/rfc2060.txt|2060]]|INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1|//Pour mémoire// |
 +|[[ftp://ftp.rfc-editor.org/in-notes/rfc2087.txt|2087]]|IMAP4 QUOTA extension| |
 +|[[ftp://ftp.rfc-editor.org/in-notes/rfc3501.txt|3501]]|INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1|Obsoletes: 2060|
 +|[[ftp://ftp.rfc-editor.org/in-notes/rfc3502.txt|3502]]|Internet Message Access Protocol (IMAP) - MULTIAPPEND Extension| |
 +|[[ftp://ftp.rfc-editor.org/in-notes/rfc3691.txt|3691]]|Internet Message Access Protocol (IMAP) UNSELECT command| |
 +|[[ftp://ftp.rfc-editor.org/in-notes/rfc4314.txt|4314]]|IMAP4 Access Control List (ACL) Extension| |
 +|[[ftp://ftp.rfc-editor.org/in-notes/rfc4315.txt|4315]]|Internet Message Access Protocol (IMAP) - UIDPLUS extension| |
 +|[[ftp://ftp.rfc-editor.org/in-notes/rfc4466.txt|4466]]|Collected Extensions to IMAP4 ABNF| Updates: 2088, 2342, 3501, 3502, 3516|
 +|[[ftp://ftp.rfc-editor.org/in-notes/rfc4469.txt|4469]]|Internet Message Access Protocol (IMAP) CATENATE Extension| Updates: 3501, 3502|
 +|[[ftp://ftp.rfc-editor.org/in-notes/rfc4978.txt|4978]]|The IMAP COMPRESS Extension| |
 +|[[ftp://ftp.rfc-editor.org/in-notes/rfc5032.txt|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.
 +
 +
 +===== Petit dialogue en IMAP =====
 +{{:imap:exemple1.png |}}
 +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.
 +
 +
 +
 +
 +<html><div style="clear: both"></div><pre class="code">
 +
 +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: <span class="hly">1 capability</span>
 +      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: <span class="hly">2 authenticate plain</span>
 +      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: <span class="hly">3 namespace</span>
 +     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: <span class="hly">4 lsub "" "*"</span>
 +     17 1.753294    janus.maison.mrs      pchris.maison.mrs     IMAP     Response: * LSUB () "." "Trash"
 +     18 1.754174    pchris.maison.mrs     janus.maison.mrs      IMAP     Request: <span class="hly">5 list "" "INBOX"</span>
 +     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: <span class="hly">6 select "INBOX"</span>
 +     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: <span class="hly">7 getquotaroot "INBOX"</span>
 +     23 1.765468    janus.maison.mrs      pchris.maison.mrs     IMAP     Response: * QUOTAROOT "INBOX" ""
 +     24 1.765912    pchris.maison.mrs     janus.maison.mrs      IMAP     Request: <span class="hly">8 UID fetch 1:* (FLAGS)</span>
 +     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: <span class="hly">9 IDLE</span>
 +     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: <span class="hly">10 close</span>
 +     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: <span class="hly">11 logout</span>
 +     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.
 +</pre></html>
 +
 +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 connaitre 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é [[:aaatips:10_thunderbird#avec_imap|dans cette astuce]]|
 +|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.
 +
 +===== 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.
 +==== 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 MUAs les plus évolués.
 +
 +==== 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.
 +==== 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 perticuliè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|
 +
 +==== 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é.
 +
 +== 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.
 +== LSUB et LIST ==
 +Ces deux commandes permettent de savoir quels sont les répertoires souscrits et existants. Exemple :
 +<code>
 +* 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.
 +</code>
 +
 +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.
 +== 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 :
 +<code>
 +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.
 +</code>
 +
 +Le fait de sélectionner ''INBOX'' nous apprend principalement que dedans il y a :
 +  * 6 messages ;
 +  * 1 est ''RECENT'' ;
 +  * le premier message non lu a l'index 5.
 +== 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 :
 +<code>
 +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.
 +</code>
 +
 +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 :
 +<code>
 +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.
 +</code>
 +
 +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 :
 +<code>
 +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 10024)
 + 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.
 +</code>
 +''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''.
 +== 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.
 +
 +==== Supprimer un message ====
 +Vous avez bien lu jusqu'au bout tous les RFCs 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...).
 +
 +=== Marqué avec \Deleted ===
 +Il faut utiliser la commande ''STORE'' pour placer sur le message visé le flag ''\Deleted'' :
 +<code>
 +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.
 +</code>
 +
 +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.
 +
 +=== 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 :
 +<code>
 +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.
 +</code>
 +
 +Le message d'index 6, qui était marqué ''\Deleted'' à bien disparu de ''INBOX''. EXPUNGE et CLOSE sont de vrais effaceurs.
 +
 +Malheureusement, les MUA communs n'emploient pas par défaut n'i l'un ni l'autre de ces effaceurs. Thunderbird peut le faire si on le lui demande, mais il faut passer par la [[:aaatips:10_thunderbird#avec_imap|configuration avancée]] et ce n'est pas trivial pour l'utilisateur (non averti).
 +===== Jouons un peu =====
 +Ami lecteur, pour toi de vérifier que tu as bien assimilé tout ceci le temps maintenant est venu. Pour t'aider dans cette quête, une petite épreuve voici. Une suite de commandes IMAP va suivre. A toi ce qui est fait, de comprendre et d'expliquer .
 +
 +==== Etat initial ====
 +Notre compte se présente comme ceci dans Thunderbird :
 +{{ :imap:exemple2.png?600 |}}
 +Il y a donc 3 messages dans INBOX.
 +
 +==== Jeu de commandes ====
 +Nous nous connectons avec Telnet sur le serveur et envoyons les commandes suivantes :
 +<code>
 +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.
 +</code>
 +Ami lecteur, peux-tu prévoir ce que le client va désormais trouver dans son Thunderbird, à la prochaine ouverture ?
 +
 +
 +==== Etat final ====
 +{{ :imap:exemple3.png?600 |}}
 +
 +Ami lecteur, avais-tu vu le piège ?
 +
 +Reprenons avec Telnet :
 +<code>
 +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.
 +</code>
 +
 +Ce n'est pas parce que l'on a renommé les dossiers, que les abonnements ont été mis à jour. Il faut le faire manuellement :
 +<code>
 +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.
 +</code>
 +
 +Voilà qui devrait aller mieux :
 +{{ :imap:exemple4.png?600 |}}
 +Nettement. Les dossiers sont à jour et leur contenu aussi.
 +{{ :imap:exemple5.png?600 |}}
 +Puisque nous y sommes et puisque nous avons la main sur le serveur (Dovecot, en l'occurrence)...
 +<code>
 +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
 +</code>
 +
 +Notez les analogies, mais INBOX n'y est pas ?
 +
 +C'est normal. En fait, Dovecot range dans ''new'' les message 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.
 +===== 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, utilisent 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. 
  
Les commandes d'IMAP: Dernière modification le: 01/01/1970 à 00:00 par