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]