メインコンテンツまでスキップ

9. Formal Syntax

RFC 3501 IMAPv4 March 2003

  1.  Sample IMAP4rev1 connection

    以下は, IMAP4rev1 接続の書き起こしである. このサンプル内の長い行は, 編集上の明確化のために改行されている.

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.  Formal Syntax

    以下の構文仕様は, [ABNF] で規定されている拡張 BNF (Augmented Backus-Naur Form, ABNF) 記法を使用する.

    後続の規則が先行の規則と重複するような選択肢またはオプションの規則の場合, より早くリストされている規則が優先されなければならない (MUST). 例えば, フラグとして解析される "\Seen" は, "\Seen" を flag-extension として解析できる場合でも, \Seen フラグ名であって flag-extension ではない. この規則の一部 (ただしすべてではない) の事例を以下に示す.

     注記: [ABNF] の規則には厳密に従わなければならない (MUST). 特に:

    (1) 特記しない限り, すべての英字は大文字と小文字を区別しない. トークン文字列を定義するための大文字または小文字の使用は, 編集上の明確化のみを目的とする. 実装は, これらの文字列を大文字と小文字を区別しない形で受け入れなければならない (MUST).

    (2) すべての場合において, SP は正確に 1 つのスペースを指す. TAB の代用, 追加のスペースの挿入, または SP を LWSP と等価と見なすことは許可されない.

    (3) ASCII NUL 文字, %x00 は, いかなる時も使用してはならない (MUST NOT).

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

addr-adl = nstring ; 非 NIL の場合, [RFC-2822] route-addr からの経路を保持

addr-host = nstring ; NIL は [RFC-2822] グループ構文を示す. ; それ以外の場合は [RFC-2822] ドメイン名を保持

addr-mailbox = nstring ; NIL は [RFC-2822] グループの終わりを示す. 非 NIL かつ ; addr-host が NIL の場合は [RFC-2822] グループ名を保持. ; それ以外の場合は, [RFC-2822] 引用を除去した後の ; [RFC-2822] local-part を保持

RFC 3501 IMAPv4 March 2003

addr-name = nstring ; 非 NIL の場合, [RFC-2822] 引用を除去した後の ; [RFC-2822] mailbox の phrase を保持

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 ; [SASL] で定義

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

base64-char = ALPHA / DIGIT / "+" / "/" ; 大文字と小文字を区別

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

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

body-extension = nstring / number / "(" body-extension *(SP body-extension) ")" ; 将来の拡張. クライアント実装は body-extension フィールドを ; 受け入れなければならない (MUST). サーバー実装は, この仕様の ; 将来の標準または標準トラックの改訂で定義される場合を除き, ; body-extension フィールドを生成してはならない (MUST NOT).

body-ext-1part = body-fld-md5 [SP body-fld-dsp [SP body-fld-lang [SP body-fld-loc *(SP body-extension)]]] ; 拡張不可の "BODY" フェッチでは返されてはならない (MUST NOT)

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)]]] ; 拡張不可の "BODY" フェッチでは返されてはならない (MUST NOT)

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 サブタイプは "RFC822" であってはならない (MUST NOT)

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 ; 新しい機能は "X" で始まるか, 標準または標準トラックとして ; IANA に登録されなければならない (MUST)

RFC 3501 IMAPv4 March 2003

capability-data = "CAPABILITY" *(SP capability) SP "IMAP4rev1" *(SP capability) ; サーバーは STARTTLS, AUTH=PLAIN, LOGINDISABLED の各機能を ; 実装しなければならない (MUST) ; RFC 1730 互換性を提供するサーバーは, 最初の機能として ; "IMAP4" をリストしなければならない (MUST)

CHAR8 = %x01-ff ; NUL, %x00 以外の任意の OCTET

command = tag SP (command-any / command-auth / command-nonauth / command-select) CRLF ; 状態に基づくモーダル

command-any = "CAPABILITY" / "LOGOUT" / "NOOP" / x-command ; すべての状態で有効

command-auth = append / create / delete / examine / list / lsub / rename / select / status / subscribe / unsubscribe ; 認証済み状態または選択済み状態でのみ有効

command-nonauth = login / authenticate / "STARTTLS" ; 未認証状態のときのみ有効

command-select = "CHECK" / "CLOSE" / "EXPUNGE" / copy / fetch / store / uid / search ; 選択済み状態のときのみ有効

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

copy = "COPY" SP sequence-set SP mailbox

create = "CREATE" SP mailbox ; INBOX を使用すると NO エラーとなる

date = date-text / DQUOTE date-text DQUOTE

date-day = 1*2DIGIT ; 月の日

date-day-fixed = (SP DIGIT) / 2DIGIT ; 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 ; INBOX を使用すると 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 ; "\Recent" を含まない

