Crispin Standards Track [Page 55]
RFC 2060 IMAP4rev1 December 1996
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
Crispin Standards Track [Page 56]
RFC 2060 IMAP4rev1 December 1996
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
Crispin Standards Track [Page 57]
RFC 2060 IMAP4rev1 December 1996
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
Crispin Standards Track [Page 58]
RFC 2060 IMAP4rev1 December 1996
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
Crispin Standards Track [Page 59]
RFC 2060 IMAP4rev1 December 1996
"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].
Crispin Standards Track [Page 60]
RFC 2060 IMAP4rev1 December 1996
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.
Crispin Standards Track [Page 61]
RFC 2060 IMAP4rev1 December 1996
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].
Crispin Standards Track [Page 62]
RFC 2060 IMAP4rev1 December 1996
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
Crispin Standards Track [Page 63]
RFC 2060 IMAP4rev1 December 1996
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.
Crispin Standards Track [Page 64]
RFC 2060 IMAP4rev1 December 1996
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
Crispin Standards Track [Page 67]
RFC 2060 IMAP4rev1 December 1996
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"
Crispin Standards Track [Page 68]
RFC 2060 IMAP4rev1 December 1996
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
Crispin Standards Track [Page 69]
RFC 2060 IMAP4rev1 December 1996
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" <">
Crispin Standards Track [Page 70]
RFC 2060 IMAP4rev1 December 1996
;; 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 /
Crispin Standards Track [Page 72]
RFC 2060 IMAP4rev1 December 1996
"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
Crispin Standards Track [Page 73]
RFC 2060 IMAP4rev1 December 1996
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.
Crispin Standards Track [Page 74]
RFC 2060 IMAP4rev1 December 1996
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
Crispin Standards Track [Page 75]
RFC 2060 IMAP4rev1 December 1996
Appendices
A. References
[ACAP] Myers, J. "ACAP -- Application Configuration Access Protocol",
Work in Progress.
[CHARSET] Reynolds, J., and J. Postel, "Assigned Numbers", STD 2,
RFC 1700, USC/Information Sciences Institute, October 1994.
[DISPOSITION] Troost, R., and Dorner, S., "Communicating Presentation
Information in Internet Messages: The Content-Disposition Header",
RFC 1806, June 1995.
[IMAP-AUTH] Myers, J., "IMAP4 Authentication Mechanism", RFC 1731.
Carnegie-Mellon University, December 1994.
[IMAP-COMPAT] Crispin, M., "IMAP4 Compatibility with IMAP2bis", RFC
2061, University of Washington, November 1996.
[IMAP-DISC] Austein, R., "Synchronization Operations for Disconnected
IMAP4 Clients", Work in Progress.
[IMAP-HISTORICAL] Crispin, M. "IMAP4 Compatibility with IMAP2 and
IMAP2bis", RFC 1732, University of Washington, December 1994.
[IMAP-MODEL] Crispin, M., "Distributed Electronic Mail Models in
IMAP4", RFC 1733, University of Washington, December 1994.
[IMAP-OBSOLETE] Crispin, M., "Internet Message Access Protocol -
Obsolete Syntax", RFC 2062, University of Washington, November 1996.
[IMAP2] Crispin, M., "Interactive Mail Access Protocol - Version 2",
RFC 1176, University of Washington, August 1990.
[LANGUAGE-TAGS] Alvestrand, H., "Tags for the Identification of
Languages", RFC 1766, March 1995.
[MD5] Myers, J., and M. Rose, "The Content-MD5 Header Field", RFC
1864, October 1995.
[MIME-IMB] Freed, N., and N. Borenstein, "MIME (Multipurpose Internet
Mail Extensions) Part One: Format of Internet Message Bodies", RFC
2045, November 1996.
[MIME-IMT] Freed, N., and N. Borenstein, "MIME (Multipurpose
Internet Mail Extensions) Part Two: Media Types", RFC 2046,
November 1996.
Crispin Standards Track [Page 76]
RFC 2060 IMAP4rev1 December 1996
[MIME-HDRS] Moore, K., "MIME (Multipurpose Internet Mail Extensions)
Part Three: Message Header Extensions for Non-ASCII Text", RFC
2047, November 1996.
[RFC-822] Crocker, D., "Standard for the Format of ARPA Internet Text
Messages", STD 11, RFC 822, University of Delaware, August 1982.
[SMTP] Postel, J., "Simple Mail Transfer Protocol", STD 10,
RFC 821, USC/Information Sciences Institute, August 1982.
[UTF-7] Goldsmith, D., and Davis, M., "UTF-7: A Mail-Safe
Transformation Format of Unicode", RFC 1642, July 1994.
B. Changes from RFC 1730
1) The STATUS command has been added.
2) Clarify in the formal syntax that the "#" construct can never
refer to multiple spaces.
3) Obsolete syntax has been moved to a separate document.
4) The PARTIAL command has been obsoleted.
5) The RFC822.HEADER.LINES, RFC822.HEADER.LINES.NOT, RFC822.PEEK, and
RFC822.TEXT.PEEK fetch attributes have been obsoleted.
6) The "<" origin "." size ">" suffix for BODY text attributes has
been added.
7) The HEADER, HEADER.FIELDS, HEADER.FIELDS.NOT, MIME, and TEXT part
specifiers have been added.
8) Support for Content-Disposition and Content-Language has been
added.
9) The restriction on fetching nested MULTIPART parts has been
removed.
10) Body part number 0 has been obsoleted.
11) Server-supported authenticators are now identified by
capabilities.
Crispin Standards Track [Page 77]
RFC 2060 IMAP4rev1 December 1996
12) The capability that identifies this protocol is now called
"IMAP4rev1". A server that provides backwards support for RFC 1730
SHOULD emit the "IMAP4" capability in addition to "IMAP4rev1" in its
CAPABILITY response. Because RFC-1730 required "IMAP4" to appear as
the first capability, it MUST listed first in the response.
13) A description of the mailbox name namespace convention has been
added.
14) A description of the international mailbox name convention has
been added.
15) The UID-NEXT and UID-VALIDITY status items are now called UIDNEXT
and UIDVALIDITY. This is a change from the IMAP STATUS
Work in Progress and not from RFC-1730
16) Add a clarification that a null mailbox name argument to the LIST
command returns an untagged LIST response with the hierarchy
delimiter and root of the reference argument.
17) Define terms such as "MUST", "SHOULD", and "MUST NOT".
18) Add a section which defines message attributes and more
thoroughly details the semantics of message sequence numbers, UIDs,
and flags.
19) Add a clarification detailing the circumstances when a client may
send multiple commands without waiting for a response, and the
circumstances in which ambiguities may result.
20) Add a recommendation on server behavior for DELETE and RENAME
when inferior hierarchical names of the given name exist.
21) Add a clarification that a mailbox name may not be unilaterally
unsubscribed by the server, even if that mailbox name no longer
exists.
22) Add a clarification that LIST should return its results quickly
without undue delay.
23) Add a clarification that the date_time argument to APPEND sets
the internal date of the message.
24) Add a clarification on APPEND behavior when the target mailbox is
the currently selected mailbox.
Crispin Standards Track [Page 78]
RFC 2060 IMAP4rev1 December 1996
25) Add a clarification that external changes to flags should be
always announced via an untagged FETCH even if the current command is
a STORE with the ".SILENT" suffix.
26) Add a clarification that COPY appends to the target mailbox.
27) Add the NEWNAME response code.
28) Rewrite the description of the untagged BYE response to clarify
its semantics.
29) Change the reference for the body MD5 to refer to the proper RFC.
30) Clarify that the formal syntax contains rules which may overlap,
and that in the event of such an overlap the rule which occurs first
takes precedence.
31) Correct the definition of body_fld_param.
32) More formal syntax for capability_data.
33) Clarify that any case variant of "INBOX" must be interpreted as
INBOX.
34) Clarify that the human-readable text in resp_text should not
begin with "[" or "=".
35) Change MIME references to Draft Standard documents.
36) Clarify \Recent semantics.
37) Additional examples.
C. Key Word Index
+FLAGS <flag list> (store command data item) ............... 45
+FLAGS.SILENT <flag list> (store command data item) ........ 46
-FLAGS <flag list> (store command data item) ............... 46
-FLAGS.SILENT <flag list> (store command data item) ........ 46
ALERT (response code) ...................................... 50
ALL (fetch item) ........................................... 41
ALL (search key) ........................................... 38
ANSWERED (search key) ...................................... 38
APPEND (command) ........................................... 34
AUTHENTICATE (command) ..................................... 20
BAD (response) ............................................. 52
BCC <string> (search key) .................................. 38
BEFORE <date> (search key) ................................. 39
Crispin Standards Track [Page 79]
RFC 2060 IMAP4rev1 December 1996
BODY (fetch item) .......................................... 41
BODY (fetch result) ........................................ 58
BODY <string> (search key) ................................. 39
BODY.PEEK[<section>]<<partial>> (fetch item) ............... 44
BODYSTRUCTURE (fetch item) ................................. 44
BODYSTRUCTURE (fetch result) ............................... 59
BODY[<section>]<<origin_octet>> (fetch result) ............. 58
BODY[<section>]<<partial>> (fetch item) .................... 41
BYE (response) ............................................. 52
Body Structure (message attribute) ......................... 11
CAPABILITY (command) ....................................... 18
CAPABILITY (response) ...................................... 53
CC <string> (search key) ................................... 39
CHECK (command) ............................................ 36
CLOSE (command) ............................................ 36
COPY (command) ............................................. 46
CREATE (command) ........................................... 25
DELETE (command) ........................................... 26
DELETED (search key) ....................................... 39
DRAFT (search key) ......................................... 39
ENVELOPE (fetch item) ...................................... 44
ENVELOPE (fetch result) .................................... 62
EXAMINE (command) .......................................... 24
EXISTS (response) .......................................... 56
EXPUNGE (command) .......................................... 37
EXPUNGE (response) ......................................... 57
Envelope Structure (message attribute) ..................... 11
FAST (fetch item) .......................................... 44
FETCH (command) ............................................ 41
FETCH (response) ........................................... 58
FLAGGED (search key) ....................................... 39
FLAGS (fetch item) ......................................... 44
FLAGS (fetch result) ....................................... 62
FLAGS (response) ........................................... 56
FLAGS <flag list> (store command data item) ................ 45
FLAGS.SILENT <flag list> (store command data item) ......... 45
FROM <string> (search key) ................................. 39
FULL (fetch item) .......................................... 44
Flags (message attribute) .................................. 9
HEADER (part specifier) .................................... 41
HEADER <field-name> <string> (search key) .................. 39
HEADER.FIELDS <header_list> (part specifier) ............... 41
HEADER.FIELDS.NOT <header_list> (part specifier) ........... 41
INTERNALDATE (fetch item) .................................. 44
INTERNALDATE (fetch result) ................................ 62
Internal Date (message attribute) .......................... 10
KEYWORD <flag> (search key) ................................ 39
Keyword (type of flag) ..................................... 10
Crispin Standards Track [Page 80]
RFC 2060 IMAP4rev1 December 1996
LARGER <n> (search key) .................................... 39
LIST (command) ............................................. 30
LIST (response) ............................................ 54
LOGIN (command) ............................................ 22
LOGOUT (command) ........................................... 20
LSUB (command) ............................................. 32
LSUB (response) ............................................ 55
MAY (specification requirement term) ....................... 5
MESSAGES (status item) ..................................... 33
MIME (part specifier) ...................................... 42
MUST (specification requirement term) ...................... 4
MUST NOT (specification requirement term) .................. 4
Message Sequence Number (message attribute) ................ 9
NEW (search key) ........................................... 39
NEWNAME (response code) .................................... 50
NO (response) .............................................. 51
NOOP (command) ............................................. 19
NOT <search-key> (search key) .............................. 39
OK (response) .............................................. 51
OLD (search key) ........................................... 39
ON <date> (search key) ..................................... 39
OPTIONAL (specification requirement term) .................. 5
OR <search-key1> <search-key2> (search key) ................ 39
PARSE (response code) ...................................... 50
PERMANENTFLAGS (response code) ............................. 50
PREAUTH (response) ......................................... 52
Permanent Flag (class of flag) ............................. 10
READ-ONLY (response code) .................................. 50
READ-WRITE (response code) ................................. 50
RECENT (response) .......................................... 57
RECENT (search key) ........................................ 39
RECENT (status item) ....................................... 33
RENAME (command) ........................................... 27
REQUIRED (specification requirement term) .................. 4
RFC822 (fetch item) ........................................ 44
RFC822 (fetch result) ...................................... 63
RFC822.HEADER (fetch item) ................................. 44
RFC822.HEADER (fetch result) ............................... 62
RFC822.SIZE (fetch item) ................................... 44
RFC822.SIZE (fetch result) ................................. 62
RFC822.TEXT (fetch item) ................................... 44
RFC822.TEXT (fetch result) ................................. 62
SEARCH (command) ........................................... 37
SEARCH (response) .......................................... 55
SEEN (search key) .......................................... 40
SELECT (command) ........................................... 23
SENTBEFORE <date> (search key) ............................. 40
SENTON <date> (search key) ................................. 40
Crispin Standards Track [Page 81]
RFC 2060 IMAP4rev1 December 1996
SENTSINCE <date> (search key) .............................. 40
SHOULD (specification requirement term) .................... 5
SHOULD NOT (specification requirement term) ................ 5
SINCE <date> (search key) .................................. 40
SMALLER <n> (search key) ................................... 40
STATUS (command) ........................................... 33
STATUS (response) .......................................... 55
STORE (command) ............................................ 45
SUBJECT <string> (search key) .............................. 40
SUBSCRIBE (command) ........................................ 29
Session Flag (class of flag) ............................... 10
System Flag (type of flag) ................................. 9
TEXT (part specifier) ...................................... 42
TEXT <string> (search key) ................................. 40
TO <string> (search key) ................................... 40
TRYCREATE (response code) .................................. 51
UID (command) .............................................. 47
UID (fetch item) ........................................... 44
UID (fetch result) ......................................... 63
UID <message set> (search key) ............................. 40
UIDNEXT (status item) ...................................... 33
UIDVALIDITY (response code) ................................ 51
UIDVALIDITY (status item) .................................. 34
UNANSWERED (search key) .................................... 40
UNDELETED (search key) ..................................... 40
UNDRAFT (search key) ....................................... 40
UNFLAGGED (search key) ..................................... 40
UNKEYWORD <flag> (search key) .............................. 40
UNSEEN (response code) ..................................... 51
UNSEEN (search key) ........................................ 40
UNSEEN (status item) ....................................... 34
UNSUBSCRIBE (command) ...................................... 30
Unique Identifier (UID) (message attribute) ................ 7
X<atom> (command) .......................................... 48
[RFC-822] Size (message attribute) ......................... 11
\Answered (system flag) .................................... 9
\Deleted (system flag) ..................................... 9
\Draft (system flag) ....................................... 9
\Flagged (system flag) ..................................... 9
\Marked (mailbox name attribute) ........................... 54
\Noinferiors (mailbox name attribute) ...................... 54
\Noselect (mailbox name attribute) ......................... 54
\Recent (system flag) ...................................... 10
\Seen (system flag) ........................................ 9
\Unmarked (mailbox name attribute) ......................... 54
Crispin Standards Track [Page 82]