9. Sintassi formale (Formal Syntax)
RFC 3501 IMAPv4 March 2003
-
Esempio di connessione IMAP4rev1 (Sample IMAP4rev1 connection)Il seguente è una trascrizione (transcript) di una connessione IMAP4rev1. Una riga lunga in questo esempio è interrotta per migliorarne la leggibilità.
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
-
Sintassi formale (Formal Syntax)La seguente specifica di sintassi utilizza la Backus-Naur Form estesa (ABNF) come da [ABNF].
Nei casi in cui regole alternative o opzionali si sovrappongano, con una regola successiva che si sovrappone a una precedente, la regola citata per prima DEVE avere la precedenza. Ad esempio, "\Seen", quando analizzato come flag, è il nome del flag \Seen e non un'estensione di flag, sebbene "\Seen" possa essere analizzato come flag-extension. Alcuni, ma non tutti, i casi di questa regola sono annotati di seguito.
Nota: Le regole [ABNF] DEVONO essere seguite rigorosamente; in
particolare:
(1) Salvo dove diversamente annotato, tutti i caratteri alfabetici
sono insensibili alle maiuscole/minuscole. L'uso di maiuscole o
minuscole nella definizione di stringhe di token serve solo a
migliorarne la leggibilità. Le implementazioni DEVONO accettare
queste stringhe in modo insensibile alle maiuscole/minuscole.
(2) In tutti i casi, SP si riferisce a esattamente uno spazio. Non è
consentito sostituire TAB, inserire spazi aggiuntivi o trattare SP
come LWSP.
(3) Il carattere NUL ASCII, %x00, NON DEVE essere utilizzato in
alcun momento.
address = "(" addr-name SP addr-adl SP addr-mailbox SP addr-host ")"
addr-adl = nstring ; Contiene la route da [RFC-2822] route-addr, se non NIL
addr-host = nstring ; NIL indica la sintassi di gruppo di [RFC-2822]. ; Altrimenti contiene il nome di dominio [RFC-2822]
addr-mailbox = nstring ; NIL indica la fine del gruppo [RFC-2822]; ; se non NIL e addr-host è NIL, contiene il nome di ; gruppo [RFC-2822]. ; Altrimenti contiene la parte locale [RFC-2822] ; dopo la rimozione del quoting [RFC-2822]
RFC 3501 IMAPv4 March 2003
addr-name = nstring ; Se non NIL, contiene la frase dalla mailbox [RFC-2822] ; dopo la rimozione del quoting [RFC-2822]
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 ; Definito da [SASL]
base64 = *(4base64-char) [base64-terminal]
base64-char = ALPHA / DIGIT / "+" / "/" ; Sensibile alle maiuscole/minuscole
base64-terminal = (2base64-char "==") / (3base64-char "=")
body = "(" (body-type-1part / body-type-mpart) ")"
body-extension = nstring / number / "(" body-extension *(SP body-extension) ")" ; Estensione futura. Le implementazioni client DEVONO ; accettare i campi body-extension. Le implementazioni ; server NON POSSONO generare campi body-extension, se non ; come definito da future revisioni di standard o di tipo ; standards track di questa specifica.
body-ext-1part = body-fld-md5 [SP body-fld-dsp [SP body-fld-lang [SP body-fld-loc *(SP body-extension)]]] ; NON DEVE essere restituito in un fetch "BODY" non ; estendibile
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)]]] ; NON DEVE essere restituito in un fetch "BODY" non ; estendibile
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 ; Il sottotipo MESSAGE NON DEVE essere "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 ; Le nuove funzionalità DEVONO iniziare con "X" o essere ; registrate presso IANA come standard o standards track
RFC 3501 IMAPv4 March 2003
capability-data = "CAPABILITY" *(SP capability) SP "IMAP4rev1" *(SP capability) ; I server DEVONO implementare le funzionalità STARTTLS, ; AUTH=PLAIN e LOGINDISABLED. ; I server che offrono compatibilità RFC-1730 DEVONO ; elencare "IMAP4" come prima funzionalità.
CHAR8 = %x01-ff ; Qualsiasi OCTET eccetto NUL, %x00
command = tag SP (command-any / command-auth / command-nonauth / command-select) CRLF ; Modale in base allo stato
command-any = "CAPABILITY" / "LOGOUT" / "NOOP" / x-command ; Valido in tutti gli stati
command-auth = append / create / delete / examine / list / lsub / rename / select / status / subscribe / unsubscribe ; Valido solo negli stati autenticato o selezionato
command-nonauth = login / authenticate / "STARTTLS" ; Valido solo nello stato non autenticato
command-select = "CHECK" / "CLOSE" / "EXPUNGE" / copy / fetch / store / uid / search ; Valido solo nello stato selezionato
continue-req = "+" SP (resp-text / base64) CRLF
copy = "COPY" SP sequence-set SP mailbox
create = "CREATE" SP mailbox ; L'uso di INBOX produce un errore NO
date = date-text / DQUOTE date-text DQUOTE
date-day = 1*2DIGIT ; Giorno del mese
date-day-fixed = (SP DIGIT) / 2DIGIT ; Versione a formato fisso di 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 ; L'uso di INBOX produce un errore 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 ; Non include "\Recent"
flag-extension = "" atom ; Estensione futura. Le implementazioni client DEVONO ; accettare i flag flag-extension. Le implementazioni ; server NON POSSONO generare flag flag-extension, se non ; come definito da future revisioni di standard o di tipo ; standards track di questa specifica.
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 ; Il numero rappresenta la quantità di CHAR8
login = "LOGIN" SP userid SP password
lsub = "LSUB" SP mailbox SP list-mailbox
RFC 3501 IMAPv4 March 2003
mailbox = "INBOX" / astring ; INBOX è insensibile alle maiuscole/minuscole. Tutte le ; varianti di scrittura di INBOX (es. "iNbOx") DEVONO ; essere interpretate come INBOX e non come astring. Un ; astring costituito dalla sequenza insensibile alle ; maiuscole/minuscole "I" "N" "B" "O" "X" è considerato ; INBOX e non astring. Si veda la sezione 5.1 per ulteriori ; dettagli semantici dei nomi di mailbox.
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 ; Altri flag; più di uno per risposta LIST possibile
mbx-list-sflag = "\Noselect" / "\Marked" / "\Unmarked" ; Flag di selezionabilità; solo uno per risposta LIST
media-basic = ((DQUOTE ("APPLICATION" / "AUDIO" / "IMAGE" / "MESSAGE" / "VIDEO") DQUOTE) / string) SP media-subtype ; Definito in [MIME-IMT]
media-message = DQUOTE "MESSAGE" DQUOTE SP DQUOTE "RFC822" DQUOTE ; Definito in [MIME-IMT]
media-subtype = string ; Definito in [MIME-IMT]
media-text = DQUOTE "TEXT" DQUOTE SP media-subtype ; Definito in [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)] ")" ; PUÒ cambiare per un messaggio
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
; NON DEVE cambiare per un messaggio
nil = "NIL"
nstring = string / nil
number = 1*DIGIT
; Intero senza segno a 32 bit
; (0 <= n < 4.294.967.296)
nz-number = digit-nz *DIGIT
; Intero senza segno a 32 bit diverso da zero
; (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 ; L'uso di INBOX come destinazione produce un errore 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 ; Il server chiude immediatamente la connessione
response-tagged = tag SP resp-cond-state CRLF
resp-cond-auth = ("OK" / "PREAUTH") SP resp-text ; Condizione di autenticazione
RFC 3501 IMAPv4 March 2003
resp-cond-bye = "BYE" SP resp-text
resp-cond-state = ("OK" / "NO" / "BAD") SP resp-text ; Condizione di stato
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'argomento CHARSET DEVE essere registrato presso 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" / ; Sopra questa riga in [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" ; Livello superiore o parte MESSAGE/RFC822
RFC 3501 IMAPv4 March 2003
section-part = nz-number *("." nz-number) ; Annidamento delle parti di body
section-spec = section-msgtext / (section-part ["." section-text])
section-text = section-msgtext / "MIME" ; Testo eccetto il corpo reale della parte (intestazioni ; ecc.)
select = "SELECT" SP mailbox
seq-number = nz-number / "" ; Numero di sequenza del messaggio (comandi COPY, FETCH, ; STORE) o identificatore univoco (comandi UID COPY, UID ; FETCH, UID STORE). ; * rappresenta il numero più grande utilizzato. Nel caso ; dei numeri di sequenza del messaggio, è il numero di ; messaggi in una mailbox non vuota. Nel caso degli ; identificatori univoci, è l'identificatore univoco ; dell'ultimo messaggio nella mailbox o, se la mailbox è ; vuota, l'attuale valore UIDNEXT della mailbox. ; Il server DOVREBBE rispondere con una risposta BAD con ; tag a un comando che usa un numero di sequenza del ; messaggio maggiore del numero di messaggi nella mailbox ; selezionata. Ciò include "" se la mailbox selezionata è ; vuota.
seq-range = seq-number ":" seq-number ; Due valori seq-number e tutti i valori compresi tra ; essi, indipendentemente dall'ordine. ; Esempio: 2:4 e 4:2 sono equivalenti e denotano i valori ; 2, 3 e 4. ; Esempio: un intervallo di identificatori univoci da ; 3291:* comprende l'UID dell'ultimo messaggio nella ; mailbox, anche se tale valore è minore di 3291.
sequence-set = (seq-number / seq-range) ("," sequence-set) ; Insieme di valori seq-number, indipendente dall'ordine. ; I server POSSONO compattare le sovrapposizioni e/o ; eseguire la sequenza in qualsiasi ordine. ; Esempio: un insieme di numeri di sequenza del messaggio ; 2,4:7,9,12: per una mailbox con 15 messaggi equivale a ; 2,4,5,6,7,9,12,13,14,15. ; Esempio: un insieme di numeri di sequenza del messaggio ; *:4,5:7 per una mailbox con 10 messaggi equivale a ; 10,9,8,7,6,5,4,5,6,7 e PUÒ essere riordinato e ; compattato sovrapponendosi in 4,5,6,7,8,9,10.
RFC 3501 IMAPv4 March 2003
status = "STATUS" SP mailbox SP "(" status-att *(SP status-att) ")"
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 ; Ore minuti secondi
uid = "UID" SP (copy / fetch / search / store) ; Identificatori univoci invece di numeri di sequenza ; del messaggio
uniqueid = nz-number ; Strettamente crescente
unsubscribe = "UNSUBSCRIBE" SP mailbox
userid = astring
x-command = "X" atom <experimental command arguments>
zone = ("+" / "-") 4DIGIT ; Valore con segno di quattro cifre hhmm che indica ore ; e minuti a est di Greenwich (cioè la differenza tra ; l'ora indicata e l'ora universale). Sottraendo la zona ; dall'ora indicata si ottiene la forma UT. La zona ; universale è "+0000".
RFC 3501 IMAPv4 March 2003
-
Nota dell'autore (Author's Note)
Questo documento è una revisione o un rifacimento di documenti precedenti e sostituisce la specifica del protocollo in tali documenti: RFC 2060, RFC 1730, il documento non pubblicato IMAP2bis.TXT, RFC 1176 e RFC 1064.
-
Considerazioni sulla sicurezza (Security Considerations)
Le transazioni del protocollo IMAP4rev1, inclusi i dati di posta elettronica, vengono inviate in chiaro sulla rete, a meno che non venga negoziata una protezione contro l'intercettazione. Ciò può essere ottenuto tramite l'uso di STARTTLS, di una privacy negoziata nel comando AUTHENTICATE o di un altro meccanismo di protezione.
11.1. Considerazioni sulla sicurezza di STARTTLS (STARTTLS Security Considerations)
La specifica del comando STARTTLS e della funzionalità LOGINDISABLED in questo documento sostituisce quella in [IMAP-TLS]. [IMAP-TLS] rimane normativo per l'autenticatore PLAIN [SASL].
Le implementazioni client e server IMAP DEVONO implementare la suite di cifratura TLS_RSA_WITH_RC4_128_MD5 [TLS] e DOVREBBERO implementare la suite di cifratura TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA [TLS]. Ciò è importante per garantire che due implementazioni conformi possano essere configurate per interoperare. Tutte le altre suite di cifratura sono opzionali. Si noti che questa è una modifica rispetto alla sezione 2.1 di [IMAP-TLS].
Durante la negoziazione [TLS], il client DEVE verificare la propria comprensione del nome host del server rispetto all'identità del server così come rappresentata nel messaggio di certificato del server, per prevenire attacchi man-in-the-middle. Se la corrispondenza fallisce, il client DOVREBBE richiedere esplicita conferma all'utente o interrompere la connessione indicando che l'identità del server è sospetta. La corrispondenza avviene secondo queste regole:
Il client DEVE usare il nome host del server con cui ha aperto la
connessione come valore di confronto rispetto al nome del server
espresso nel certificato. Il client NON DEVE usare alcuna forma del
nome host del server proveniente da una fonte remota non sicura (es.
query DNS non sicure). La canonizzazione CNAME non viene eseguita.
Se nel certificato è presente un'estensione subjectAltName di tipo
dNSName, essa DOVREBBE essere usata come fonte dell'identità del
server.
Il confronto è insensibile alle maiuscole/minuscole.
RFC 3501 IMAPv4 March 2003
Un carattere jolly "*" PUÒ essere usato come componente di nome più a
sinistra nel certificato. Ad esempio, *.example.com corrisponderebbe a
a.example.com, foo.example.com, ecc., ma non a example.com.
Se il certificato contiene più nomi (es. più di un campo dNSName), la
corrispondenza con uno qualsiasi dei campi è considerata accettabile.
Sia il client che il server DEVONO verificare il risultato del comando STARTTLS e della successiva negoziazione [TLS] per determinare se è stata raggiunta un'autenticazione o una privacy accettabile.
11.2. Altre considerazioni sulla sicurezza (Other Security Considerations)
Un messaggio di errore del server per un comando AUTHENTICATE che fallisce a causa di credenziali di accesso non valide NON DOVREBBE specificare in dettaglio perché le credenziali non sono valide.
L'uso del comando LOGIN invia le password in chiaro. Ciò può essere evitato usando il comando AUTHENTICATE con un meccanismo [SASL] che non utilizza password in chiaro, o negoziando prima una crittografia tramite STARTTLS o un altro meccanismo di protezione.
Un'implementazione server DEVE implementare una configurazione che richieda al momento dell'autenticazione: (1) Il comando STARTTLS è stato negoziato. OPPURE (2) È stato fornito un altro meccanismo che protegge la sessione dall'intercettazione delle password. OPPURE (3) Sono presenti le seguenti misure: (a) La funzionalità LOGINDISABLED è annunciata e i meccanismi [SASL] (come PLAIN) che usano password in chiaro NON sono annunciati nell'elenco CAPABILITY. E (b) Il comando LOGIN restituisce un errore anche se la password è corretta. E (c) Il comando AUTHENTICATE restituisce un errore con tutti i meccanismi [SASL] che usano password in chiaro anche se la password è corretta.
Un messaggio di errore del server per un comando LOGIN fallito NON DOVREBBE indicare che è il nome utente, e non la password, a non essere valido.