flag-extension = "" atom ; 将来の拡張. クライアント実装は flag-extension フラグを ; 受け入れなければならない (MUST). サーバー実装は, この仕様の ; 将来の標準または標準トラックの改訂で定義される場合を除き, ; flag-extension フラグを生成してはならない (MUST NOT).

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 ; 数値は CHAR8 の数を表す

login = "LOGIN" SP userid SP password

lsub = "LSUB" SP mailbox SP list-mailbox

RFC 3501 IMAPv4 March 2003

mailbox = "INBOX" / astring ; INBOX は大文字と小文字を区別しない. INBOX のすべての ; 大文字小文字の変種 (例: "iNbOx") は astring ではなく ; INBOX として解釈されなければならない (MUST). 大文字と小文字を ; 区別しない並び "I" "N" "B" "O" "X" からなる astring は, ; astring ではなく INBOX と見なされる. メールボックス名の ; さらに詳しい意味的詳細についてはセクション 5.1 を参照.

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 ; その他のフラグ. LIST レスポンスごとに複数可能

mbx-list-sflag = "\Noselect" / "\Marked" / "\Unmarked" ; 選択可能性フラグ. LIST レスポンスごとに 1 つのみ

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

media-message = DQUOTE "MESSAGE" DQUOTE SP DQUOTE "RFC822" DQUOTE ; [MIME-IMT] で定義

media-subtype = string ; [MIME-IMT] で定義

media-text = DQUOTE "TEXT" DQUOTE SP media-subtype ; [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)] ")" ; メッセージに対して変化し得る (MAY)

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 ; メッセージに対して変化してはならない (MUST NOT)

nil = "NIL"

nstring = string / nil

number = 1*DIGIT ; 符号なし 32 ビット整数 ; (0 <= n < 4,294,967,296)

