RFC2060规范三

7.1.1. OK Response

Contents: OPTIONAL response code
human-readable text

The OK response indicates an information message from the server.
When tagged, it indicates successful completion of the associated
command. The human-readable text MAY be presented to the user as
an information message. The untagged form indicates an
information-only message; the nature of the information MAY be
indicated by a response code.

The untagged form is also used as one of three possible greetings
at connection startup. It indicates that the connection is not
yet authenticated and that a LOGIN command is needed.

Example: S: * OK IMAP4rev1 server ready
C: A001 LOGIN fred blurdybloop
S: * OK [ALERT] System shutdown in 10 minutes
S: A001 OK LOGIN Completed

7.1.2. NO Response

Contents: OPTIONAL response code
human-readable text

The NO response indicates an operational error message from the
server. When tagged, it indicates unsuccessful completion of the
associated command. The untagged form indicates a warning; the
command can still complete successfully. The human-readable text
describes the condition.

Example: C: A222 COPY 1:2 owatagusiam
S: * NO Disk is 98% full, please delete unnecessary data
S: A222 OK COPY completed
C: A223 COPY 3:200 blurdybloop
S: * NO Disk is 98% full, please delete unnecessary data
S: * NO Disk is 99% full, please delete unnecessary data
S: A223 NO COPY failed: disk is full

7.1.3. BAD Response

Contents: OPTIONAL response code
human-readable text

The BAD response indicates an error message from the server. When
tagged, it reports a protocol-level error in the client's command;
the tag indicates the command that caused the error. The untagged
form indicates a protocol-level error for which the associated
command can not be determined; it can also indicate an internal
server failure. The human-readable text describes the condition.

Example: C: ...very long command line...
S: * BAD Command line too long
C: ...empty line...
S: * BAD Empty command line
C: A443 EXPUNGE
S: * BAD Disk crash, attempting salvage to a new disk!
S: * OK Salvage successful, no data lost
S: A443 OK Expunge completed

7.1.4. PREAUTH Response

Contents: OPTIONAL response code
human-readable text

The PREAUTH response is always untagged, and is one of three
possible greetings at connection startup. It indicates that the
connection has already been authenticated by external means and
thus no LOGIN command is needed.

Example: S: * PREAUTH IMAP4rev1 server logged in as Smith

7.1.5. BYE Response

Contents: OPTIONAL response code
human-readable text


The BYE response is always untagged, and indicates that the server
is about to close the connection. The human-readable text MAY be
displayed to the user in a status report by the client. The BYE
response is sent under one of four conditions:

1) as part of a normal logout sequence. The server will close
the connection after sending the tagged OK response to the
LOGOUT command.

2) as a panic shutdown announcement. The server closes the
connection immediately.

3) as an announcement of an inactivity autologout. The server
closes the connection immediately.

4) as one of three possible greetings at connection startup,
indicating that the server is not willing to accept a
connection from this client. The server closes the
connection immediately.

The difference between a BYE that occurs as part of a normal
LOGOUT sequence (the first case) and a BYE that occurs because of
a failure (the other three cases) is that the connection closes
immediately in the failure case.

Example: S: * BYE Autologout; idle for too long

7.2. Server Responses - Server and Mailbox Status

These responses are always untagged. This is how server and mailbox
status data are transmitted from the server to the client. Many of
these responses typically result from a command with the same name.

7.2.1. CAPABILITY Response

Contents: capability listing

The CAPABILITY response occurs as a result of a CAPABILITY
command. The capability listing contains a space-separated
listing of capability names that the server supports. The
capability listing MUST include the atom "IMAP4rev1".

A capability name which begins with "AUTH=" indicates that the
server supports that particular authentication mechanism.


Other capability names indicate that the server supports an
extension, revision, or amendment to the IMAP4rev1 protocol.
Server responses MUST conform to this document until the client
issues a command that uses the associated capability.

Capability names MUST either begin with "X" or be standard or
standards-track IMAP4rev1 extensions, revisions, or amendments
registered with IANA. A server MUST NOT offer unregistered or
non-standard capability names, unless such names are prefixed with
an "X".

Client implementations SHOULD NOT require any capability name
other than "IMAP4rev1", and MUST ignore any unknown capability
names.

Example: S: * CAPABILITY IMAP4rev1 AUTH=KERBEROS_V4 XPIG-LATIN

7.2.2. LIST Response

Contents: name attributes
hierarchy delimiter
name

The LIST response occurs as a result of a LIST command. It
returns a single name that matches the LIST specification. There
can be multiple LIST responses for a single LIST command.

Four name attributes are defined:

\Noinferiors It is not possible for any child levels of
hierarchy to exist under this name; no child levels
exist now and none can be created in the future.

\Noselect It is not possible to use this name as a selectable
mailbox.

\Marked The mailbox has been marked "interesting" by the
server; the mailbox probably contains messages that
have been added since the last time the mailbox was
selected.

\Unmarked The mailbox does not contain any additional
messages since the last time the mailbox was
selected.

If it is not feasible for the server to determine whether the
mailbox is "interesting" or not, or if the name is a \Noselect
name, the server SHOULD NOT send either \Marked or \Unmarked.

The hierarchy delimiter is a character used to delimit levels of
hierarchy in a mailbox name. A client can use it to create child
mailboxes, and to search higher or lower levels of naming
hierarchy. All children of a top-level hierarchy node MUST use
the same separator character. A NIL hierarchy delimiter means
that no hierarchy exists; the name is a "flat" name.

The name represents an unambiguous left-to-right hierarchy, and
MUST be valid for use as a reference in LIST and LSUB commands.
Unless \Noselect is indicated, the name MUST also be valid as an
argument for commands, such as SELECT, that accept mailbox
names.

Example: S: * LIST (\Noselect) "/" ~/Mail/foo

7.2.3. LSUB Response

Contents: name attributes
hierarchy delimiter
name

The LSUB response occurs as a result of an LSUB command. It
returns a single name that matches the LSUB specification. There
can be multiple LSUB responses for a single LSUB command. The
data is identical in format to the LIST response.

Example: S: * LSUB () "." #news.comp.mail.misc

7.2.4 STATUS Response

Contents: name
status parenthesized list

The STATUS response occurs as a result of an STATUS command. It
returns the mailbox name that matches the STATUS specification and
the requested mailbox status information.

Example: S: * STATUS blurdybloop (MESSAGES 231 UIDNEXT 44292)

7.2.5. SEARCH Response

Contents: zero or more numbers

The SEARCH response occurs as a result of a SEARCH or UID SEARCH
command. The number(s) refer to those messages that match the
search criteria. For SEARCH, these are message sequence numbers;
for UID SEARCH, these are unique identifiers. Each number is
delimited by a space.

Example: S: * SEARCH 2 3 6

7.2.6. FLAGS Response

Contents: flag parenthesized list

The FLAGS response occurs as a result of a SELECT or EXAMINE
command. The flag parenthesized list identifies the flags (at a
minimum, the system-defined flags) that are applicable for this
mailbox. Flags other than the system flags can also exist,
depending on server implementation.

The update from the FLAGS response MUST be recorded by the client.

Example: S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)

7.3. Server Responses - Mailbox Size

These responses are always untagged. This is how changes in the size
of the mailbox are trasnmitted from the server to the client.
Immediately following the "*" token is a number that represents a
message count.

7.3.1. EXISTS Response

Contents: none

The EXISTS response reports the number of messages in the mailbox.
This response occurs as a result of a SELECT or EXAMINE command,
and if the size of the mailbox changes (e.g. new mail).

The update from the EXISTS response MUST be recorded by the
client.

Example: S: * 23 EXISTS


7.3.2. RECENT Response

Contents: none

The RECENT response reports the number of messages with the
\Recent flag set. This response occurs as a result of a SELECT or
EXAMINE command, and if the size of the mailbox changes (e.g. new
mail).

Note: It is not guaranteed that the message sequence numbers of
recent messages will be a contiguous range of the highest n
messages in the mailbox (where n is the value reported by the
RECENT response). Examples of situations in which this is not
the case are: multiple clients having the same mailbox open
(the first session to be notified will see it as recent, others
will probably see it as non-recent), and when the mailbox is
re-ordered by a non-IMAP agent.

The only reliable way to identify recent messages is to look at
message flags to see which have the \Recent flag set, or to do
a SEARCH RECENT.

The update from the RECENT response MUST be recorded by the
client.

Example: S: * 5 RECENT

7.4. Server Responses - Message Status

These responses are always untagged. This is how message data are
transmitted from the server to the client, often as a result of a
command with the same name. Immediately following the "*" token is a
number that represents a message sequence number.

7.4.1. EXPUNGE Response

Contents: none

The EXPUNGE response reports that the specified message sequence
number has been permanently removed from the mailbox. The message
sequence number for each successive message in the mailbox is
immediately decremented by 1, and this decrement is reflected in
message sequence numbers in subsequent responses (including other
untagged EXPUNGE responses).

