Zum Hauptinhalt springen

9. Formale Syntax (Formal Syntax)

RFC 3501 IMAPv4 March 2003

  1.  Beispiel einer IMAP4rev1-Verbindung (Sample IMAP4rev1 connection)

    Das Folgende ist eine Abschrift (transcript) einer IMAP4rev1-Verbindung. Eine lange Zeile in diesem Beispiel ist zur besseren Lesbarkeit umbrochen.

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.  Formale Syntax (Formal Syntax)

    Die folgende Syntaxspezifikation verwendet die erweiterte Backus-Naur- Form (ABNF) gemäß [ABNF].

    Im Falle alternativer oder optionaler Regeln, bei denen eine spätere Regel eine frühere überlappt, MUSS die früher aufgeführte Regel Vorrang haben. Beispielsweise ist „\Seen", wenn es als Flag geparst wird, der Flag-Name \Seen und nicht eine flag-extension, obwohl „\Seen" als flag-extension geparst werden kann. Einige, aber nicht alle, Fälle dieser Regel sind nachstehend vermerkt.

     Hinweis: Die [ABNF]-Regeln MÜSSEN strikt befolgt werden;
    insbesondere:

    (1) Sofern nicht anders vermerkt, sind alle alphabetischen
    Zeichen groß-/kleinschreibungsinsensitiv. Die Verwendung von
    Groß- oder Kleinbuchstaben zur Definition von Token-Zeichenketten
    dient lediglich der besseren Lesbarkeit. Implementierungen MÜSSEN
    diese Zeichenketten groß-/kleinschreibungsinsensitiv akzeptieren.

    (2) In allen Fällen bezieht sich SP auf genau ein Leerzeichen.
    Es ist NICHT zulässig, TAB zu ersetzen, zusätzliche Leerzeichen
    einzufügen oder SP anderweitig als LWSP zu behandeln.

    (3) Das ASCII-NUL-Zeichen, %x00, DARF zu keiner Zeit verwendet
    werden.

address = "(" addr-name SP addr-adl SP addr-mailbox SP addr-host ")"

addr-adl = nstring ; Hält Route aus [RFC-2822] route-addr, falls ; nicht NIL

addr-host = nstring ; NIL kennzeichnet [RFC-2822]-Gruppensyntax. ; Andernfalls hält es den [RFC-2822]-Domänennamen

addr-mailbox = nstring ; NIL kennzeichnet das Ende der [RFC-2822]-Gruppe; ; falls nicht NIL und addr-host NIL ist, hält es ; den [RFC-2822]-Gruppennamen. ; Andernfalls hält es den [RFC-2822]-local-part ; nach Entfernen des [RFC-2822]-Quotings

RFC 3501 IMAPv4 March 2003

addr-name = nstring ; Falls nicht NIL, hält es die Phrase aus der ; [RFC-2822]-Mailbox nach Entfernen des [RFC-2822]- ; Quotings

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 ; Definiert durch [SASL]

base64 = *(4base64-char) [base64-terminal]

base64-char = ALPHA / DIGIT / "+" / "/" ; Groß-/kleinschreibungssensitiv

base64-terminal = (2base64-char "==") / (3base64-char "=")

body = "(" (body-type-1part / body-type-mpart) ")"

body-extension = nstring / number / "(" body-extension *(SP body-extension) ")" ; Zukünftige Erweiterung. Client-Implementierungen ; MÜSSEN body-extension-Felder akzeptieren. Server- ; Implementierungen DÜRFEN KEINE body-extension-Felder ; erzeugen, außer wie durch künftige Standard- oder ; Standards-Track-Überarbeitungen dieser Spezifikation ; definiert.

body-ext-1part = body-fld-md5 [SP body-fld-dsp [SP body-fld-lang [SP body-fld-loc *(SP body-extension)]]] ; DARF NICHT bei nicht erweiterbarem ; "BODY"-Fetch zurückgegeben werden

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)]]] ; DARF NICHT bei nicht erweiterbarem ; "BODY"-Fetch zurückgegeben werden

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 ; MESSAGE-Subtyp DARF NICHT "RFC822" sein

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 ; Neue Fähigkeiten MÜSSEN mit "X" beginnen oder bei ; IANA als Standard oder Standards-Track registriert ; sein

RFC 3501 IMAPv4 March 2003

capability-data = "CAPABILITY" *(SP capability) SP "IMAP4rev1" *(SP capability) ; Server MÜSSEN die Fähigkeiten STARTTLS, AUTH=PLAIN ; und LOGINDISABLED implementieren. ; Server, die RFC-1730-Kompatibilität anbieten, MÜSSEN ; "IMAP4" als erste Fähigkeit aufführen.

