Passa al contenuto principale

9. Sintassi formale (Formal Syntax)

RFC 3501 IMAPv4 March 2003

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

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

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

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