As a result of the immediate decrement rule, message sequence
numbers that appear in a set of successive EXPUNGE responses
depend upon whether the messages are removed starting from lower

numbers to higher numbers, or from higher numbers to lower
numbers. For example, if the last 5 messages in a 9-message
mailbox are expunged; a "lower to higher" server will send five
untagged EXPUNGE responses for message sequence number 5, whereas
a "higher to lower server" will send successive untagged EXPUNGE
responses for message sequence numbers 9, 8, 7, 6, and 5.

An EXPUNGE response MUST NOT be sent when no command is in
progress; nor while responding to a FETCH, STORE, or SEARCH
command. This rule is necessary to prevent a loss of
synchronization of message sequence numbers between client and
server.

The update from the EXPUNGE response MUST be recorded by the
client.

Example: S: * 44 EXPUNGE

7.4.2. FETCH Response

Contents: message data

The FETCH response returns data about a message to the client.
The data are pairs of data item names and their values in
parentheses. This response occurs as the result of a FETCH or
STORE command, as well as by unilateral server decision (e.g. flag
updates).

The current data items are:

BODY A form of BODYSTRUCTURE without extension data.

BODY[<section>]<<origin_octet>>
A string expressing the body contents of the
specified section. The string SHOULD be
interpreted by the client according to the content
transfer encoding, body type, and subtype.

If the origin octet is specified, this string is a
substring of the entire body contents, starting at
that origin octet. This means that BODY[]<0> MAY
be truncated, but BODY[] is NEVER truncated.

8-bit textual data is permitted if a [CHARSET]
identifier is part of the body parameter
parenthesized list for this section. Note that
headers (part specifiers HEADER or MIME, or the
header portion of a MESSAGE/RFC822 part), MUST be

7-bit; 8-bit characters are not permitted in
headers. Note also that the blank line at the end
of the header is always included in header data.

Non-textual data such as binary data MUST be
transfer encoded into a textual form such as BASE64
prior to being sent to the client. To derive the
original binary data, the client MUST decode the
transfer encoded string.

BODYSTRUCTURE A parenthesized list that describes the [MIME-IMB]
body structure of a message. This is computed by
the server by parsing the [MIME-IMB] header fields,
defaulting various fields as necessary.

For example, a simple text message of 48 lines and
2279 octets can have a body structure of: ("TEXT"
"PLAIN" ("CHARSET" "US-ASCII") NIL NIL "7BIT" 2279
48)

Multiple parts are indicated by parenthesis
nesting. Instead of a body type as the first
element of the parenthesized list there is a nested
body. The second element of the parenthesized list
is the multipart subtype (mixed, digest, parallel,
alternative, etc.).

For example, a two part message consisting of a
text and a BASE645-encoded text attachment can have
a body structure of: (("TEXT" "PLAIN" ("CHARSET"
"US-ASCII") NIL NIL "7BIT" 1152 23)("TEXT" "PLAIN"
("CHARSET" "US-ASCII" "NAME" "cc.diff")
"<960723163407.20117h@cac.washington.edu>"
"Compiler diff" "BASE64" 4554 73) "MIXED"))

Extension data follows the multipart subtype.
Extension data is never returned with the BODY
fetch, but can be returned with a BODYSTRUCTURE
fetch. Extension data, if present, MUST be in the
defined order.

The extension data of a multipart body part are in
the following order:

body parameter parenthesized list
A parenthesized list of attribute/value pairs
[e.g. ("foo" "bar" "baz" "rag") where "bar" is
the value of "foo" and "rag" is the value of


"baz"] as defined in [MIME-IMB].

body disposition
A parenthesized list, consisting of a
disposition type string followed by a
parenthesized list of disposition
attribute/value pairs. The disposition type and
attribute names will be defined in a future
standards-track revision to [DISPOSITION].

body language
A string or parenthesized list giving the body
language value as defined in [LANGUAGE-TAGS].

Any following extension data are not yet defined in
this version of the protocol. Such extension data
can consist of zero or more NILs, strings, numbers,
or potentially nested parenthesized lists of such
data. Client implementations that do a
BODYSTRUCTURE fetch MUST be prepared to accept such
extension data. Server implementations MUST NOT
send such extension data until it has been defined
by a revision of this protocol.

The basic fields of a non-multipart body part are
in the following order:

body type
A string giving the content media type name as
defined in [MIME-IMB].

body subtype
A string giving the content subtype name as
defined in [MIME-IMB].

body parameter parenthesized list
A parenthesized list of attribute/value pairs
[e.g. ("foo" "bar" "baz" "rag") where "bar" is
the value of "foo" and "rag" is the value of
"baz"] as defined in [MIME-IMB].

body id
A string giving the content id as defined in
[MIME-IMB].

body description
A string giving the content description as
defined in [MIME-IMB].


body encoding
A string giving the content transfer encoding as
defined in [MIME-IMB].

body size
A number giving the size of the body in octets.
Note that this size is the size in its transfer
encoding and not the resulting size after any
decoding.

A body type of type MESSAGE and subtype RFC822
contains, immediately after the basic fields, the
envelope structure, body structure, and size in
text lines of the encapsulated message.

A body type of type TEXT contains, immediately
after the basic fields, the size of the body in
text lines. Note that this size is the size in its
content transfer encoding and not the resulting
size after any decoding.

Extension data follows the basic fields and the
type-specific fields listed above. Extension data
is never returned with the BODY fetch, but can be
returned with a BODYSTRUCTURE fetch. Extension
data, if present, MUST be in the defined order.

The extension data of a non-multipart body part are
in the following order:

body MD5
A string giving the body MD5 value as defined in
[MD5].

body disposition
A parenthesized list with the same content and
function as the body disposition for a multipart
body part.

body language
A string or parenthesized list giving the body
language value as defined in [LANGUAGE-TAGS].

Any following extension data are not yet defined in
this version of the protocol, and would be as
described above under multipart extension data.


ENVELOPE A parenthesized list that describes the envelope
structure of a message. This is computed by the
server by parsing the [RFC-822] header into the
component parts, defaulting various fields as
necessary.

The fields of the envelope structure are in the
following order: date, subject, from, sender,
reply-to, to, cc, bcc, in-reply-to, and message-id.
The date, subject, in-reply-to, and message-id
fields are strings. The from, sender, reply-to,
to, cc, and bcc fields are parenthesized lists of
address structures.

An address structure is a parenthesized list that
describes an electronic mail address. The fields
of an address structure are in the following order:
personal name, [SMTP] at-domain-list (source
route), mailbox name, and host name.

[RFC-822] group syntax is indicated by a special
form of address structure in which the host name
field is NIL. If the mailbox name field is also
NIL, this is an end of group marker (semi-colon in
RFC 822 syntax). If the mailbox name field is
non-NIL, this is a start of group marker, and the
mailbox name field holds the group name phrase.

Any field of an envelope or address structure that
is not applicable is presented as NIL. Note that
the server MUST default the reply-to and sender
fields from the from field; a client is not
expected to know to do this.

FLAGS A parenthesized list of flags that are set for this
message.

INTERNALDATE A string representing the internal date of the
message.

RFC822 Equivalent to BODY[].

RFC822.HEADER Equivalent to BODY.PEEK[HEADER].

RFC822.SIZE A number expressing the [RFC-822] size of the
message.

RFC822.TEXT Equivalent to BODY[TEXT].


UID A number expressing the unique identifier of the
message.


Example: S: * 23 FETCH (FLAGS (\Seen) RFC822.SIZE 44827)

7.5. Server Responses - Command Continuation Request

The command continuation request response is indicated by a "+" token
instead of a tag. This form of response indicates that the server is
ready to accept the continuation of a command from the client. The
remainder of this response is a line of text.

This response is used in the AUTHORIZATION command to transmit server
data to the client, and request additional client data. This
response is also used if an argument to any command is a literal.

The client is not permitted to send the octets of the literal unless
the server indicates that it expects it. This permits the server to
process commands and reject errors on a line-by-line basis. The
remainder of the command, including the CRLF that terminates a
command, follows the octets of the literal. If there are any
additional command arguments the literal octets are followed by a
space and those arguments.

Example: C: A001 LOGIN {11}
S: + Ready for additional command text
C: FRED FOOBAR {7}
S: + Ready for additional command text
C: fat man
S: A001 OK LOGIN completed
C: A044 BLURDYBLOOP {102856}
S: A044 BAD No such command as "BLURDYBLOOP"

8. Sample IMAP4rev1 connection

