Internet Message Access Protocol
Norme utilisée par Up ! Mail
La norme Internet Message Access Protocol (IMAP) permet de manipuler les boîtes aux lettres ainsi qu'envoyer un courrier électronique d'un client vers un serveur ou qu'en recevoir depuis un serveur vers un client.
La communication au format Internet Message Access Protocol (IMAP) s'effectue sur un flux dont le transport est TCP-IP. Ce flux est texte ou binaire.
La communication est à l'initiative du client : il pose une ou plusieurs requêtes et le serveur répond en asynchrone. La conversation n'est pas synchrone mais différée. Le port d'écoute du serveur est usuellement 143.
- APPEND.
Réception d'un courrier électronique. Le premier paramètre est le nom de la boîte, suivi éventuellement des paramètres représentant la date de création du courrier et ses attributs.
- AUTHENTICATE.
Authentification du client. Le paramètre est le mode d'authentification.
- CAPABILITY.
Listage des capacités supportées i.e. IMAP et ses éventuelles extensions.
- CHECK.
Vérification de l'intégrité des boites aux lettres.
- CLOSE.
Fin de la communication.
- COPY.
Copie d'un ensemble de courriers dans un répertoire de la boite aux lettres. Le premier paramètre est la plage de numéros des courriers, le second le répertoire.
- CREATE.
Création d'un répertoire dans la boite aux lettres. Le paramètre est le répertoire. Le séparateur de répertoire est donné par la commande LIST.
- DELETE.
Suppression d'un répertoire de la boite aux lettres. Le paramètre est le répertoire. Le séparateur de répertoire est donné par la commande LIST.
- EXAMINE.
Sélection des courriers dans un répertoire de la boite aux lettres pour lecture seule. Le paramètre est le répertoire. Le séparateur de répertoire est donné par la commande LIST.
- EXPUNGE.
Suppression définitive des courriers conservé dans la poubelle.
- FETCH.
Lecture des caractéristiques des courriers listés. Le premier paramètre est la plage de numéros de courriers et le second une liste de commandes détaillées plus loin.
- LIST.
Listage des sous-répertoires d'une boite aux lettres. Le premier paramètre est le répertoire père et le second le filtre.
- LOGIN.
Le client se connecte de façon traditionnelle. Le premier paramètre est le nom de l'utilisateur et le second le mot de passe.
- LOGOUT.
Le client se déconnecte.
- LSUB.
Listage des abonnés à une mailing list. Le premier paramètre est le nom de l'abonnement et le second le filtre.
- PARTIAL.
Lecture des caractéristiques des courriers listés. Le premier paramètre est la plage de messages et le second une liste de commandes détaillées plus loin. Le troisième et le quatrième paramètres représentent le premier octet et le dernier octet du flux demandé.
- RENAME.
Renommage d'un répertoire de la boite aux lettres. Le premier paramètre est le répertoire initial et le second la cible.
- SEARCH.
Listage des courriers d'un répertoire de la boite aux lettres. Le paramètre optionnel est la page de code. Les numéros des courriers sont retournés.
- SELECT.
Sélection d'un répertoire de la boite aux lettres pour modification. Le paramètre est le répertoire. Le séparateur de répertoire est donné par la commande LIST.
- STORE.
Modifie les attributs d'un courrier. Le premier paramètre est la plage des numéros de courriers. Le second est la liste des commandes à appliquer détaillées plus loin.
- SUBSCRIBE.
Ajoute un utilisateur à un abonnement à des informations de type news group. Le paramètre est le nom de l'abonnement.
- UID COPY.
Copie d'un ensemble de courriers dans un répertoire de la boite aux lettres. Le premier paramètre est la plage des identifiants des courriers, le second le répertoire.
- UID FETCH.
Lecture des caractéristiques des courriers listés. Le premier paramètre est la plage des identifiants des courriers et le second une liste de commandes détaillées plus loin.
- UID SEARCH.
Listage des courriers d'un répertoire de la boite aux lettres. Le paramètre optionnel est la page de codes. Les identifiants des courriers sont retournés.
- UID STORE.
Modifie les attributs d'un courrier. Le premier paramètre est la plage des identifiants de courriers. Le second est la liste des commandes à appliquer détaillées plus loin.
- UNSUBSCRIBE.
Supprime un utilisateur d'un abonnement à des informations de type news group. Le paramètre est le nom de l'abonnement.
Les lignes d'une requête commencent par une étiquette les identifiants de façon unique étant donné que la conversation est asynchone entre le client et le serveur.
Les lignes de la requête sont terminées par les caractères retour chariot \r et retour chariot \n.
La dernière ligne de la commande APPEND est suivie par le contenu du courrier électronique au format Rfc 822.
Voici le format des données :
- Binaire.
Directement et préfixé par sa taille entre caractères accolade ouvrante { ou accolade fermante }.
{6}\r\n
coucou\r\n
- Chaîne de caractères.
Elle s'écrit soit :
- Entre caractères guillemet ".
coucou\r\n
- Directement et préfixée par sa taille entre caractères accolade ouvrante { ou accolade fermante }.
{6}\r\n
coucou\r\n
- Date.
Le format est le même que celui employé en Rfc 822.
Thu, 20 Dec 2005 18:53:32 -0000\r\n
La réponse à la requête est une ou plusieurs lignes de texte comportant :
- L'étiquette.
Elle identifie la ligne de la requête émise par le client.
- Le code retour.
Un code retour OK traduit un bon fonctionnement. Un code retour NO traduit une erreur de fonctionnement. Un code retour BAD traduit une erreur technique.
Une ligne commençant par autre chose, en particulier le caractère multiplication *
indique une ligne d'information complémentaire.
- Le texte libre.
Il s'agit du message correspond au code ou d'un message formaté ou, selon la commande :
- EXAMINE.
- Le nombre de courriers dans le répertoire.
* 20 EXISTS \r\n
- Le nombre de courriers récents dans le répertoire.
* 3 RECENT \r\n
- Le numéro du premier courrier non lu du répertoire.
* OK [UNSEEN 17] Message 17 is first unseen \r\n
- Les propriétes volatiles des courriers supportées par la messagerie en mode lecture seule.
* OK [PERMANENTFLAGS ()] No permanent flags permitted \r\n
- Les propriétes persistantes des courriers supportées par la messagerie.
* OK [PERMANENTFLAGS (\Answered \Deleted \Draft \Flagged \Recent \Seen)] Limited \r\n
- FETCH.
Pour chaque courrier, son numéro puis l'énumération des couples (verbe, valeur) en résultat de la requête. Pour plus d'explications, voire plus loin.
* 1 FETCH ... \r\n
* 2 FETCH ... \r\n
* 3 FETCH ... \r\n
- EXPUNGE.
Pour chaque courrier, son numéro.
* 1 EXPUNGE \r\n
* 2 EXPUNGE \r\n
* 3 EXPUNGE \r\n
- LIST.
Pour chaque sous-répertoire, le séparateur de répertoires et son nom.
* LIST () "/" sous-repertoire-a \r\n
* LIST () "/" sous-repertoire-b \r\n
* LIST () "/" sous-repertoire-c \r\n
- LSUB.
Pour chaque abonné, le séparateur de répertoires et son nom.
* LSUB () "." "mon-abonne-a@mon-domaine.com" \r\n
* LSUB () "." "mon-abonne-b@mon-domaine.com" \r\n
* LSUB () "." "mon-abonne-b@mon-domaine.com" \r\n
- PARTIAL.
Pour chaque courrier, son numéro puis l'énumération des couples (verbe, valeur) tronquée en résultat de la requête. Pour plus d'explications, voire plus loin.
* 1 FETCH ... \r\n
* 2 FETCH ... \r\n
* 3 FETCH ... \r\n
- SEARCH.
Le nombre de courriers correspondant au critère de sélection puis les numéros des courriers correspondants.
* 3 5 6 8 \r\n
- SELECT.
- Le nombre de courriers dans le répertoire.
* 20 EXISTS \r\n
- Le nombre de courriers récents dans le répertoire.
* 3 RECENT \r\n
- Le numéro du premier courrier non lu du répertoire.
* OK [UNSEEN 17] Message 17 is first unseen \r\n
- Les propriétes volatiles des courriers supportées par la messagerie en mode lecture-écriture.
* FLAGS (\Answered \Deleted \Draft \Flagged \Recent \Seen) \r\n
- Les propriétes persistantes des courriers supportées par la messagerie.
* OK [PERMANENTFLAGS (\Answered \Deleted \Draft \Flagged \Recent \Seen)] Limited \r\n
- STORE.
Pour chaque courrier, son numéro puis l'énumération de ses propriétés une fois mises à jour.
* 1 FETCH FLAGS (\Recent) \r\n
* 2 FETCH FLAGS (\Flagged \Seen) \r\n
* 3 FETCH FLAGS (\Deleted \Seen) \r\n
- UID FETCH.
Pour chaque courrier, son numéro d'identification puis l'énumération des couples (verbe, valeur) en résultat de la requête. Pour plus de précisions, voir plus loin.
* 100011 FETCH ... \r\n
* 100012 FETCH ... \r\n
* 100013 FETCH ... \r\n
- UID SEARCH.
Le nombre de courriers correspondant au critère de sélection puis les identifiants des courriers correspondants.
* 3 100015 100016 100018 \r\n
- STORE.
Pour chaque courrier, son identification puis l'énumération de ses propriétés une fois mises à jour.
* 100011 FETCH FLAGS (\Recent) \r\n
* 100012 FETCH FLAGS (\Flagged \Seen) \r\n
* 100013 FETCH FLAGS (\Deleted \Seen) \r\n
Les lignes de la réponse sont terminées par les caractères saut de ligne \r et retour chariot \n.
Verbes d'Internet Message Access Protocol
Verbes de FETCH ou UID FETCH
- ALL
Equivalent FLAGS INTERNALDATE RFC822.SIZE ENVELOPE.
- BODYSTRUCTURE
Certaines propriétés de l'en-tête du courrier formaté en liste soit pour le courrier, soit pour chaque partie du courrier :
- Content-Type
- Content-ID
- Content-Description
- Content-Encoding
- Taille du corps .
- Pour le type de contenu message/rfc822, son enveloppe présentée plus loin.
- Pour le type de contenu text, le nombre de lignes du corps.
- Eventuellement des propriétés d'extension.
BODYSTRUCTURE ("text" "plain" ("charset" "US-Ascii") "1" "Principal" "Base64" 1024 12) \r\n
- BODY
Comme BODYSTRUCTURE, sans les propriétés d'extension.
A l'issu, le courrier est considéré comme lu.
BODYSTRUCTURE ("image" "gif" "2" "Illustration" "Base64" 2048) \r\n
- BODY[n]
Comme BODYSTRUCTURE, sans les propriétés d'extension, soit pour le corps du courrier avec 0, soit pour la n-ième pièce jointe.
A l'issu, le courrier est considéré comme lu.
- BODY.PEEK[n]
Comme BODYSTRUCTURE, sans les propriétés d'extension, soit pour le corps du courrier avec 0, soit pour la n-ième pièce jointe.
A l'issu, l'état de lecture du courrier est inchangé.
- ENVELOPE
Certaines propriétés de l'en-tête du courrier formaté en liste soit pour le courrier, soit pour chaque partie du courrier :
- Date
- Subject
- Sender
- Reply-To
- To
- Cc
- Bcc
- In-Reply-To
- Message-ID
ENVELOPE ("Thu, 20 Dec 2005 18:53:32 -0000" \r\n
"Ceci est un essai" \r\n
(("Jean-Pierre DUVAL" NIL "jp.duval" "up-comp.com")) \r\n
(("Jean-Pierre DUVAL" NIL "jp.duval" "up-comp.com")) \r\n
(("Christian COATRINE" NIL "c.coatrine" "up-comp.com")) \r\n
((NIL NIL "" "up-comp.com")) \r\n
((NIL NIL "" "up-comp.com")) \r\n
(("Jean-Pierre DUVAL" NIL "jp.duval" "up-comp.com")) \r\n
"<123567.101010@up-comp.com>") \r\n
- FAST
Equivalent FLAGS INTERNALDATE RFC822.SIZE.
- FLAGS
Propriétés du courrier électronique.
FLAGS (\Seen \Flagged) \r\n
- FULL
Equivalent FLAGS INTERNALDATE RFC822.SIZE ENVELOPE BODY.
- INTERNALDATE
Date d'enregistrement du courrier dans la messagerie.
INTERNALDATE "Thu, 20 Dec 2005 18:53:32 -0000" \r\n
- RFC822
Contenu complet du courrier tel que reçu. La taille du flux est écrite entre caractères accolade ouvrante { et accolade fermante }.
A l'issu, le courrier est considéré comme lu.
RFC822 {128} \r\n
... \r\n
- RFC822.HEADER
En-tête du courrier tel que reçu avec la ligne vide de séparation d'avec le corps. La taille du flux est écrite entre caractères accolade ouvrante { et accolade fermante }.
RFC822.HEADER {128} \r\n
... \r\n
- RFC822.HEADER.LINES
Lignes de l'en-tête du courrier tel que reçu correspondant aux propriétés demandées. La taille du flux est écrite entre caractères accolade ouvrante { et accolade fermante }.
RFC822.HEADER.LINES (FROM TO) {128} \r\n
... \r\n
- RFC822.HEADER.LINES.NOT
Lignes de l'en-tête du courrier tel que reçu ne correspondant pas aux propriétés demandées. La taille du flux est écrite entre caractères accolade ouvrante { et accolade fermante }.
RFC822.HEADER.LINES.NOT (FROM TO) {128} \r\n
... \r\n
- RFC822.SIZE
Taille du contenu complet du courrier tel que reçu.
RFC822.SIZE 128 \r\n
- RFC822.TEXT
Corps du courrier. La taille du flux est écrite entre caractères accolade ouvrante { et accolade fermante }.
A l'issu, le courrier est considéré comme lu.
RFC822.TEXT {128} \r\n
... \r\n
- RFC822.TEXT.PEEK
Corps du courrier. La taille du flux est écrite entre caractères accolade ouvrante { et accolade fermante }.
A l'issu, l'état de lecture du courrier est inchangé.
RFC822.TEXT.PEEK {128} \r\n
... \r\n
- UID
Identification du courrier électronique.
UID 1000011 \r\n
Verbes de SEARCH ou UID SEARCH
- AND
Vrai si les deux critères suivants sont Vrai.
NOT NEW AND NOT DELETED \r\n
- ANSWERED
Vrai si le destinataire a répondu au courrier.
ANSWERED \r\n
- BCC
Vrai si un des destinataires en copie cachée correspond au modèle.
BCC "jp.%" \r\n
- BEFORE
Vrai si le courrier a été enregistré avant la date passée en paramètre.
BEFORE "Thu, 20 Dec 2005 18:53:32 -0000" \r\n
- BODY
Vrai si le corps du courrier correspond au modèle.
BODY "bonjour" \r\n
- CC
Vrai si un des destinataires en copie correspond au modèle.
CC "jp.%" \r\n
- DELETED
Vrai si le courrier a été supprimé.
DELETED \r\n
- DRAFT
Vrai si le courrier est un brouillon.
DRAFT \r\n
- FLAGGED
Vrai si le courrier est urgent.
FLAGGED \r\n
- FROM
Vrai si un des émetteurs correspond au modèle.
FROM "jp.%" \r\n
- HEADER
Vrai si la propriété de l'en-tête du courrier passée en premier paramètre a pour valeur le second paramètre.
HEADER "To" "contact@up-comp.com" \r\n
- KEYWORD
Vrai si un des mots clé correspond au modèle.
KEYWORD "gcc" \r\n
- LARGER
Vrai si la taille du courrier est supérieure à la valeur du paramètre.
LARGER 1024 \r\n
- NEW
Vrai si le courrier n'a jamais été lu.
NEW \r\n
- NOT
Vrai si le critère suivant est Faux.
NOT NEW \r\n
- ON
Vrai si le courrier a été enregistré à la date passée en paramètre.
ON "Thu, 20 Dec 2005 18:53:32 -0000" \r\n
- OLD
Vrai si le courrier ne vient pas d'être reçu.
OLD \r\n
- OR
Vrai si l'un des deux critères suivants est Vrai.
NOT NEW OR NOT DELETED \r\n
- LATER
Vrai si le courrier a été enregistré après la date passée en paramètre.
SINCE "Thu, 20 Dec 2005 18:53:32 -0000" \r\n
- SEEN
Vrai si le courrier a déjà été lu.
SEEN \r\n
- SENTBEFORE
Vrai si le courrier a été envoyé avant la date passée en paramètre.
SENTBEFORE "Thu, 20 Dec 2005 18:53:32 -0000" \r\n
- SENTON
Vrai si le courrier a été envoyé à la date passée en paramètre.
SENTON "Thu, 20 Dec 2005 18:53:32 -0000" \r\n
- SENTSINCE
Vrai si le courrier a été envoyé après la date passée en paramètre.
SENTSINCE "Thu, 20 Dec 2005 18:53:32 -0000" \r\n
- SMALLER
Vrai si la taille du courrier est inférieure à la valeur du paramètre.
SMALLER 1024 \r\n
- SUBJECT
Vrai si l'objet du courrier correspond au modèle.
SUBJECT "gcc" \r\n
- TEXT
Vrai si le corps du courrier correspond au modèle.
TEXT "gcc" \r\n
- TO
Vrai si un des destinataires correspond au modèle.
TO "jp.%" \r\n
- UID
Vrai si l'identifiant du courrier fait partie de l'intervalle passé en paramètre.
UID "1000011:1000032" \r\n
- UNANSWERED
Vrai si le destinataire n'a pas répondu au courrier.
UNANSWERED \r\n
- UNDELETED
Vrai si le courrier n'a pas été supprimé.
UNDELETED \r\n
- UNDRAFT
Vrai si le courrier n'est pas un brouillon.
UNDRAFT \r\n
- UNFLAGGED
Vrai si le courrier n'est pas urgent.
UNFLAGGED \r\n
- UNKEYWORD
Vrai si aucun mot clé ne correspond au modèle.
UNKEYWORD "gcc" \r\n
- UNSEEN
Vrai si le courrier n'a jamais été lu.
UNSEEN \r\n
Verbes de STORE ou UID STORE
- \Answered
Une réponse au courrier a été envoyé à son émetteur.
- \Deleted
Le courrier a été supprimé.
- \Draft
Le courrier est un brouillon non encore envoyé.
- \Flagged
Le courrier est marqué comme urgent.
- \Recent
Le courrier n'a pas encore été lu.
- \Seen
Le courrier a été lu.
- \Sent
Le courrier a été envoyé.
Syntaxe d'une conversation au format Internet Message Access Protocol
Commandes :
Commande :
Etiquette APPEND
ListeProprietes Chemin { TailleContenu } Contenu \r\n
| Etiquette AUTHENTICATE
ModeAuthentification \r\n
| Etiquette CAPABILITY
\r\n
| Etiquette CHECK
\r\n
| Etiquette CLOSE
\r\n
| Etiquette COPY
DebutPlage :
FinPlage \r\n
| Etiquette CREATE
Chemin \r\n
| Etiquette DELETE
Chemin \r\n
| Etiquette EXAMINE
Chemin \r\n
| Etiquette EXPUNGE
\r\n
| Etiquette FETCH
DebutPlage :
FinPlage \r\n
| Etiquette LIST
Chemin Filtre \r\n
| Etiquette LOGIN
NomUtilisateur MotDePasse \r\n
| Etiquette LOGOUT
\r\n
| Etiquette LSUB
Abonnement Filtre \r\n
| Etiquette NOOP
\r\n
| Etiquette PARTIAL
NumeroMessage CommandePartiel PremierOctet NbOctets \r\n
| Etiquette RENAME
CheminAvant CheminApres \r\n
| Etiquette SEARCH
PageDeCodes CommandesRecherche \r\n
| Etiquette SELECT
Chemin \r\n
| Etiquette STORE
DebutPlage :
FinPlage CommandePropriete ListeProprietes \r\n
| Etiquette SUBSCRIBE
Abonnement \r\n
| Etiquette UID COPY
DebutPlage :
FinPlage \r\n
| Etiquette UID FETCH
DebutPlage :
FinPlage \r\n
| Etiquette UID SEARCH
PageDeCodes ListeDeCommandesRecherche \r\n
| Etiquette UID STORE
DebutPlage :
FinPlage CommandePropriete ListeProprietes \r\n
| Etiquette UNSUBSCRIBE
Abonnement \r\n
;
ListeProprietes :
ListeProprietes2 :
Propriete :
\Answered
| \Deleted
| \Draft
| \Flagged
| \Recent
| \Seen
| \Sent
;
CommandePartiel :
BODY
| BODY [
NumeroPartie ]
| BODY . PEEK [
NumeroPartie ]
| RFC822
| RFC822 . HEADER
| RFC822 . PEEK
| RFC822 . TEXT
| RFC822 . TEXT . PEEK
;
PageDeCodes :
US-Ascii
| ISO-8859-1
| ISO-8859-2
| ISO-8859-9
| ISO-8859-10
| UTF-8
| UTF-16
;
ListeDeCommandesRecherche :
CommandeRecherche :
(
CommandeRecherche )
| CommandeRecherche AND
CommandeRecherche
| CommandeRecherche OR
CommandeRecherche
| ALL
| ANSWERED
| BCC
ChaineModele
| BEFORE
Date
| BODY
ChaineModele
| CC
ChaineModele
| DELETED
| DRAFT
| FLAGGED
| FROM
ChaineModele
| HEADER
NomPropriete ValeurPropriete
| KEYWORD
ChaineModele
| LARGER
Taille
| NEW
| NOT
CommandeRecherche
| OLD
| ON
Date
| RECENT
| SEEN
| SENTBEFORE
Date
| SENTON
Date
| SENTSINCE
Date
| SINCE
Date
| SMALLER
Taille
| SUBJECT
ChaineModele
| TEXT
ChaineModele
| TO
ChaineModele
| UID
DebutPlage :
FinPlage \r\n
| UNANSWERED
| UNDELETED
| UNDRAFT
| UNFLAGGED
| UNKEYWORD
ChaineModele
| UNSEEN
;
CommandePropriete :
FLAGS
| FLAGS . SILENT
| + FLAGS
| + FLAGS . SILENT
| - FLAGS
| - FLAGS . SILENT
;
Exemple d'une conversation au format Internet Message Access Protocol
Cette conversation comporte que le flux de contrôle vu du client :
ID00001 CAPABILITY\r\n
ID00002 LOGIN MonUtilisateur MonMotDePasse\r\n
ID00003 SELECT "INBOX" "*"\r\n
ID00004 LIST "INBOX" "*"\r\n
ID00005 FETCH 1:3 RFC822\r\n
ID00006 APPEND (\Seen) "documents" {128}\r\n
...\r\n
ID00007 LOGOUT\r\n
ID00008 CLOSE\r\n