9. Syntaxe formelle
RFC 3501 IMAPv4 March 2003
-
Exemple de connexion IMAP4rev1Ce qui suit est une transcription d'une connexion IMAP4rev1. Une ligne longue dans cet exemple est coupée pour la clarté éditoriale.
S: * OK IMAP4rev1 Service Ready
C: a001 login mrc secret
S: a001 OK LOGIN completed
C: a002 select inbox
S: * 18 EXISTS
S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
S: * 2 RECENT
S: * OK [UNSEEN 17] Message 17 is the first unseen message
S: * OK [UIDVALIDITY 3857529045] UIDs valid
S: a002 OK [READ-WRITE] SELECT completed
C: a003 fetch 12 full
S: * 12 FETCH (FLAGS (\Seen) INTERNALDATE "17-Jul-1996 02:44:25 -0700"
RFC822.SIZE 4286 ENVELOPE ("Wed, 17 Jul 1996 02:23:25 -0700 (PDT)"
"IMAP4rev1 WG mtg summary and minutes"
(("Terry Gray" NIL "gray" "cac.washington.edu"))
(("Terry Gray" NIL "gray" "cac.washington.edu"))
(("Terry Gray" NIL "gray" "cac.washington.edu"))
((NIL NIL "imap" "cac.washington.edu"))
((NIL NIL "minutes" "CNRI.Reston.VA.US")
("John Klensin" NIL "KLENSIN" "MIT.EDU")) NIL NIL
"<[email protected]>")
BODY ("TEXT" "PLAIN" ("CHARSET" "US-ASCII") NIL NIL "7BIT" 3028
92))
S: a003 OK FETCH completed
C: a004 fetch 12 body[header]
S: * 12 FETCH (BODY[HEADER] {342}
S: Date: Wed, 17 Jul 1996 02:23:25 -0700 (PDT)
S: From: Terry Gray <[email protected]>
S: Subject: IMAP4rev1 WG mtg summary and minutes
S: To: [email protected]
S: cc: [email protected], John Klensin <[email protected]>
S: Message-Id: <[email protected]>
S: MIME-Version: 1.0
S: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII
S:
S: )
S: a004 OK FETCH completed
C: a005 store 12 +flags \deleted
S: * 12 FETCH (FLAGS (\Seen \Deleted))
S: a005 OK +FLAGS completed
C: a006 logout
S: * BYE IMAP4rev1 server terminating connection
S: a006 OK LOGOUT completed
RFC 3501 IMAPv4 March 2003
-
Syntaxe formelleLes spécifications de syntaxe ci-dessous utilisent la notation ABNF (Augmented Backus-Naur Form) étendue telle que spécifiée dans [ABNF].
Lorsqu'une règle ultérieure chevauche une règle antérieure en tant qu'alternative ou règle facultative, la règle listée plus tôt prévaut (MUST). Par exemple, "\Seen" analysé comme indicateur est le nom d'indicateur \Seen et non un flag-extension, même s'il peut être analysé comme flag-extension. Voici quelques-uns (mais pas tous) des cas de cette règle.
Note : les règles de [ABNF] DOIVENT (MUST) être suivies strictement.
En particulier :
(1) Sauf indication contraire, toutes les lettres ne distinguent pas
les majuscules des minuscules. L'utilisation de majuscules ou de
minuscules pour définir des chaînes de jetons est destinée uniquement
à la clarté éditoriale. Les implémentations DOIVENT (MUST) accepter ces
chaînes sans tenir compte de la casse.
(2) Dans tous les cas, SP désigne exactement un espace. La
substitution par une TAB, l'insertion d'espaces supplémentaires ou le
traitement de SP comme équivalent à LWSP ne sont pas autorisés.
(3) Le caractère NUL ASCII, %x00, n'est en aucun cas utilisé (MUST NOT).
address = "(" addr-name SP addr-adl SP addr-mailbox SP addr-host ")"
addr-adl = nstring ; si non NIL, contient la route de [RFC-2822] route-addr
addr-host = nstring ; NIL indique la syntaxe de groupe [RFC-2822]. ; sinon, contient le nom de domaine [RFC-2822]
addr-mailbox = nstring ; NIL indique la fin de groupe [RFC-2822]. si non NIL et ; addr-host est NIL, contient le nom de groupe [RFC-2822]. ; sinon, contient la local-part [RFC-2822] après ; suppression des guillemets [RFC-2822]
RFC 3501 IMAPv4 March 2003
addr-name = nstring ; si non NIL, contient la phrase de mailbox [RFC-2822] ; après suppression des guillemets
append = "APPEND" SP mailbox [SP flag-list] [SP date-time] SP literal
astring = 1*ASTRING-CHAR / string
ASTRING-CHAR = ATOM-CHAR / resp-specials
atom = 1*ATOM-CHAR
ATOM-CHAR = <any CHAR except atom-specials>
atom-specials = "(" / ")" / "\{" / SP / CTL / list-wildcards / quoted-specials / resp-specials
authenticate = "AUTHENTICATE" SP auth-type *(CRLF base64)
auth-type = atom ; défini dans [SASL]
base64 = *(4base64-char) [base64-terminal]
base64-char = ALPHA / DIGIT / "+" / "/" ; sensible à la casse
base64-terminal = (2base64-char "==") / (3base64-char "=")
body = "(" (body-type-1part / body-type-mpart) ")"
body-extension = nstring / number / "(" body-extension *(SP body-extension) ")" ; extension future. Les implémentations client DOIVENT ; (MUST) accepter le champ body-extension. Les ; implémentations serveur ne DOIVENT PAS (MUST NOT) ; générer de champ body-extension, sauf s'il est défini ; par une révision standard ou de piste standard future ; de cette spécification.
body-ext-1part = body-fld-md5 [SP body-fld-dsp [SP body-fld-lang [SP body-fld-loc *(SP body-extension)]]] ; ne DOIT PAS (MUST NOT) être renvoyé par une récupération ; "BODY" non extensible
RFC 3501 IMAPv4 March 2003
body-ext-mpart = body-fld-param [SP body-fld-dsp [SP body-fld-lang [SP body-fld-loc *(SP body-extension)]]] ; ne DOIT PAS (MUST NOT) être renvoyé par une récupération ; "BODY" non extensible
body-fields = body-fld-param SP body-fld-id SP body-fld-desc SP body-fld-enc SP body-fld-octets
body-fld-desc = nstring
body-fld-dsp = "(" string SP body-fld-param ")" / nil
body-fld-enc = (DQUOTE ("7BIT" / "8BIT" / "BINARY" / "BASE64"/ "QUOTED-PRINTABLE") DQUOTE) / string
body-fld-id = nstring
body-fld-lang = nstring / "(" string *(SP string) ")"
body-fld-loc = nstring
body-fld-lines = number
body-fld-md5 = nstring
body-fld-octets = number
body-fld-param = "(" string SP string *(SP string SP string) ")" / nil
body-type-1part = (body-type-basic / body-type-msg / body-type-text) [SP body-ext-1part]
body-type-basic = media-basic SP body-fields ; le sous-type MESSAGE ne DOIT PAS (MUST NOT) être ; "RFC822"
body-type-mpart = 1*body SP media-subtype [SP body-ext-mpart]
body-type-msg = media-message SP body-fields SP envelope SP body SP body-fld-lines
body-type-text = media-text SP body-fields SP body-fld-lines
capability = ("AUTH=" auth-type) / atom ; les nouvelles capacités DOIVENT (MUST) commencer par "X" ; ou être enregistrées auprès de l'IANA en tant que ; standard ou piste standard
RFC 3501 IMAPv4 March 2003
capability-data = "CAPABILITY" *(SP capability) SP "IMAP4rev1" *(SP capability) ; les serveurs DOIVENT (MUST) implémenter les capacités ; STARTTLS, AUTH=PLAIN, LOGINDISABLED ; les serveurs fournissant la compatibilité RFC 1730 ; DOIVENT (MUST) lister "IMAP4" comme première capacité
CHAR8 = %x01-ff ; tout OCTET sauf NUL, %x00
command = tag SP (command-any / command-auth / command-nonauth / command-select) CRLF ; modal selon l'état
command-any = "CAPABILITY" / "LOGOUT" / "NOOP" / x-command ; valide dans tous les états
command-auth = append / create / delete / examine / list / lsub / rename / select / status / subscribe / unsubscribe ; valide uniquement en état authentifié ou sélectionné
command-nonauth = login / authenticate / "STARTTLS" ; valide uniquement en état non authentifié
command-select = "CHECK" / "CLOSE" / "EXPUNGE" / copy / fetch / store / uid / search ; valide uniquement en état sélectionné
continue-req = "+" SP (resp-text / base64) CRLF
copy = "COPY" SP sequence-set SP mailbox
create = "CREATE" SP mailbox ; utiliser INBOX produit une erreur NO
date = date-text / DQUOTE date-text DQUOTE
date-day = 1*2DIGIT ; jour du mois
date-day-fixed = (SP DIGIT) / 2DIGIT ; version à format fixe de date-day
date-month = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" / "Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec"
date-text = date-day "-" date-month "-" date-year
RFC 3501 IMAPv4 March 2003
date-year = 4DIGIT
date-time = DQUOTE date-day-fixed "-" date-month "-" date-year SP time SP zone DQUOTE
delete = "DELETE" SP mailbox ; utiliser INBOX produit une erreur NO
digit-nz = %x31-39 ; 1-9
envelope = "(" env-date SP env-subject SP env-from SP env-sender SP env-reply-to SP env-to SP env-cc SP env-bcc SP env-in-reply-to SP env-message-id ")"
env-bcc = "(" 1*address ")" / nil
env-cc = "(" 1*address ")" / nil
env-date = nstring
env-from = "(" 1*address ")" / nil
env-in-reply-to = nstring
env-message-id = nstring
env-reply-to = "(" 1*address ")" / nil
env-sender = "(" 1*address ")" / nil
env-subject = nstring
env-to = "(" 1*address ")" / nil
examine = "EXAMINE" SP mailbox
fetch = "FETCH" SP sequence-set SP ("ALL" / "FULL" / "FAST" / fetch-att / "(" fetch-att *(SP fetch-att) ")")
fetch-att = "ENVELOPE" / "FLAGS" / "INTERNALDATE" /
"RFC822" [".HEADER" / ".SIZE" / ".TEXT"] /
"BODY" ["STRUCTURE"] / "UID" /
"BODY" section ["<" number "." nz-number ">"] /
"BODY.PEEK" section ["<" number "." nz-number ">"]
RFC 3501 IMAPv4 March 2003
flag = "\Answered" / "\Flagged" / "\Deleted" / "\Seen" / "\Draft" / flag-keyword / flag-extension ; n'inclut pas "\Recent"
flag-extension = "" atom ; extension future. Les implémentations client DOIVENT ; (MUST) accepter les indicateurs flag-extension. Les ; implémentations serveur ne DOIVENT PAS (MUST NOT) ; générer d'indicateur flag-extension, sauf s'il est défini ; par une révision standard ou de piste standard future ; de cette spécification.
flag-fetch = flag / "\Recent"
flag-keyword = atom
flag-list = "(" [flag *(SP flag)] ")"
flag-perm = flag / "*"
greeting = "*" SP (resp-cond-auth / resp-cond-bye) CRLF
header-fld-name = astring
header-list = "(" header-fld-name *(SP header-fld-name) ")"
list = "LIST" SP mailbox SP list-mailbox
list-mailbox = 1*list-char / string
list-char = ATOM-CHAR / list-wildcards / resp-specials
list-wildcards = "%" / "*"
literal = "\{" number "\}" CRLF *CHAR8 ; la valeur numérique représente le nombre de CHAR8
login = "LOGIN" SP userid SP password
lsub = "LSUB" SP mailbox SP list-mailbox
RFC 3501 IMAPv4 March 2003
mailbox = "INBOX" / astring ; INBOX ne distingue pas la casse. Toutes les variantes de ; casse de INBOX (par ex. "iNbOx") DOIVENT (MUST) être ; interprétées comme INBOX et non comme astring. Un astring ; composé de la séquence insensible à la casse "I" "N" "B" ; "O" "X" est considéré comme INBOX et non comme astring. ; voir la section 5.1 pour plus de détails sémantiques sur ; les noms de boîtes aux lettres.
mailbox-data = "FLAGS" SP flag-list / "LIST" SP mailbox-list / "LSUB" SP mailbox-list / "SEARCH" *(SP nz-number) / "STATUS" SP mailbox SP "(" [status-att-list] ")" / number SP "EXISTS" / number SP "RECENT"
mailbox-list = "(" [mbx-list-flags] ")" SP (DQUOTE QUOTED-CHAR DQUOTE / nil) SP mailbox
mbx-list-flags = *(mbx-list-oflag SP) mbx-list-sflag *(SP mbx-list-oflag) / mbx-list-oflag *(SP mbx-list-oflag)
mbx-list-oflag = "\Noinferiors" / flag-extension ; autres indicateurs. plusieurs par réponse LIST permis
mbx-list-sflag = "\Noselect" / "\Marked" / "\Unmarked" ; indicateurs de sélectionnabilité. un seul par réponse LIST
media-basic = ((DQUOTE ("APPLICATION" / "AUDIO" / "IMAGE" / "MESSAGE" / "VIDEO") DQUOTE) / string) SP media-subtype ; défini dans [MIME-IMT]
media-message = DQUOTE "MESSAGE" DQUOTE SP DQUOTE "RFC822" DQUOTE ; défini dans [MIME-IMT]
media-subtype = string ; défini dans [MIME-IMT]
media-text = DQUOTE "TEXT" DQUOTE SP media-subtype ; défini dans [MIME-IMT]
message-data = nz-number SP ("EXPUNGE" / ("FETCH" SP msg-att))
msg-att = "(" (msg-att-dynamic / msg-att-static) *(SP (msg-att-dynamic / msg-att-static)) ")"
msg-att-dynamic = "FLAGS" SP "(" [flag-fetch *(SP flag-fetch)] ")" ; peut (MAY) changer pour un message
RFC 3501 IMAPv4 March 2003
msg-att-static = "ENVELOPE" SP envelope / "INTERNALDATE" SP date-time /
"RFC822" [".HEADER" / ".TEXT"] SP nstring /
"RFC822.SIZE" SP number /
"BODY" ["STRUCTURE"] SP body /
"BODY" section ["<" number ">"] SP nstring /
"UID" SP uniqueid
; ne DOIT PAS (MUST NOT) changer pour un message
nil = "NIL"
nstring = string / nil
number = 1*DIGIT
; entier 32 bits non signé
; (0 <= n < 4,294,967,296)
nz-number = digit-nz *DIGIT
; entier 32 bits non signé non nul
; (0 < n < 4,294,967,296)
password = astring
quoted = DQUOTE *QUOTED-CHAR DQUOTE
QUOTED-CHAR = <any TEXT-CHAR except quoted-specials> /
"" quoted-specials
quoted-specials = DQUOTE / ""
rename = "RENAME" SP mailbox SP mailbox ; utiliser INBOX comme destination produit une erreur NO
response = *(continue-req / response-data) response-done
response-data = "*" SP (resp-cond-state / resp-cond-bye / mailbox-data / message-data / capability-data) CRLF
response-done = response-tagged / response-fatal
response-fatal = "*" SP resp-cond-bye CRLF ; le serveur ferme immédiatement la connexion
response-tagged = tag SP resp-cond-state CRLF
resp-cond-auth = ("OK" / "PREAUTH") SP resp-text ; condition d'authentification
RFC 3501 IMAPv4 March 2003
resp-cond-bye = "BYE" SP resp-text
resp-cond-state = ("OK" / "NO" / "BAD") SP resp-text ; condition d'état
resp-specials = "]"
resp-text = ["[" resp-text-code "]" SP] text
resp-text-code = "ALERT" /
"BADCHARSET" [SP "(" astring *(SP astring) ")" ] /
capability-data / "PARSE" /
"PERMANENTFLAGS" SP "("
[flag-perm (SP flag-perm)] ")" /
"READ-ONLY" / "READ-WRITE" / "TRYCREATE" /
"UIDNEXT" SP nz-number / "UIDVALIDITY" SP nz-number /
"UNSEEN" SP nz-number /
atom [SP 1<any TEXT-CHAR except "]">]
search = "SEARCH" [SP "CHARSET" SP astring] 1*(SP search-key) ; l'argument CHARSET DOIT (MUST) être enregistré auprès de ; l'IANA
search-key = "ALL" / "ANSWERED" / "BCC" SP astring / "BEFORE" SP date / "BODY" SP astring / "CC" SP astring / "DELETED" / "FLAGGED" / "FROM" SP astring / "KEYWORD" SP flag-keyword / "NEW" / "OLD" / "ON" SP date / "RECENT" / "SEEN" / "SINCE" SP date / "SUBJECT" SP astring / "TEXT" SP astring / "TO" SP astring / "UNANSWERED" / "UNDELETED" / "UNFLAGGED" / "UNKEYWORD" SP flag-keyword / "UNSEEN" / ; les lignes ci-dessus étaient dans [IMAP2] "DRAFT" / "HEADER" SP header-fld-name SP astring / "LARGER" SP number / "NOT" SP search-key / "OR" SP search-key SP search-key / "SENTBEFORE" SP date / "SENTON" SP date / "SENTSINCE" SP date / "SMALLER" SP number / "UID" SP sequence-set / "UNDRAFT" / sequence-set / "(" search-key *(SP search-key) ")"
section = "[" [section-spec] "]"
section-msgtext = "HEADER" / "HEADER.FIELDS" [".NOT"] SP header-list / "TEXT" ; niveau supérieur ou partie MESSAGE/RFC822
section-part = nz-number *("." nz-number) ; imbrication des parties de corps
RFC 3501 IMAPv4 March 2003
section-spec = section-msgtext / (section-part ["." section-text])
section-text = section-msgtext / "MIME" ; texte autre que la partie de corps réelle (en-têtes, etc.)
select = "SELECT" SP mailbox
seq-number = nz-number / "" ; numéro de séquence de message (commandes COPY, FETCH, ; STORE) ou identifiant unique (commandes UID COPY, UID ; FETCH, UID STORE). "" représente le plus grand nombre ; en cours. pour un numéro de séquence de message, c'est le ; nombre de messages dans la boîte aux lettres non vide. ; pour un identifiant unique, c'est l'UID du dernier ; message de la boîte aux lettres, ou la valeur UIDNEXT ; courante de la boîte aux lettres si elle est vide. le ; serveur DEVRAIT (SHOULD) répondre avec une réponse BAD ; étiquetée à une commande utilisant un numéro de séquence ; de message supérieur au nombre de messages dans la boîte ; aux lettres sélectionnée. cela inclut "*" si la boîte aux ; lettres sélectionnée est vide.
seq-range = seq-number ":" seq-number ; indépendamment de l'ordre, ces deux valeurs seq-number et ; toutes les valeurs entre elles. par ex. 2:4 et 4:2 sont ; équivalents et indiquent les valeurs 2, 3, 4. par ex. la ; plage d'identifiants uniques 3291:* inclut l'UID du ; dernier message de la boîte aux lettres, même si cette ; valeur est inférieure à 3291.
sequence-set = (seq-number / seq-range) ("," sequence-set) ; indépendamment de l'ordre, ensemble de valeurs seq-number. ; le serveur PEUT (MAY) fusionner les doublons et/ou ; exécuter les séquences dans n'importe quel ordre. par ex. ; l'ensemble de numéros de séquence de messages 2,4:7,9,12: ; pour une boîte aux lettres de 15 messages équivaut à 2,4, ; 5,6,7,9,12,13,14,15. par ex. l'ensemble de numéros de ; séquence de messages *:4,5:7 pour une boîte aux lettres de ; 10 messages équivaut à 10,9,8,7,6,5,4,5,6,7, qui PEUT ; (MAY) être réorganisé et fusionné en doublons en 4,5,6,7,8, ; 9,10.
status = "STATUS" SP mailbox SP "(" status-att *(SP status-att) ")"
RFC 3501 IMAPv4 March 2003
status-att = "MESSAGES" / "RECENT" / "UIDNEXT" / "UIDVALIDITY" / "UNSEEN"
status-att-list = status-att SP number *(SP status-att SP number)
store = "STORE" SP sequence-set SP store-att-flags
store-att-flags = (["+" / "-"] "FLAGS" [".SILENT"]) SP (flag-list / (flag *(SP flag)))
string = quoted / literal
subscribe = "SUBSCRIBE" SP mailbox
tag = 1*<any ASTRING-CHAR except "+">
text = 1*TEXT-CHAR
TEXT-CHAR = <any CHAR except CR and LF>
time = 2DIGIT ":" 2DIGIT ":" 2DIGIT ; heure minute seconde
uid = "UID" SP (copy / fetch / search / store) ; identifiant unique utilisé à la place du numéro de ; séquence de message
uniqueid = nz-number ; strictement croissant
unsubscribe = "UNSUBSCRIBE" SP mailbox
userid = astring
x-command = "X" atom <experimental command arguments>
zone = ("+" / "-") 4DIGIT ; valeur de 4 chiffres signée hhmm représentant les heures ; et minutes à l'est de Greenwich (c'est-à-dire la quantité ; dont l'heure donnée diffère du temps universel coordonné). ; soustraire le fuseau horaire de l'heure donnée donne le ; format UT. le fuseau horaire du temps universel coordonné ; est "+0000".
RFC 3501 IMAPv4 March 2003
-
Note de l'auteur
Le présent document est une révision ou une réécriture des documents précédents, et remplace les spécifications de protocole de ces documents (RFC 2060, RFC 1730, le document IMAP2bis.TXT non publié, RFC 1176, RFC 1064).
-
Considérations de sécurité
Les transactions du protocole IMAP4rev1 sont transmises en clair sur le réseau, y compris les données de courrier électronique, à moins qu'une protection contre l'écoute clandestine ne soit négociée. Cela peut être réalisé soit par l'utilisation de STARTTLS, soit par une protection de confidentialité négociée dans la commande AUTHENTICATE, soit par tout autre mécanisme de protection.
11.1. Considérations de sécurité pour STARTTLS
Les spécifications de la commande STARTTLS et de la capacité LOGINDISABLED dans le présent document remplacent celles de [IMAP-TLS]. [IMAP-TLS] reste normatif pour le mécanisme d'authentification [SASL] PLAIN.
Les implémentations client et serveur IMAP DOIVENT (MUST) implémenter l'ensemble de chiffrement TLS_RSA_WITH_RC4_128_MD5 [TLS], et DEVRAIENT (SHOULD) implémenter l'ensemble de chiffrement TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA [TLS]. Cela est important pour garantir que toute paire d'implémentations conformes peut être configurée pour interopérer. Tous les autres ensembles de chiffrement sont OPTIONNELS. Notez que c'est un changement par rapport à la section 2.1 de [IMAP-TLS].
Lors de la négociation [TLS], le client DOIT (MUST), pour empêcher les attaques de l'homme du milieu, vérifier le nom d'hôte du serveur qu'il comprend par rapport à l'identité du serveur indiquée dans le message de certificat du serveur. Si la vérification échoue, le client DEVRAIT (SHOULD) demander une confirmation explicite à l'utilisateur ou mettre fin à la connexion et indiquer que l'identité du serveur est douteuse. La vérification est effectuée selon les règles suivantes :
Le client DOIT (MUST) utiliser le nom d'hôte du serveur utilisé pour
ouvrir la connexion comme valeur à comparer avec le nom de serveur
indiqué dans le certificat du serveur. Le client ne DOIT PAS (MUST NOT)
utiliser sous quelque forme que ce soit un nom d'hôte de serveur dérivé
d'une source distante non sécurisée (par exemple une recherche DNS non
sécurisée). Aucune normalisation CNAME n'est effectuée.
Si le certificat contient une extension subjectAltName de type dNSName,
elle DEVRAIT (SHOULD) être utilisée comme source de l'identité du
serveur.
La comparaison ne distingue pas la casse.
RFC 3501 IMAPv4 March 2003
Le caractère générique "*" PEUT (MAY) être utilisé comme élément de nom
le plus à gauche dans un certificat. Par exemple, *.example.com
correspond à a.example.com, foo.example.com, etc., mais pas à example.com.
Si le certificat contient plusieurs noms (par exemple plusieurs champs
dNSName), une correspondance avec l'un des champs est considérée
acceptable.
Le client et le serveur DOIVENT (MUST) tous deux vérifier le résultat de la commande STARTTLS et de la négociation [TLS] qui suit, pour s'assurer qu'une authentification ou une confidentialité acceptable a été obtenue.
11.2. Autres considérations de sécurité
Le message d'erreur du serveur pour une commande AUTHENTICATE échouée en raison d'identifiants non valides ne DEVRAIT PAS (SHOULD NOT) détailler la raison pour laquelle les identifiants sont non valides.
L'utilisation de la commande LOGIN envoie le mot de passe en clair. Cela peut être évité en utilisant la commande AUTHENTICATE avec un mécanisme [SASL] qui n'utilise pas de mot de passe en clair, ou en négociant d'abord le chiffrement via STARTTLS ou un autre mécanisme de protection.
Les implémentations serveur DOIVENT (MUST) implémenter une configuration qui exige l'un des éléments suivants lors de l'authentification : (1) La commande STARTTLS a été négociée. ou (2) Un autre mécanisme protégeant la session contre l'interception des mots de passe est fourni. ou (3) Les mesures suivantes sont prises : (a) La capacité LOGINDISABLED est annoncée, et les mécanismes [SASL] utilisant un mot de passe en clair (tels que PLAIN) ne sont pas annoncés dans la liste de capacités. et (b) La commande LOGIN renvoie une erreur même si le mot de passe est correct. et (c) La commande AUTHENTICATE renvoie une erreur pour tous les mécanismes [SASL] utilisant un mot de passe en clair, même si le mot de passe est correct.
Le message d'erreur du serveur pour une commande LOGIN échouée ne DEVRAIT PAS (SHOULD NOT) identifier que le nom d'utilisateur, plutôt que le mot de passe, est non valide.