Aller au contenu principal

9. Syntaxe formelle

RFC 3501 IMAPv4 March 2003

  1.  Exemple de connexion IMAP4rev1

    Ce 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

  1.  Syntaxe formelle

    Les 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

  1. 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).

  1. 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.