The following is a transcript of an IMAP4rev1 connection. A long
line in this sample is broken for editorial clarity.

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" "INFOODS.MIT.EDU")) NIL NIL
"<B27397-0100000@cac.washington.edu>")
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] {350}
S: Date: Wed, 17 Jul 1996 02:23:25 -0700 (PDT)
S: From: Terry Gray <gray@cac.washington.edu>
S: Subject: IMAP4rev1 WG mtg summary and minutes
S: To: imap@cac.washington.edu
S: cc: minutes@CNRI.Reston.VA.US, John Klensin <KLENSIN@INFOODS.MIT.EDU>
S: Message-Id: <B27397-0100000@cac.washington.edu>
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

9. Formal Syntax

The following syntax specification uses the augmented Backus-Naur
Form (BNF) notation as specified in [RFC-822] with one exception; the
delimiter used with the "#" construct is a single space (SPACE) and
not one or more commas.

In the case of alternative or optional rules in which a later rule
overlaps an earlier rule, the rule which is listed earlier MUST take
priority. For example, "\Seen" when parsed as a flag is the \Seen
flag name and not a flag_extension, even though "\Seen" could be
parsed as a flag_extension. Some, but not all, instances of this
rule are noted below.


Except as noted otherwise, all alphabetic characters are case-
insensitive. The use of upper or lower case characters to define
token strings is for editorial clarity only. Implementations MUST
accept these strings in a case-insensitive fashion.

address ::= "(" addr_name SPACE addr_adl SPACE addr_mailbox
SPACE addr_host ")"

addr_adl ::= nstring
;; Holds route from [RFC-822] route-addr if
;; non-NIL

addr_host ::= nstring
;; NIL indicates [RFC-822] group syntax.
;; Otherwise, holds [RFC-822] domain name

addr_mailbox ::= nstring
;; NIL indicates end of [RFC-822] group; if
;; non-NIL and addr_host is NIL, holds
;; [RFC-822] group name.
;; Otherwise, holds [RFC-822] local-part

addr_name ::= nstring
;; Holds phrase from [RFC-822] mailbox if
;; non-NIL

alpha ::= "A" / "B" / "C" / "D" / "E" / "F" / "G" / "H" /
"I" / "J" / "K" / "L" / "M" / "N" / "O" / "P" /
"Q" / "R" / "S" / "T" / "U" / "V" / "W" / "X" /
"Y" / "Z" /
"a" / "b" / "c" / "d" / "e" / "f" / "g" / "h" /
"i" / "j" / "k" / "l" / "m" / "n" / "o" / "p" /
"q" / "r" / "s" / "t" / "u" / "v" / "w" / "x" /
"y" / "z"
;; Case-sensitive

append ::= "APPEND" SPACE mailbox [SPACE flag_list]
[SPACE date_time] SPACE literal

astring ::= atom / string

atom ::= 1*ATOM_CHAR

ATOM_CHAR ::= <any CHAR except atom_specials>

atom_specials ::= "(" / ")" / "{" / SPACE / CTL / list_wildcards /
quoted_specials


Crispin Standards Track [Page 65]

RFC 2060 IMAP4rev1 December 1996


authenticate ::= "AUTHENTICATE" SPACE auth_type *(CRLF base64)

auth_type ::= atom
;; Defined by [IMAP-AUTH]

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 / "(" 1#body_extension ")"
;; Future expansion. Client implementations
;; MUST accept body_extension fields. Server
;; implementations MUST NOT generate
;; body_extension fields except as defined by
;; future standard or standards-track
;; revisions of this specification.