nz-number = digit-nz *DIGIT ; 非ゼロの符号なし 32 ビット整数 ; (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 ; 宛先として INBOX を使用すると 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 ; サーバーは接続を直ちに閉じる

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

resp-cond-auth = ("OK" / "PREAUTH") SP resp-text ; 認証条件

RFC 3501 IMAPv4 March 2003

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

resp-cond-state = ("OK" / "NO" / "BAD") SP resp-text ; ステータス条件

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 引数は IANA に登録されなければならない (MUST)

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" / ; この行より上は [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" ; トップレベルまたは MESSAGE/RFC822 パート

section-part = nz-number *("." nz-number) ; ボディパートの入れ子

RFC 3501 IMAPv4 March 2003

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

section-text = section-msgtext / "MIME" ; 実際のボディパート以外のテキスト (ヘッダーなど)

select = "SELECT" SP mailbox

seq-number = nz-number / "" ; メッセージシーケンス番号 (COPY, FETCH, STORE コマンド) ; または一意識別子 (UID COPY, UID FETCH, UID STORE コマンド). ; * は使用中の最大の数を表す. メッセージシーケンス番号の ; 場合は, 空でないメールボックス内のメッセージ数である. ; 一意識別子の場合は, メールボックス内の最後のメッセージの ; 一意識別子, またはメールボックスが空の場合はそのメールボックスの ; 現在の UIDNEXT 値である. ; サーバーは, 選択されたメールボックス内のメッセージ数より ; 大きいメッセージシーケンス番号を使用するコマンドに対して, ; タグ付き BAD レスポンスで応答すべきである (SHOULD). ; これには, 選択されたメールボックスが空の場合の "" も含む.

seq-range = seq-number ":" seq-number ; 順序に関係なく, これら 2 つの seq-number 値およびその間の ; すべての値. ; 例: 2:4 と 4:2 は等価であり, 値 2, 3, 4 を示す. ; 例: 一意識別子シーケンス範囲 3291:* は, その値が 3291 より ; 小さい場合でも, メールボックス内の最後のメッセージの UID を含む.

sequence-set = (seq-number / seq-range) ("," sequence-set) ; 順序に関係なく, seq-number 値の集合. ; サーバーは重複を統合し, および/またはシーケンスを任意の順序で ; 実行してもよい (MAY). ; 例: 15 メッセージのメールボックスに対するメッセージシーケンス ; 番号集合 2,4:7,9,12: は, 2,4,5,6,7,9,12,13,14,15 と等価. ; 例: 10 メッセージのメールボックスに対するメッセージシーケンス ; 番号集合 *:4,5:7 は, 10,9,8,7,6,5,4,5,6,7 と等価であり, ; 4,5,6,7,8,9,10 に並べ替えおよび重複統合されてもよい (MAY).

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 ; 時 分 秒

uid = "UID" SP (copy / fetch / search / store) ; メッセージシーケンス番号の代わりに使用される一意識別子

uniqueid = nz-number ; 厳密に昇順

unsubscribe = "UNSUBSCRIBE" SP mailbox

userid = astring

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

zone = ("+" / "-") 4DIGIT ; グリニッジから東の時間と分を表す hhmm の符号付き 4 桁の値 ; (つまり, 与えられた時刻が協定世界時と異なる量). タイムゾーンを ; 与えられた時刻から減算すると UT 形式が得られる. ; 協定世界時のタイムゾーンは "+0000" である.

RFC 3501 IMAPv4 March 2003

  1. Author's Note

本文書は, それ以前の文書の改訂または書き直しであり, それらの文書のプロトコル仕様 (RFC 2060, RFC 1730, 未公開の IMAP2bis.TXT 文書, RFC 1176, RFC 1064) に取って代わる.

  1. Security Considerations

IMAP4rev1 プロトコルのトランザクションは, 電子メールデータを含め, 盗聴に対する保護が交渉されない限り, ネットワーク上を平文で送信される. これは, STARTTLS の使用, AUTHENTICATE コマンドにおける交渉されたプライバシー保護, またはその他の保護機構のいずれかによって達成できる.

11.1. STARTTLS セキュリティに関する考慮事項 (STARTTLS Security Considerations)​

本文書における STARTTLS コマンドおよび LOGINDISABLED 機能の仕様は, [IMAP-TLS] のそれに取って代わる. [IMAP-TLS] は PLAIN [SASL] 認証機構に対して規範的なままである.

IMAP クライアントおよびサーバー実装は, TLS_RSA_WITH_RC4_128_MD5 [TLS] 暗号スイートを実装しなければならず (MUST), TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA [TLS] 暗号スイートを実装すべきである (SHOULD). これは重要であり, あらゆる 2 つの準拠実装が相互運用するように構成できることが保証される. その他のすべての暗号スイートは OPTIONAL である. これは [IMAP-TLS] のセクション 2.1 からの変更であることに注意.

[TLS] 交渉中, クライアントは, 中間者攻撃を防ぐために, サーバー証明書メッセージに示されたサーバーの識別情報と照合して, 自身が理解するサーバーホスト名を確認しなければならない (MUST). 照合が失敗した場合, クライアントは明示的なユーザー確認を求めるか, 接続を終了しサーバーの識別情報が疑わしいことを示すべきである (SHOULD). 照合は次の規則に従って実行される:

    クライアントは, 接続を開くために使用したサーバーホスト名を, サーバー証明書に示されたサーバー名と照合するための値として使用しなければならない (MUST). クライアントは, 安全でないリモートソース (例: 安全でない DNS ルックアップ) から導出されたいかなる形式のサーバーホスト名も使用してはならない (MUST NOT). CNAME の正規化は行われない.

証明書に dNSName 型の subjectAltName 拡張が存在する場合, それをサーバーの識別情報のソースとして使用すべきである (SHOULD).

照合は大文字と小文字を区別しない.

RFC 3501 IMAPv4 March 2003

    "*" ワイルドカード文字は, 証明書内の最も左の名前要素として使用されてもよい (MAY). 例えば, *.example.com は a.example.com, foo.example.com などに一致するが, example.com には一致しない.

証明書に複数の名前 (例: 複数の dNSName フィールド) が含まれる場合, いずれかのフィールドとの照合が受け入れ可能と見なされる.

クライアントとサーバーの両方は, 許容可能な認証またはプライバシーが達成されたかどうかを確認するため, STARTTLS コマンドおよびその後の [TLS] 交渉の結果を確認しなければならない (MUST).

11.2. その他のセキュリティに関する考慮事項 (Other Security Considerations)​

無効な資格情報が原因で失敗した AUTHENTICATE コマンドに対するサーバーエラーメッセージは, 資格情報が無効である理由を詳細に述べるべきではない (SHOULD NOT).

LOGIN コマンドの使用は, パスワードを平文で送信する. これは, 平文パスワードを使用しない [SASL] メカニズムによる AUTHENTICATE コマンドを使用するか, 最初に STARTTLS またはその他の保護機構によって暗号化を交渉することによって回避できる.

サーバー実装は, 認証時に次のいずれかを要求する構成を実装しなければならない (MUST): (1) STARTTLS コマンドが交渉されている. または (2) セッションをパスワード盗聴から保護するその他の機構が提供されている. または (3) 次の措置が講じられている: (a) LOGINDISABLED 機能が通知されており, 平文パスワードを使用する [SASL] メカニズム (PLAIN など) は CAPABILITY リストに通知されない. および (b) パスワードが正しい場合でも, LOGIN コマンドはエラーを返す. および (c) パスワードが正しい場合でも, 平文パスワードを使用するすべての [SASL] メカニズムに対して, AUTHENTICATE コマンドはエラーを返す.

失敗した LOGIN コマンドに対するサーバーエラーメッセージは, パスワードではなく ユーザー名が無効であることを特定すべきではない (SHOULD NOT).