CHAR8 = %x01-ff ; jedes OCTET außer NUL, %x00

command = tag SP (command-any / command-auth / command-nonauth / command-select) CRLF ; Modal basierend auf dem Zustand

command-any = "CAPABILITY" / "LOGOUT" / "NOOP" / x-command ; In allen Zuständen gültig

command-auth = append / create / delete / examine / list / lsub / rename / select / status / subscribe / unsubscribe ; Nur im Authentifizierten oder Ausgewählten Zustand ; gültig

command-nonauth = login / authenticate / "STARTTLS" ; Nur im Nicht-Authentifizierten Zustand gültig

command-select = "CHECK" / "CLOSE" / "EXPUNGE" / copy / fetch / store / uid / search ; Nur im Ausgewählten Zustand gültig

continue-req = "+" SP (resp-text / base64) CRLF

copy = "COPY" SP sequence-set SP mailbox

create = "CREATE" SP mailbox ; Verwendung von INBOX ergibt einen NO-Fehler

date = date-text / DQUOTE date-text DQUOTE

date-day = 1*2DIGIT ; Tag des Monats

date-day-fixed = (SP DIGIT) / 2DIGIT ; Festformat-Version von 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 ; Verwendung von INBOX ergibt einen NO-Fehler

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 ; Umfasst nicht "\Recent"

flag-extension = "" atom ; Zukünftige Erweiterung. Client-Implementierungen ; MÜSSEN flag-extension-Flags akzeptieren. Server- ; Implementierungen DÜRFEN KEINE flag-extension-Flags ; erzeugen, außer wie durch künftige Standard- oder ; Standards-Track-Überarbeitungen dieser Spezifikation ; definiert.

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 ; Zahl stellt die Anzahl der CHAR8s dar

login = "LOGIN" SP userid SP password

lsub = "LSUB" SP mailbox SP list-mailbox

RFC 3501 IMAPv4 March 2003

mailbox = "INBOX" / astring ; INBOX ist groß-/kleinschreibungsinsensitiv. Alle ; Schreibvarianten von INBOX (z. B. "iNbOx") MÜSSEN als ; INBOX und nicht als astring interpretiert werden. Ein ; astring, der aus der groß-/kleinschreibungsinsensitiven ; Folge "I" "N" "B" "O" "X" besteht, gilt als INBOX und ; nicht als astring. Bezug auf Abschnitt 5.1 für ; weitere semantische Details von Mailbox-Namen.

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 ; Andere Flags; mehrere pro LIST-Antwort möglich

mbx-list-sflag = "\Noselect" / "\Marked" / "\Unmarked" ; Selektierbarkeits-Flags; nur eines pro LIST-Antwort

media-basic = ((DQUOTE ("APPLICATION" / "AUDIO" / "IMAGE" / "MESSAGE" / "VIDEO") DQUOTE) / string) SP media-subtype ; Definiert in [MIME-IMT]

media-message = DQUOTE "MESSAGE" DQUOTE SP DQUOTE "RFC822" DQUOTE ; Definiert in [MIME-IMT]

media-subtype = string ; Definiert in [MIME-IMT]

media-text = DQUOTE "TEXT" DQUOTE SP media-subtype ; Definiert 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)] ")" ; KANN sich für eine Nachricht ändern

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 ; DARF sich für eine Nachricht nicht ändern

nil = "NIL"

nstring = string / nil

number = 1*DIGIT ; Vorzeichenlose 32-Bit-Ganzzahl ; (0 <= n < 4,294,967,296)

nz-number = digit-nz *DIGIT ; Von Null verschiedene vorzeichenlose 32-Bit-Ganzzahl ; (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 ; Verwendung von INBOX als Ziel ergibt einen NO-Fehler

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 ; Server schließt Verbindung sofort

response-tagged = tag SP resp-cond-state CRLF

resp-cond-auth = ("OK" / "PREAUTH") SP resp-text ; Authentifizierungsbedingung

RFC 3501 IMAPv4 March 2003

resp-cond-bye = "BYE" SP resp-text

resp-cond-state = ("OK" / "NO" / "BAD") SP resp-text ; Statusbedingung

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) ; CHARSET-Argument MUSS bei IANA registriert sein

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" / ; Oberhalb dieser Zeile befanden sich 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" ; oberste Ebene oder MESSAGE/RFC822-Teil

RFC 3501 IMAPv4 March 2003