body_ext_1part ::= body_fld_md5 [SPACE body_fld_dsp
[SPACE body_fld_lang
[SPACE 1#body_extension]]]
;; MUST NOT be returned on non-extensible
;; "BODY" fetch

body_ext_mpart ::= body_fld_param
[SPACE body_fld_dsp SPACE body_fld_lang
[SPACE 1#body_extension]]
;; MUST NOT be returned on non-extensible
;; "BODY" fetch

body_fields ::= body_fld_param SPACE body_fld_id SPACE
body_fld_desc SPACE body_fld_enc SPACE
body_fld_octets

body_fld_desc ::= nstring

body_fld_dsp ::= "(" string SPACE body_fld_param ")" / nil

body_fld_enc ::= (<"> ("7BIT" / "8BIT" / "BINARY" / "BASE64"/
"QUOTED-PRINTABLE") <">) / string

body_fld_id ::= nstring

body_fld_lang ::= nstring / "(" 1#string ")"


Crispin Standards Track [Page 66]

RFC 2060 IMAP4rev1 December 1996


body_fld_lines ::= number

body_fld_md5 ::= nstring

body_fld_octets ::= number

body_fld_param ::= "(" 1#(string SPACE string) ")" / nil

body_type_1part ::= (body_type_basic / body_type_msg / body_type_text)
[SPACE body_ext_1part]

body_type_basic ::= media_basic SPACE body_fields
;; MESSAGE subtype MUST NOT be "RFC822"

body_type_mpart ::= 1*body SPACE media_subtype
[SPACE body_ext_mpart]

body_type_msg ::= media_message SPACE body_fields SPACE envelope
SPACE body SPACE body_fld_lines

body_type_text ::= media_text SPACE body_fields SPACE body_fld_lines

capability ::= "AUTH=" auth_type / atom
;; New capabilities MUST begin with "X" or be
;; registered with IANA as standard or
;; standards-track

capability_data ::= "CAPABILITY" SPACE [1#capability SPACE] "IMAP4rev1"
[SPACE 1#capability]
;; IMAP4rev1 servers which offer RFC 1730
;; compatibility MUST list "IMAP4" as the first
;; capability.

CHAR ::= <any 7-bit US-ASCII character except NUL,
0x01 - 0x7f>

CHAR8 ::= <any 8-bit octet except NUL, 0x01 - 0xff>

command ::= tag SPACE (command_any / command_auth /
command_nonauth / command_select) CRLF
;; Modal based on state

command_any ::= "CAPABILITY" / "LOGOUT" / "NOOP" / x_command
;; Valid in all states

command_auth ::= append / create / delete / examine / list / lsub /
rename / select / status / subscribe / unsubscribe
;; Valid only in Authenticated or Selected state


command_nonauth ::= login / authenticate
;; Valid only when in Non-Authenticated state

command_select ::= "CHECK" / "CLOSE" / "EXPUNGE" /
copy / fetch / store / uid / search
;; Valid only when in Selected state

continue_req ::= "+" SPACE (resp_text / base64)

copy ::= "COPY" SPACE set SPACE mailbox

CR ::= <ASCII CR, carriage return, 0x0D>

create ::= "CREATE" SPACE mailbox
;; Use of INBOX gives a NO error

CRLF ::= CR LF

CTL ::= <any ASCII control character and DEL,
0x00 - 0x1f, 0x7f>

date ::= date_text / <"> date_text <">

date_day ::= 1*2digit
;; Day of month

date_day_fixed ::= (SPACE digit) / 2digit
;; Fixed-format version of date_day

date_month ::= "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" /
"Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec"

date_text ::= date_day "-" date_month "-" date_year

date_year ::= 4digit

date_time ::= <"> date_day_fixed "-" date_month "-" date_year
SPACE time SPACE zone <">

delete ::= "DELETE" SPACE mailbox
;; Use of INBOX gives a NO error

digit ::= "0" / digit_nz

digit_nz ::= "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" /
"9"


envelope ::= "(" env_date SPACE env_subject SPACE env_from
SPACE env_sender SPACE env_reply_to SPACE env_to
SPACE env_cc SPACE env_bcc SPACE env_in_reply_to
SPACE 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" SPACE mailbox

fetch ::= "FETCH" SPACE set SPACE ("ALL" / "FULL" /
"FAST" / fetch_att / "(" 1#fetch_att ")")

fetch_att ::= "ENVELOPE" / "FLAGS" / "INTERNALDATE" /
"RFC822" [".HEADER" / ".SIZE" / ".TEXT"] /
"BODY" ["STRUCTURE"] / "UID" /
"BODY" [".PEEK"] section
["<" number "." nz_number ">"]

flag ::= "\Answered" / "\Flagged" / "\Deleted" /
"\Seen" / "\Draft" / flag_keyword / flag_extension

flag_extension ::= "\" atom
;; Future expansion. Client implementations
;; MUST accept flag_extension flags. Server
;; implementations MUST NOT generate
;; flag_extension flags except as defined by
;; future standard or standards-track
;; revisions of this specification.

flag_keyword ::= atom


flag_list ::= "(" #flag ")"

greeting ::= "*" SPACE (resp_cond_auth / resp_cond_bye) CRLF

header_fld_name ::= astring

header_list ::= "(" 1#header_fld_name ")"

LF ::= <ASCII LF, line feed, 0x0A>

list ::= "LIST" SPACE mailbox SPACE list_mailbox

list_mailbox ::= 1*(ATOM_CHAR / list_wildcards) / string

list_wildcards ::= "%" / "*"

literal ::= "{" number "}" CRLF *CHAR8
;; Number represents the number of CHAR8 octets

login ::= "LOGIN" SPACE userid SPACE password

lsub ::= "LSUB" SPACE mailbox SPACE list_mailbox

mailbox ::= "INBOX" / astring
;; INBOX is case-insensitive. All case variants of
;; INBOX (e.g. "iNbOx") MUST be interpreted as INBOX
;; not as an astring. Refer to section 5.1 for
;; further semantic details of mailbox names.

mailbox_data ::= "FLAGS" SPACE flag_list /
"LIST" SPACE mailbox_list /
"LSUB" SPACE mailbox_list /
"MAILBOX" SPACE text /
"SEARCH" [SPACE 1#nz_number] /
"STATUS" SPACE mailbox SPACE
"(" #<status_att number ")" /
number SPACE "EXISTS" / number SPACE "RECENT"

mailbox_list ::= "(" #("\Marked" / "\Noinferiors" /
"\Noselect" / "\Unmarked" / flag_extension) ")"
SPACE (<"> QUOTED_CHAR <"> / nil) SPACE mailbox

media_basic ::= (<"> ("APPLICATION" / "AUDIO" / "IMAGE" /
"MESSAGE" / "VIDEO") <">) / string)
SPACE media_subtype
;; Defined in [MIME-IMT]

media_message ::= <"> "MESSAGE" <"> SPACE <"> "RFC822" <">


;; Defined in [MIME-IMT]

media_subtype ::= string
;; Defined in [MIME-IMT]

media_text ::= <"> "TEXT" <"> SPACE media_subtype
;; Defined in [MIME-IMT]

message_data ::= nz_number SPACE ("EXPUNGE" /
("FETCH" SPACE msg_att))

msg_att ::= "(" 1#("ENVELOPE" SPACE envelope /
"FLAGS" SPACE "(" #(flag / "\Recent") ")" /
"INTERNALDATE" SPACE date_time /
"RFC822" [".HEADER" / ".TEXT"] SPACE nstring /
"RFC822.SIZE" SPACE number /
"BODY" ["STRUCTURE"] SPACE body /
"BODY" section ["<" number ">"] SPACE nstring /
"UID" SPACE uniqueid) ")"

nil ::= "NIL"

nstring ::= string / nil

number ::= 1*digit
;; Unsigned 32-bit integer
;; (0 <= n < 4,294,967,296)

nz_number ::= digit_nz *digit
;; Non-zero unsigned 32-bit integer
;; (0 < n < 4,294,967,296)

password ::= astring

quoted ::= <"> *QUOTED_CHAR <">

QUOTED_CHAR ::= <any TEXT_CHAR except quoted_specials> /
"\" quoted_specials

quoted_specials ::= <"> / "\"

rename ::= "RENAME" SPACE mailbox SPACE mailbox
;; Use of INBOX as a destination gives a NO error

response ::= *(continue_req / response_data) response_done

response_data ::= "*" SPACE (resp_cond_state / resp_cond_bye /
mailbox_data / message_data / capability_data)


Crispin Standards Track [Page 71]

RFC 2060 IMAP4rev1 December 1996


CRLF

response_done ::= response_tagged / response_fatal

response_fatal ::= "*" SPACE resp_cond_bye CRLF
;; Server closes connection immediately

response_tagged ::= tag SPACE resp_cond_state CRLF

resp_cond_auth ::= ("OK" / "PREAUTH") SPACE resp_text
;; Authentication condition

resp_cond_bye ::= "BYE" SPACE resp_text

resp_cond_state ::= ("OK" / "NO" / "BAD") SPACE resp_text
;; Status condition

resp_text ::= ["[" resp_text_code "]" SPACE] (text_mime2 / text)
;; text SHOULD NOT begin with "[" or "="

resp_text_code ::= "ALERT" / "PARSE" /
"PERMANENTFLAGS" SPACE "(" #(flag / "\*") ")" /
"READ-ONLY" / "READ-WRITE" / "TRYCREATE" /
"UIDVALIDITY" SPACE nz_number /
"UNSEEN" SPACE nz_number /
atom [SPACE 1*<any TEXT_CHAR except "]">]

search ::= "SEARCH" SPACE ["CHARSET" SPACE astring SPACE]
1#search_key
;; [CHARSET] MUST be registered with IANA

search_key ::= "ALL" / "ANSWERED" / "BCC" SPACE astring /
"BEFORE" SPACE date / "BODY" SPACE astring /
"CC" SPACE astring / "DELETED" / "FLAGGED" /
"FROM" SPACE astring /
"KEYWORD" SPACE flag_keyword / "NEW" / "OLD" /
"ON" SPACE date / "RECENT" / "SEEN" /
"SINCE" SPACE date / "SUBJECT" SPACE astring /
"TEXT" SPACE astring / "TO" SPACE astring /
"UNANSWERED" / "UNDELETED" / "UNFLAGGED" /
"UNKEYWORD" SPACE flag_keyword / "UNSEEN" /
;; Above this line were in [IMAP2]
"DRAFT" /
"HEADER" SPACE header_fld_name SPACE astring /
"LARGER" SPACE number / "NOT" SPACE search_key /
"OR" SPACE search_key SPACE search_key /
"SENTBEFORE" SPACE date / "SENTON" SPACE date /
"SENTSINCE" SPACE date / "SMALLER" SPACE number /


"UID" SPACE set / "UNDRAFT" / set /
"(" 1#search_key ")"

section ::= "[" [section_text / (nz_number *["." nz_number]
["." (section_text / "MIME")])] "]"

section_text ::= "HEADER" / "HEADER.FIELDS" [".NOT"]
SPACE header_list / "TEXT"

select ::= "SELECT" SPACE mailbox

sequence_num ::= nz_number / "*"
;; * is the largest number in use. For message
;; sequence numbers, it is the number of messages
;; in the mailbox. For unique identifiers, it is
;; the unique identifier of the last message in
;; the mailbox.

set ::= sequence_num / (sequence_num ":" sequence_num) /
(set "," set)
;; Identifies a set of messages. For message
;; sequence numbers, these are consecutive
;; numbers from 1 to the number of messages in
;; the mailbox
;; Comma delimits individual numbers, colon
;; delimits between two numbers inclusive.
;; Example: 2,4:7,9,12:* is 2,4,5,6,7,9,12,13,
;; 14,15 for a mailbox with 15 messages.

SPACE ::= <ASCII SP, space, 0x20>

status ::= "STATUS" SPACE mailbox SPACE "(" 1#status_att ")"

status_att ::= "MESSAGES" / "RECENT" / "UIDNEXT" / "UIDVALIDITY" /
"UNSEEN"

store ::= "STORE" SPACE set SPACE store_att_flags

store_att_flags ::= (["+" / "-"] "FLAGS" [".SILENT"]) SPACE
(flag_list / #flag)

string ::= quoted / literal

subscribe ::= "SUBSCRIBE" SPACE mailbox

tag ::= 1*<any ATOM_CHAR except "+">

text ::= 1*TEXT_CHAR


text_mime2 ::= "=?" <charset> "?" <encoding> "?"
<encoded-text> "?="
;; Syntax defined in [MIME-HDRS]

TEXT_CHAR ::= <any CHAR except CR and LF>

time ::= 2digit ":" 2digit ":" 2digit
;; Hours minutes seconds

uid ::= "UID" SPACE (copy / fetch / search / store)
;; Unique identifiers used instead of message
;; sequence numbers

uniqueid ::= nz_number
;; Strictly ascending

unsubscribe ::= "UNSUBSCRIBE" SPACE mailbox

userid ::= astring

x_command ::= "X" atom <experimental command arguments>

zone ::= ("+" / "-") 4digit
;; Signed four-digit value of hhmm representing
;; hours and minutes west of Greenwich (that is,
;; (the amount that the given time differs from
;; Universal Time). Subtracting the timezone
;; from the given time will give the UT form.
;; The Universal Time zone is "+0000".

10. Author's Note

This document is a revision or rewrite of earlier documents, and
supercedes the protocol specification in those documents: RFC 1730,
unpublished IMAP2bis.TXT document, RFC 1176, and RFC 1064.

11. Security Considerations

IMAP4rev1 protocol transactions, including electronic mail data, are
sent in the clear over the network unless privacy protection is
negotiated in the AUTHENTICATE command.

A server error message for an AUTHENTICATE command which fails due to
invalid credentials SHOULD NOT detail why the credentials are
invalid.

Use of the LOGIN command sends passwords in the clear. This can be
avoided by using the AUTHENTICATE command instead.


A server error message for a failing LOGIN command SHOULD NOT specify
that the user name, as opposed to the password, is invalid.

Additional security considerations are discussed in the section
discussing the AUTHENTICATE and LOGIN commands.

12. Author's Address

Mark R. Crispin
Networks and Distributed Computing
University of Washington
4545 15th Aveneue NE
Seattle, WA 98105-4527

Phone: (206) 543-5762

EMail: MRC@CAC.Washington.EDU


7.1.1. OK Response

Contents: OPTIONAL response code
human-readable text

The OK response indicates an information message from the server.
When tagged, it indicates successful completion of the associated
command. The human-readable text MAY be presented to the user as
an information message. The untagged form indicates an
information-only message; the nature of the information MAY be
indicated by a response code.

The untagged form is also used as one of three possible greetings
at connection startup. It indicates that the connection is not
yet authenticated and that a LOGIN command is needed.

Example: S: * OK IMAP4rev1 server ready
C: A001 LOGIN fred blurdybloop
S: * OK [ALERT] System shutdown in 10 minutes
S: A001 OK LOGIN Completed

7.1.2. NO Response

Contents: OPTIONAL response code
human-readable text

The NO response indicates an operational error message from the
server. When tagged, it indicates unsuccessful completion of the
associated command. The untagged form indicates a warning; the
command can still complete successfully. The human-readable text
describes the condition.

Example: C: A222 COPY 1:2 owatagusiam
S: * NO Disk is 98% full, please delete unnecessary data
S: A222 OK COPY completed
C: A223 COPY 3:200 blurdybloop
S: * NO Disk is 98% full, please delete unnecessary data
S: * NO Disk is 99% full, please delete unnecessary data
S: A223 NO COPY failed: disk is full

7.1.3. BAD Response

Contents: OPTIONAL response code
human-readable text

The BAD response indicates an error message from the server. When
tagged, it reports a protocol-level error in the client's command;
the tag indicates the command that caused the error. The untagged
form indicates a protocol-level error for which the associated
command can not be determined; it can also indicate an internal
server failure. The human-readable text describes the condition.

Example: C: ...very long command line...
S: * BAD Command line too long
C: ...empty line...
S: * BAD Empty command line
C: A443 EXPUNGE
S: * BAD Disk crash, attempting salvage to a new disk!
S: * OK Salvage successful, no data lost
S: A443 OK Expunge completed

7.1.4. PREAUTH Response

Contents: OPTIONAL response code
human-readable text

The PREAUTH response is always untagged, and is one of three
possible greetings at connection startup. It indicates that the
connection has already been authenticated by external means and
thus no LOGIN command is needed.

Example: S: * PREAUTH IMAP4rev1 server logged in as Smith

7.1.5. BYE Response

Contents: OPTIONAL response code
human-readable text


The BYE response is always untagged, and indicates that the server
is about to close the connection. The human-readable text MAY be
displayed to the user in a status report by the client. The BYE
response is sent under one of four conditions:

1) as part of a normal logout sequence. The server will close
the connection after sending the tagged OK response to the
LOGOUT command.

2) as a panic shutdown announcement. The server closes the
connection immediately.

3) as an announcement of an inactivity autologout. The server
closes the connection immediately.

4) as one of three possible greetings at connection startup,
indicating that the server is not willing to accept a
connection from this client. The server closes the
connection immediately.

The difference between a BYE that occurs as part of a normal
LOGOUT sequence (the first case) and a BYE that occurs because of
a failure (the other three cases) is that the connection closes
immediately in the failure case.

Example: S: * BYE Autologout; idle for too long

7.2. Server Responses - Server and Mailbox Status

These responses are always untagged. This is how server and mailbox
status data are transmitted from the server to the client. Many of
these responses typically result from a command with the same name.

7.2.1. CAPABILITY Response

Contents: capability listing

The CAPABILITY response occurs as a result of a CAPABILITY
command. The capability listing contains a space-separated
listing of capability names that the server supports. The
capability listing MUST include the atom "IMAP4rev1".

A capability name which begins with "AUTH=" indicates that the
server supports that particular authentication mechanism.


Other capability names indicate that the server supports an
extension, revision, or amendment to the IMAP4rev1 protocol.
Server responses MUST conform to this document until the client
issues a command that uses the associated capability.

Capability names MUST either begin with "X" or be standard or
standards-track IMAP4rev1 extensions, revisions, or amendments
registered with IANA. A server MUST NOT offer unregistered or
non-standard capability names, unless such names are prefixed with
an "X".

Client implementations SHOULD NOT require any capability name
other than "IMAP4rev1", and MUST ignore any unknown capability
names.

Example: S: * CAPABILITY IMAP4rev1 AUTH=KERBEROS_V4 XPIG-LATIN

7.2.2. LIST Response

Contents: name attributes
hierarchy delimiter
name

The LIST response occurs as a result of a LIST command. It
returns a single name that matches the LIST specification. There
can be multiple LIST responses for a single LIST command.

Four name attributes are defined:

\Noinferiors It is not possible for any child levels of
hierarchy to exist under this name; no child levels
exist now and none can be created in the future.

\Noselect It is not possible to use this name as a selectable
mailbox.

\Marked The mailbox has been marked "interesting" by the
server; the mailbox probably contains messages that
have been added since the last time the mailbox was
selected.

\Unmarked The mailbox does not contain any additional
messages since the last time the mailbox was
selected.

If it is not feasible for the server to determine whether the
mailbox is "interesting" or not, or if the name is a \Noselect
name, the server SHOULD NOT send either \Marked or \Unmarked.

The hierarchy delimiter is a character used to delimit levels of
hierarchy in a mailbox name. A client can use it to create child
mailboxes, and to search higher or lower levels of naming
hierarchy. All children of a top-level hierarchy node MUST use
the same separator character. A NIL hierarchy delimiter means
that no hierarchy exists; the name is a "flat" name.

The name represents an unambiguous left-to-right hierarchy, and
MUST be valid for use as a reference in LIST and LSUB commands.
Unless \Noselect is indicated, the name MUST also be valid as an
argument for commands, such as SELECT, that accept mailbox
names.

Example: S: * LIST (\Noselect) "/" ~/Mail/foo

7.2.3. LSUB Response

Contents: name attributes
hierarchy delimiter
name

The LSUB response occurs as a result of an LSUB command. It
returns a single name that matches the LSUB specification. There
can be multiple LSUB responses for a single LSUB command. The
data is identical in format to the LIST response.

Example: S: * LSUB () "." #news.comp.mail.misc

7.2.4 STATUS Response

Contents: name
status parenthesized list

The STATUS response occurs as a result of an STATUS command. It
returns the mailbox name that matches the STATUS specification and
the requested mailbox status information.

Example: S: * STATUS blurdybloop (MESSAGES 231 UIDNEXT 44292)

7.2.5. SEARCH Response

Contents: zero or more numbers

The SEARCH response occurs as a result of a SEARCH or UID SEARCH
command. The number(s) refer to those messages that match the
search criteria. For SEARCH, these are message sequence numbers;
for UID SEARCH, these are unique identifiers. Each number is
delimited by a space.

Example: S: * SEARCH 2 3 6

7.2.6. FLAGS Response

Contents: flag parenthesized list

The FLAGS response occurs as a result of a SELECT or EXAMINE
command. The flag parenthesized list identifies the flags (at a
minimum, the system-defined flags) that are applicable for this
mailbox. Flags other than the system flags can also exist,
depending on server implementation.

The update from the FLAGS response MUST be recorded by the client.

Example: S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)

7.3. Server Responses - Mailbox Size

These responses are always untagged. This is how changes in the size
of the mailbox are trasnmitted from the server to the client.
Immediately following the "*" token is a number that represents a
message count.

7.3.1. EXISTS Response

Contents: none

The EXISTS response reports the number of messages in the mailbox.
This response occurs as a result of a SELECT or EXAMINE command,
and if the size of the mailbox changes (e.g. new mail).

The update from the EXISTS response MUST be recorded by the
client.

Example: S: * 23 EXISTS


7.3.2. RECENT Response

Contents: none

The RECENT response reports the number of messages with the
\Recent flag set. This response occurs as a result of a SELECT or
EXAMINE command, and if the size of the mailbox changes (e.g. new
mail).

Note: It is not guaranteed that the message sequence numbers of
recent messages will be a contiguous range of the highest n
messages in the mailbox (where n is the value reported by the
RECENT response). Examples of situations in which this is not
the case are: multiple clients having the same mailbox open
(the first session to be notified will see it as recent, others
will probably see it as non-recent), and when the mailbox is
re-ordered by a non-IMAP agent.

The only reliable way to identify recent messages is to look at
message flags to see which have the \Recent flag set, or to do
a SEARCH RECENT.

The update from the RECENT response MUST be recorded by the
client.

Example: S: * 5 RECENT

7.4. Server Responses - Message Status

These responses are always untagged. This is how message data are
transmitted from the server to the client, often as a result of a
command with the same name. Immediately following the "*" token is a
number that represents a message sequence number.

7.4.1. EXPUNGE Response

Contents: none

The EXPUNGE response reports that the specified message sequence
number has been permanently removed from the mailbox. The message
sequence number for each successive message in the mailbox is
immediately decremented by 1, and this decrement is reflected in
message sequence numbers in subsequent responses (including other
untagged EXPUNGE responses).

As a result of the immediate decrement rule, message sequence
numbers that appear in a set of successive EXPUNGE responses
depend upon whether the messages are removed starting from lower

numbers to higher numbers, or from higher numbers to lower
numbers. For example, if the last 5 messages in a 9-message
mailbox are expunged; a "lower to higher" server will send five
untagged EXPUNGE responses for message sequence number 5, whereas
a "higher to lower server" will send successive untagged EXPUNGE
responses for message sequence numbers 9, 8, 7, 6, and 5.

An EXPUNGE response MUST NOT be sent when no command is in
progress; nor while responding to a FETCH, STORE, or SEARCH
command. This rule is necessary to prevent a loss of
synchronization of message sequence numbers between client and
server.

The update from the EXPUNGE response MUST be recorded by the
client.

Example: S: * 44 EXPUNGE

7.4.2. FETCH Response

Contents: message data

The FETCH response returns data about a message to the client.
The data are pairs of data item names and their values in
parentheses. This response occurs as the result of a FETCH or
STORE command, as well as by unilateral server decision (e.g. flag
updates).

The current data items are:

BODY A form of BODYSTRUCTURE without extension data.

BODY[<section>]<<origin_octet>>
A string expressing the body contents of the
specified section. The string SHOULD be
interpreted by the client according to the content
transfer encoding, body type, and subtype.

If the origin octet is specified, this string is a
substring of the entire body contents, starting at
that origin octet. This means that BODY[]<0> MAY
be truncated, but BODY[] is NEVER truncated.

8-bit textual data is permitted if a [CHARSET]
identifier is part of the body parameter
parenthesized list for this section. Note that
headers (part specifiers HEADER or MIME, or the
header portion of a MESSAGE/RFC822 part), MUST be

7-bit; 8-bit characters are not permitted in
headers. Note also that the blank line at the end
of the header is always included in header data.

Non-textual data such as binary data MUST be
transfer encoded into a textual form such as BASE64
prior to being sent to the client. To derive the
original binary data, the client MUST decode the
transfer encoded string.

BODYSTRUCTURE A parenthesized list that describes the [MIME-IMB]
body structure of a message. This is computed by
the server by parsing the [MIME-IMB] header fields,
defaulting various fields as necessary.

For example, a simple text message of 48 lines and
2279 octets can have a body structure of: ("TEXT"
"PLAIN" ("CHARSET" "US-ASCII") NIL NIL "7BIT" 2279
48)

Multiple parts are indicated by parenthesis
nesting. Instead of a body type as the first
element of the parenthesized list there is a nested
body. The second element of the parenthesized list
is the multipart subtype (mixed, digest, parallel,
alternative, etc.).

For example, a two part message consisting of a
text and a BASE645-encoded text attachment can have
a body structure of: (("TEXT" "PLAIN" ("CHARSET"
"US-ASCII") NIL NIL "7BIT" 1152 23)("TEXT" "PLAIN"
("CHARSET" "US-ASCII" "NAME" "cc.diff")
"<960723163407.20117h@cac.washington.edu>"
"Compiler diff" "BASE64" 4554 73) "MIXED"))

Extension data follows the multipart subtype.
Extension data is never returned with the BODY
fetch, but can be returned with a BODYSTRUCTURE
fetch. Extension data, if present, MUST be in the
defined order.

The extension data of a multipart body part are in
the following order:

body parameter parenthesized list
A parenthesized list of attribute/value pairs
[e.g. ("foo" "bar" "baz" "rag") where "bar" is
the value of "foo" and "rag" is the value of


"baz"] as defined in [MIME-IMB].

body disposition
A parenthesized list, consisting of a
disposition type string followed by a
parenthesized list of disposition
attribute/value pairs. The disposition type and
attribute names will be defined in a future
standards-track revision to [DISPOSITION].

body language
A string or parenthesized list giving the body
language value as defined in [LANGUAGE-TAGS].

Any following extension data are not yet defined in
this version of the protocol. Such extension data
can consist of zero or more NILs, strings, numbers,
or potentially nested parenthesized lists of such
data. Client implementations that do a
BODYSTRUCTURE fetch MUST be prepared to accept such
extension data. Server implementations MUST NOT
send such extension data until it has been defined
by a revision of this protocol.

The basic fields of a non-multipart body part are
in the following order:

body type
A string giving the content media type name as
defined in [MIME-IMB].

body subtype
A string giving the content subtype name as
defined in [MIME-IMB].

body parameter parenthesized list
A parenthesized list of attribute/value pairs
[e.g. ("foo" "bar" "baz" "rag") where "bar" is
the value of "foo" and "rag" is the value of
"baz"] as defined in [MIME-IMB].

body id
A string giving the content id as defined in
[MIME-IMB].

body description
A string giving the content description as
defined in [MIME-IMB].


body encoding
A string giving the content transfer encoding as
defined in [MIME-IMB].

body size
A number giving the size of the body in octets.
Note that this size is the size in its transfer
encoding and not the resulting size after any
decoding.

A body type of type MESSAGE and subtype RFC822
contains, immediately after the basic fields, the
envelope structure, body structure, and size in
text lines of the encapsulated message.

A body type of type TEXT contains, immediately
after the basic fields, the size of the body in
text lines. Note that this size is the size in its
content transfer encoding and not the resulting
size after any decoding.

Extension data follows the basic fields and the
type-specific fields listed above. Extension data
is never returned with the BODY fetch, but can be
returned with a BODYSTRUCTURE fetch. Extension
data, if present, MUST be in the defined order.

The extension data of a non-multipart body part are
in the following order:

body MD5
A string giving the body MD5 value as defined in
[MD5].

body disposition
A parenthesized list with the same content and
function as the body disposition for a multipart
body part.

body language
A string or parenthesized list giving the body
language value as defined in [LANGUAGE-TAGS].

Any following extension data are not yet defined in
this version of the protocol, and would be as
described above under multipart extension data.


ENVELOPE A parenthesized list that describes the envelope
structure of a message. This is computed by the
server by parsing the [RFC-822] header into the
component parts, defaulting various fields as
necessary.

The fields of the envelope structure are in the
following order: date, subject, from, sender,
reply-to, to, cc, bcc, in-reply-to, and message-id.
The date, subject, in-reply-to, and message-id
fields are strings. The from, sender, reply-to,
to, cc, and bcc fields are parenthesized lists of
address structures.

An address structure is a parenthesized list that
describes an electronic mail address. The fields
of an address structure are in the following order:
personal name, [SMTP] at-domain-list (source
route), mailbox name, and host name.

[RFC-822] group syntax is indicated by a special
form of address structure in which the host name
field is NIL. If the mailbox name field is also
NIL, this is an end of group marker (semi-colon in
RFC 822 syntax). If the mailbox name field is
non-NIL, this is a start of group marker, and the
mailbox name field holds the group name phrase.

Any field of an envelope or address structure that
is not applicable is presented as NIL. Note that
the server MUST default the reply-to and sender
fields from the from field; a client is not
expected to know to do this.

FLAGS A parenthesized list of flags that are set for this
message.

INTERNALDATE A string representing the internal date of the
message.

RFC822 Equivalent to BODY[].

RFC822.HEADER Equivalent to BODY.PEEK[HEADER].

RFC822.SIZE A number expressing the [RFC-822] size of the
message.

RFC822.TEXT Equivalent to BODY[TEXT].


UID A number expressing the unique identifier of the
message.


Example: S: * 23 FETCH (FLAGS (\Seen) RFC822.SIZE 44827)

7.5. Server Responses - Command Continuation Request

The command continuation request response is indicated by a "+" token
instead of a tag. This form of response indicates that the server is
ready to accept the continuation of a command from the client. The
remainder of this response is a line of text.

This response is used in the AUTHORIZATION command to transmit server
data to the client, and request additional client data. This
response is also used if an argument to any command is a literal.

The client is not permitted to send the octets of the literal unless
the server indicates that it expects it. This permits the server to
process commands and reject errors on a line-by-line basis. The
remainder of the command, including the CRLF that terminates a
command, follows the octets of the literal. If there are any
additional command arguments the literal octets are followed by a
space and those arguments.

Example: C: A001 LOGIN {11}
S: + Ready for additional command text
C: FRED FOOBAR {7}
S: + Ready for additional command text
C: fat man
S: A001 OK LOGIN completed
C: A044 BLURDYBLOOP {102856}
S: A044 BAD No such command as "BLURDYBLOOP"

8. Sample IMAP4rev1 connection

The following is a transcript of an IMAP4rev1 connection. A long
line in this sample is broken for editorial clarity.

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" "INFOODS.MIT.EDU")) NIL NIL
"<B27397-0100000@cac.washington.edu>")
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] {350}
S: Date: Wed, 17 Jul 1996 02:23:25 -0700 (PDT)
S: From: Terry Gray <gray@cac.washington.edu>
S: Subject: IMAP4rev1 WG mtg summary and minutes
S: To: imap@cac.washington.edu
S: cc: minutes@CNRI.Reston.VA.US, John Klensin <KLENSIN@INFOODS.MIT.EDU>
S: Message-Id: <B27397-0100000@cac.washington.edu>
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

9. Formal Syntax

The following syntax specification uses the augmented Backus-Naur
Form (BNF) notation as specified in [RFC-822] with one exception; the
delimiter used with the "#" construct is a single space (SPACE) and
not one or more commas.

In the case of alternative or optional rules in which a later rule
overlaps an earlier rule, the rule which is listed earlier MUST take
priority. For example, "\Seen" when parsed as a flag is the \Seen
flag name and not a flag_extension, even though "\Seen" could be
parsed as a flag_extension. Some, but not all, instances of this
rule are noted below.


Except as noted otherwise, all alphabetic characters are case-
insensitive. The use of upper or lower case characters to define
token strings is for editorial clarity only. Implementations MUST
accept these strings in a case-insensitive fashion.

address ::= "(" addr_name SPACE addr_adl SPACE addr_mailbox
SPACE addr_host ")"

addr_adl ::= nstring
;; Holds route from [RFC-822] route-addr if
;; non-NIL

addr_host ::= nstring
;; NIL indicates [RFC-822] group syntax.
;; Otherwise, holds [RFC-822] domain name

addr_mailbox ::= nstring
;; NIL indicates end of [RFC-822] group; if
;; non-NIL and addr_host is NIL, holds
;; [RFC-822] group name.
;; Otherwise, holds [RFC-822] local-part

addr_name ::= nstring
;; Holds phrase from [RFC-822] mailbox if
;; non-NIL

alpha ::= "A" / "B" / "C" / "D" / "E" / "F" / "G" / "H" /
"I" / "J" / "K" / "L" / "M" / "N" / "O" / "P" /
"Q" / "R" / "S" / "T" / "U" / "V" / "W" / "X" /
"Y" / "Z" /
"a" / "b" / "c" / "d" / "e" / "f" / "g" / "h" /
"i" / "j" / "k" / "l" / "m" / "n" / "o" / "p" /
"q" / "r" / "s" / "t" / "u" / "v" / "w" / "x" /
"y" / "z"
;; Case-sensitive

append ::= "APPEND" SPACE mailbox [SPACE flag_list]
[SPACE date_time] SPACE literal

astring ::= atom / string

atom ::= 1*ATOM_CHAR

ATOM_CHAR ::= <any CHAR except atom_specials>

atom_specials ::= "(" / ")" / "{" / SPACE / CTL / list_wildcards /
quoted_specials


Crispin Standards Track [Page 65]

RFC 2060 IMAP4rev1 December 1996


authenticate ::= "AUTHENTICATE" SPACE auth_type *(CRLF base64)

auth_type ::= atom
;; Defined by [IMAP-AUTH]

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 / "(" 1#body_extension ")"
;; Future expansion. Client implementations
;; MUST accept body_extension fields. Server
;; implementations MUST NOT generate
;; body_extension fields except as defined by
;; future standard or standards-track
;; revisions of this specification.

body_ext_1part ::= body_fld_md5 [SPACE body_fld_dsp
[SPACE body_fld_lang
[SPACE 1#body_extension]]]
;; MUST NOT be returned on non-extensible
;; "BODY" fetch

body_ext_mpart ::= body_fld_param
[SPACE body_fld_dsp SPACE body_fld_lang
[SPACE 1#body_extension]]
;; MUST NOT be returned on non-extensible
;; "BODY" fetch

body_fields ::= body_fld_param SPACE body_fld_id SPACE
body_fld_desc SPACE body_fld_enc SPACE
body_fld_octets

body_fld_desc ::= nstring

body_fld_dsp ::= "(" string SPACE body_fld_param ")" / nil

body_fld_enc ::= (<"> ("7BIT" / "8BIT" / "BINARY" / "BASE64"/
"QUOTED-PRINTABLE") <">) / string

body_fld_id ::= nstring

body_fld_lang ::= nstring / "(" 1#string ")"


Crispin Standards Track [Page 66]

RFC 2060 IMAP4rev1 December 1996


body_fld_lines ::= number

body_fld_md5 ::= nstring

body_fld_octets ::= number

body_fld_param ::= "(" 1#(string SPACE string) ")" / nil

body_type_1part ::= (body_type_basic / body_type_msg / body_type_text)
[SPACE body_ext_1part]

body_type_basic ::= media_basic SPACE body_fields
;; MESSAGE subtype MUST NOT be "RFC822"

body_type_mpart ::= 1*body SPACE media_subtype
[SPACE body_ext_mpart]

body_type_msg ::= media_message SPACE body_fields SPACE envelope
SPACE body SPACE body_fld_lines

body_type_text ::= media_text SPACE body_fields SPACE body_fld_lines

capability ::= "AUTH=" auth_type / atom
;; New capabilities MUST begin with "X" or be
;; registered with IANA as standard or
;; standards-track

capability_data ::= "CAPABILITY" SPACE [1#capability SPACE] "IMAP4rev1"
[SPACE 1#capability]
;; IMAP4rev1 servers which offer RFC 1730
;; compatibility MUST list "IMAP4" as the first
;; capability.

CHAR ::= <any 7-bit US-ASCII character except NUL,
0x01 - 0x7f>

CHAR8 ::= <any 8-bit octet except NUL, 0x01 - 0xff>

command ::= tag SPACE (command_any / command_auth /
command_nonauth / command_select) CRLF
;; Modal based on state

command_any ::= "CAPABILITY" / "LOGOUT" / "NOOP" / x_command
;; Valid in all states

command_auth ::= append / create / delete / examine / list / lsub /
rename / select / status / subscribe / unsubscribe
;; Valid only in Authenticated or Selected state


command_nonauth ::= login / authenticate
;; Valid only when in Non-Authenticated state

command_select ::= "CHECK" / "CLOSE" / "EXPUNGE" /
copy / fetch / store / uid / search
;; Valid only when in Selected state

continue_req ::= "+" SPACE (resp_text / base64)

copy ::= "COPY" SPACE set SPACE mailbox

CR ::= <ASCII CR, carriage return, 0x0D>

create ::= "CREATE" SPACE mailbox
;; Use of INBOX gives a NO error

CRLF ::= CR LF

CTL ::= <any ASCII control character and DEL,
0x00 - 0x1f, 0x7f>

date ::= date_text / <"> date_text <">

date_day ::= 1*2digit
;; Day of month

date_day_fixed ::= (SPACE digit) / 2digit
;; Fixed-format version of date_day

date_month ::= "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" /
"Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec"

date_text ::= date_day "-" date_month "-" date_year

date_year ::= 4digit

date_time ::= <"> date_day_fixed "-" date_month "-" date_year
SPACE time SPACE zone <">

delete ::= "DELETE" SPACE mailbox
;; Use of INBOX gives a NO error

digit ::= "0" / digit_nz

digit_nz ::= "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" /
"9"


envelope ::= "(" env_date SPACE env_subject SPACE env_from
SPACE env_sender SPACE env_reply_to SPACE env_to
SPACE env_cc SPACE env_bcc SPACE env_in_reply_to
SPACE 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" SPACE mailbox

fetch ::= "FETCH" SPACE set SPACE ("ALL" / "FULL" /
"FAST" / fetch_att / "(" 1#fetch_att ")")

fetch_att ::= "ENVELOPE" / "FLAGS" / "INTERNALDATE" /
"RFC822" [".HEADER" / ".SIZE" / ".TEXT"] /
"BODY" ["STRUCTURE"] / "UID" /
"BODY" [".PEEK"] section
["<" number "." nz_number ">"]

flag ::= "\Answered" / "\Flagged" / "\Deleted" /
"\Seen" / "\Draft" / flag_keyword / flag_extension

flag_extension ::= "\" atom
;; Future expansion. Client implementations
;; MUST accept flag_extension flags. Server
;; implementations MUST NOT generate
;; flag_extension flags except as defined by
;; future standard or standards-track
;; revisions of this specification.

flag_keyword ::= atom


flag_list ::= "(" #flag ")"

greeting ::= "*" SPACE (resp_cond_auth / resp_cond_bye) CRLF

header_fld_name ::= astring

header_list ::= "(" 1#header_fld_name ")"

LF ::= <ASCII LF, line feed, 0x0A>

list ::= "LIST" SPACE mailbox SPACE list_mailbox

list_mailbox ::= 1*(ATOM_CHAR / list_wildcards) / string

list_wildcards ::= "%" / "*"

literal ::= "{" number "}" CRLF *CHAR8
;; Number represents the number of CHAR8 octets

login ::= "LOGIN" SPACE userid SPACE password

lsub ::= "LSUB" SPACE mailbox SPACE list_mailbox

mailbox ::= "INBOX" / astring
;; INBOX is case-insensitive. All case variants of
;; INBOX (e.g. "iNbOx") MUST be interpreted as INBOX
;; not as an astring. Refer to section 5.1 for
;; further semantic details of mailbox names.

mailbox_data ::= "FLAGS" SPACE flag_list /
"LIST" SPACE mailbox_list /
"LSUB" SPACE mailbox_list /
"MAILBOX" SPACE text /
"SEARCH" [SPACE 1#nz_number] /
"STATUS" SPACE mailbox SPACE
"(" #<status_att number ")" /
number SPACE "EXISTS" / number SPACE "RECENT"

mailbox_list ::= "(" #("\Marked" / "\Noinferiors" /
"\Noselect" / "\Unmarked" / flag_extension) ")"
SPACE (<"> QUOTED_CHAR <"> / nil) SPACE mailbox

media_basic ::= (<"> ("APPLICATION" / "AUDIO" / "IMAGE" /
"MESSAGE" / "VIDEO") <">) / string)
SPACE media_subtype
;; Defined in [MIME-IMT]

media_message ::= <"> "MESSAGE" <"> SPACE <"> "RFC822" <">


;; Defined in [MIME-IMT]

media_subtype ::= string
;; Defined in [MIME-IMT]

media_text ::= <"> "TEXT" <"> SPACE media_subtype
;; Defined in [MIME-IMT]

message_data ::= nz_number SPACE ("EXPUNGE" /
("FETCH" SPACE msg_att))

msg_att ::= "(" 1#("ENVELOPE" SPACE envelope /
"FLAGS" SPACE "(" #(flag / "\Recent") ")" /
"INTERNALDATE" SPACE date_time /
"RFC822" [".HEADER" / ".TEXT"] SPACE nstring /
"RFC822.SIZE" SPACE number /
"BODY" ["STRUCTURE"] SPACE body /
"BODY" section ["<" number ">"] SPACE nstring /
"UID" SPACE uniqueid) ")"

nil ::= "NIL"

nstring ::= string / nil

number ::= 1*digit
;; Unsigned 32-bit integer
;; (0 <= n < 4,294,967,296)

nz_number ::= digit_nz *digit
;; Non-zero unsigned 32-bit integer
;; (0 < n < 4,294,967,296)

password ::= astring

quoted ::= <"> *QUOTED_CHAR <">

QUOTED_CHAR ::= <any TEXT_CHAR except quoted_specials> /
"\" quoted_specials

quoted_specials ::= <"> / "\"

rename ::= "RENAME" SPACE mailbox SPACE mailbox
;; Use of INBOX as a destination gives a NO error

response ::= *(continue_req / response_data) response_done

response_data ::= "*" SPACE (resp_cond_state / resp_cond_bye /
mailbox_data / message_data / capability_data)


Crispin Standards Track [Page 71]

RFC 2060 IMAP4rev1 December 1996


CRLF

response_done ::= response_tagged / response_fatal

response_fatal ::= "*" SPACE resp_cond_bye CRLF
;; Server closes connection immediately

response_tagged ::= tag SPACE resp_cond_state CRLF

resp_cond_auth ::= ("OK" / "PREAUTH") SPACE resp_text
;; Authentication condition

resp_cond_bye ::= "BYE" SPACE resp_text

resp_cond_state ::= ("OK" / "NO" / "BAD") SPACE resp_text
;; Status condition

resp_text ::= ["[" resp_text_code "]" SPACE] (text_mime2 / text)
;; text SHOULD NOT begin with "[" or "="

resp_text_code ::= "ALERT" / "PARSE" /
"PERMANENTFLAGS" SPACE "(" #(flag / "\*") ")" /
"READ-ONLY" / "READ-WRITE" / "TRYCREATE" /
"UIDVALIDITY" SPACE nz_number /
"UNSEEN" SPACE nz_number /
atom [SPACE 1*<any TEXT_CHAR except "]">]

search ::= "SEARCH" SPACE ["CHARSET" SPACE astring SPACE]
1#search_key
;; [CHARSET] MUST be registered with IANA

search_key ::= "ALL" / "ANSWERED" / "BCC" SPACE astring /
"BEFORE" SPACE date / "BODY" SPACE astring /
"CC" SPACE astring / "DELETED" / "FLAGGED" /
"FROM" SPACE astring /
"KEYWORD" SPACE flag_keyword / "NEW" / "OLD" /
"ON" SPACE date / "RECENT" / "SEEN" /
"SINCE" SPACE date / "SUBJECT" SPACE astring /
"TEXT" SPACE astring / "TO" SPACE astring /
"UNANSWERED" / "UNDELETED" / "UNFLAGGED" /
"UNKEYWORD" SPACE flag_keyword / "UNSEEN" /
;; Above this line were in [IMAP2]
"DRAFT" /
"HEADER" SPACE header_fld_name SPACE astring /
"LARGER" SPACE number / "NOT" SPACE search_key /
"OR" SPACE search_key SPACE search_key /
"SENTBEFORE" SPACE date / "SENTON" SPACE date /
"SENTSINCE" SPACE date / "SMALLER" SPACE number /


"UID" SPACE set / "UNDRAFT" / set /
"(" 1#search_key ")"

section ::= "[" [section_text / (nz_number *["." nz_number]
["." (section_text / "MIME")])] "]"

section_text ::= "HEADER" / "HEADER.FIELDS" [".NOT"]
SPACE header_list / "TEXT"

select ::= "SELECT" SPACE mailbox

sequence_num ::= nz_number / "*"
;; * is the largest number in use. For message
;; sequence numbers, it is the number of messages
;; in the mailbox. For unique identifiers, it is
;; the unique identifier of the last message in
;; the mailbox.

set ::= sequence_num / (sequence_num ":" sequence_num) /
(set "," set)
;; Identifies a set of messages. For message
;; sequence numbers, these are consecutive
;; numbers from 1 to the number of messages in
;; the mailbox
;; Comma delimits individual numbers, colon
;; delimits between two numbers inclusive.
;; Example: 2,4:7,9,12:* is 2,4,5,6,7,9,12,13,
;; 14,15 for a mailbox with 15 messages.

SPACE ::= <ASCII SP, space, 0x20>

status ::= "STATUS" SPACE mailbox SPACE "(" 1#status_att ")"

status_att ::= "MESSAGES" / "RECENT" / "UIDNEXT" / "UIDVALIDITY" /
"UNSEEN"

store ::= "STORE" SPACE set SPACE store_att_flags

store_att_flags ::= (["+" / "-"] "FLAGS" [".SILENT"]) SPACE
(flag_list / #flag)

string ::= quoted / literal

subscribe ::= "SUBSCRIBE" SPACE mailbox

tag ::= 1*<any ATOM_CHAR except "+">

text ::= 1*TEXT_CHAR


text_mime2 ::= "=?" <charset> "?" <encoding> "?"
<encoded-text> "?="
;; Syntax defined in [MIME-HDRS]

TEXT_CHAR ::= <any CHAR except CR and LF>

time ::= 2digit ":" 2digit ":" 2digit
;; Hours minutes seconds

uid ::= "UID" SPACE (copy / fetch / search / store)
;; Unique identifiers used instead of message
;; sequence numbers

uniqueid ::= nz_number
;; Strictly ascending

unsubscribe ::= "UNSUBSCRIBE" SPACE mailbox

userid ::= astring

x_command ::= "X" atom <experimental command arguments>

zone ::= ("+" / "-") 4digit
;; Signed four-digit value of hhmm representing
;; hours and minutes west of Greenwich (that is,
;; (the amount that the given time differs from
;; Universal Time). Subtracting the timezone
;; from the given time will give the UT form.
;; The Universal Time zone is "+0000".

10. Author's Note

This document is a revision or rewrite of earlier documents, and
supercedes the protocol specification in those documents: RFC 1730,
unpublished IMAP2bis.TXT document, RFC 1176, and RFC 1064.

11. Security Considerations

IMAP4rev1 protocol transactions, including electronic mail data, are
sent in the clear over the network unless privacy protection is
negotiated in the AUTHENTICATE command.

A server error message for an AUTHENTICATE command which fails due to
invalid credentials SHOULD NOT detail why the credentials are
invalid.

Use of the LOGIN command sends passwords in the clear. This can be
avoided by using the AUTHENTICATE command instead.


A server error message for a failing LOGIN command SHOULD NOT specify
that the user name, as opposed to the password, is invalid.

Additional security considerations are discussed in the section
discussing the AUTHENTICATE and LOGIN commands.

12. Author's Address

Mark R. Crispin
Networks and Distributed Computing
University of Washington
4545 15th Aveneue NE
Seattle, WA 98105-4527

Phone: (206) 543-5762

EMail: MRC@CAC.Washington.EDU
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值