section-part = nz-number *("." nz-number) ; Verschachtelung von Body-Teilen

section-spec = section-msgtext / (section-part ["." section-text])

section-text = section-msgtext / "MIME" ; Text außer dem eigentlichen Body-Teil (Header usw.)

select = "SELECT" SP mailbox

seq-number = nz-number / "" ; Nachrichten-Sequenznummer (COPY-, FETCH-, STORE- ; Befehle) oder eindeutiger Bezeichner (UID COPY-, ; UID FETCH-, UID STORE-Befehle). ; * stellt die größte verwendete Zahl dar. Im ; Falle von Nachrichten-Sequenznummern ist es die ; Anzahl der Nachrichten in einer nicht-leeren Mailbox. ; Im Falle von eindeutigen Bezeichnern ist es der ; eindeutige Bezeichner der letzten Nachricht in der ; Mailbox oder, falls die Mailbox leer ist, der ; aktuelle UIDNEXT-Wert der Mailbox. ; Der Server SOLLTE mit einer getaggten BAD-Antwort auf ; einen Befehl antworten, der eine Nachrichten- ; Sequenznummer verwendet, die größer ist als die ; Anzahl der Nachrichten in der ausgewählten Mailbox. ; Dies umfasst "", falls die ausgewählte Mailbox leer ; ist.

seq-range = seq-number ":" seq-number ; zwei seq-number-Werte und alle Werte zwischen ; diesen beiden, unabhängig von der Reihenfolge. ; Beispiel: 2:4 und 4:2 sind äquivalent und bezeichnen ; die Werte 2, 3 und 4. ; Beispiel: Ein Bereich eindeutiger Bezeichner von ; 3291:* umfasst die UID der letzten Nachricht in der ; Mailbox, selbst wenn dieser Wert kleiner als 3291 ist.

sequence-set = (seq-number / seq-range) ("," sequence-set) ; Menge von seq-number-Werten, unabhängig von der ; Reihenfolge. Server KÖNNEN Überlappungen zusammen- ; fassen und/oder die Sequenz in beliebiger Reihenfolge ; ausführen. ; Beispiel: Eine Nachrichten-Sequenznummern-Menge von ; 2,4:7,9,12: für eine Mailbox mit 15 Nachrichten ist ; äquivalent zu 2,4,5,6,7,9,12,13,14,15. ; Beispiel: Eine Nachrichten-Sequenznummern-Menge von ; *:4,5:7 für eine Mailbox mit 10 Nachrichten ist ; äquivalent zu 10,9,8,7,6,5,4,5,6,7 und KANN neu ; geordnet und überlappend zusammengefasst werden zu ; 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 ; Stunden Minuten Sekunden

uid = "UID" SP (copy / fetch / search / store) ; Eindeutige Bezeichner anstelle von ; Nachrichten-Sequenznummern

uniqueid = nz-number ; Streng aufsteigend

unsubscribe = "UNSUBSCRIBE" SP mailbox

userid = astring

x-command = "X" atom <experimental command arguments>

zone = ("+" / "-") 4DIGIT ; Vorzeichenbehafteter vierstelliger Wert hhmm, der ; Stunden und Minuten östlich von Greenwich angibt (das ; ist die Differenz der angegebenen Zeit zur ; Universalzeit). Subtrahiert man die Zeitzone von der ; angegebenen Zeit, ergibt sich die UT-Form. ; Die Universalzeit-Zone ist "+0000".

RFC 3501 IMAPv4 March 2003

  1. Anmerkung des Autors (Author's Note)

Dieses Dokument ist eine Überarbeitung oder Neufassung früherer Dokumente und ersetzt die Protokollspezifikation in jenen Dokumenten: RFC 2060, RFC 1730, das unveröffentlichte Dokument IMAP2bis.TXT, RFC 1176 und RFC 1064.

  1. Sicherheitsüberlegungen (Security Considerations)

IMAP4rev1-Protokolltransaktionen, einschließlich elektronischer Postdaten, werden im Klartext über das Netz gesendet, sofern kein Schutz vor dem Mitlesen ausgehandelt wird. Dies kann entweder durch die Verwendung von STARTTLS, ausgehandelten Datenschutzschutz im AUTHENTICATE-Befehl oder einen anderen Schutzmechanismus erreicht werden.

11.1. STARTTLS-Sicherheitsüberlegungen (STARTTLS Security Considerations)​

Die Spezifikation des STARTTLS-Befehls und der LOGINDISABLED- Fähigkeit in diesem Dokument ersetzt die in [IMAP-TLS]. [IMAP-TLS] bleibt normativ für den PLAIN-[SASL]-Authentifikator.

IMAP-Client- und Server-Implementierungen MÜSSEN die TLS_RSA_WITH_RC4_128_MD5-[TLS]-Verschlüsselungssammlung implementieren und SOLLTEN die TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA-[TLS]- Verschlüsselungssammlung implementieren. Dies ist wichtig, da es sicherstellt, dass je zwei konforme Implementierungen so konfiguriert werden können, dass sie interoperieren. Alle anderen Verschlüsselungssammlungen sind OPTIONAL. Beachten Sie, dass dies eine Änderung gegenüber Abschnitt 2.1 von [IMAP-TLS] ist.

Während der [TLS]-Aushandlung MUSS der Client sein Verständnis des Server-Hostnamens gegen die Identität des Servers prüfen, wie sie in der Server-Zertifikatsnachricht dargestellt wird, um Man-in-the-Middle-Angriffe zu verhindern. Schlägt der Abgleich fehl, SOLLTE der Client entweder um ausdrückliche Benutzerbestätigung bitten oder die Verbindung abbrechen und angeben, dass die Identität des Servers verdächtig ist. Der Abgleich erfolgt nach diesen Regeln:

    Der Client MUSS den Server-Hostnamen, mit dem er die Verbindung
geöffnet hat, als Vergleichswert gegen den Servernamen verwenden,
wie er im Server-Zertifikat ausgedrückt ist. Der Client DARF
NICHT eine Form des Server-Hostnamens verwenden, die aus einer
unsicheren fernen Quelle stammt (z. B. unsichere DNS-Abfrage).
CNAME-Kanonisierung wird nicht durchgeführt.

Wenn eine subjectAltName-Erweiterung vom Typ dNSName im
Zertifikat vorhanden ist, SOLLTE sie als Quelle der Identität des
Servers verwendet werden.

Der Abgleich ist groß-/kleinschreibungsinsensitiv.

RFC 3501 IMAPv4 March 2003

    Ein „*"-Platzhalterzeichen KANN als linkeste Namenskomponente im
Zertifikat verwendet werden. Beispielsweise würde *.example.com auf
a.example.com, foo.example.com usw. passen, aber nicht auf
example.com.

Wenn das Zertifikat mehrere Namen enthält (z. B. mehr als ein
dNSName-Feld), so gilt ein Abgleich mit einem der Felder als
akzeptabel.

Sowohl Client als auch Server MÜSSEN das Ergebnis des STARTTLS-Befehls und der anschließenden [TLS]-Aushandlung prüfen, um festzustellen, ob eine akzeptable Authentifizierung oder Privatsphäre erreicht wurde.

11.2. Weitere Sicherheitsüberlegungen (Other Security Considerations)​

Eine Server-Fehlermeldung für einen AUTHENTICATE-Befehl, der aufgrund ungültiger Anmeldedaten fehlschlägt, SOLLTE NICHT im Detail angeben, warum die Anmeldedaten ungültig sind.

Die Verwendung des LOGIN-Befehls sendet Passwörter im Klartext. Dies kann vermieden werden, indem der AUTHENTICATE-Befehl mit einem [SASL]- Mechanismus verwendet wird, der keine Klartext-Passwörter nutzt, oder indem zuvor eine Verschlüsselung über STARTTLS oder einen anderen Schutzmechanismus ausgehandelt wird.

Eine Server-Implementierung MUSS eine Konfiguration implementieren, die zum Zeitpunkt der Authentifizierung verlangt: (1) Der STARTTLS-Befehl wurde ausgehandelt. ODER (2) Es wurde ein anderer Mechanismus bereitgestellt, der die Sitzung vor dem Mitlesen von Passwörtern schützt. ODER (3) Folgende Maßnahmen sind vorhanden: (a) Die LOGINDISABLED-Fähigkeit wird angekündigt, und [SASL]- Mechanismen (wie PLAIN), die Klartext-Passwörter verwenden, werden NICHT in der CAPABILITY-Liste angekündigt. UND (b) Der LOGIN-Befehl gibt einen Fehler zurück, selbst wenn das Passwort korrekt ist. UND (c) Der AUTHENTICATE-Befehl gibt einen Fehler mit allen [SASL]- Mechanismen zurück, die Klartext-Passwörter verwenden, selbst wenn das Passwort korrekt ist.

Eine Server-Fehlermeldung für einen fehlschlagenden LOGIN-Befehl SOLLTE NICHT angeben, dass der Benutzername und nicht das Passwort ungültig ist.