| rfc9051xml2.original.xml | rfc9051.xml | |||
|---|---|---|---|---|
| <?xml version='1.0' encoding='utf-8'?> | <?xml version="1.0" encoding="UTF-8"?> | |||
| <!DOCTYPE rfc SYSTEM "rfc2629.dtd"> | <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | |||
| <?rfc toc='yes' ?> | ||||
| <?rfc symrefs='yes' ?> | ||||
| <?rfc sortrefs='no'?> | ||||
| <?rfc linkmailto='no'?> | ||||
| <?rfc compact='yes'?> | ||||
| <?rfc comments='yes'?> | ||||
| <?rfc inline='yes'?> | ||||
| <?rfc-ext parse-xml-in-artwork='yes' ?> | ||||
| <?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?> | ||||
| <rfc ipr='pre5378Trust200902' | ||||
| docName='draft-ietf-extra-imap4rev2-30' | ||||
| obsoletes='3501' category='std'> | ||||
| <front> | ||||
| <title abbrev='IMAP4rev2'>Internet Message Access Protocol (IMAP) - Version | ||||
| 4rev2</title> | ||||
| <rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="pre5378Trust200902" docName | ||||
| ="draft-ietf-extra-imap4rev2-30" number="9051" obsoletes="3501" updates="" submi | ||||
| ssionType="IETF" category="std" consensus="true" xml:lang="en" tocInclude="true" | ||||
| symRefs="true" sortRefs="true" version="3"> | ||||
| <!-- xml2rfc v2v3 conversion 3.5.0 --> | ||||
| <front> | ||||
| <title abbrev="IMAP4rev2">Internet Message Access Protocol (IMAP) - Version | ||||
| 4rev2</title> | ||||
| <seriesInfo name="RFC" value="9051"/> | ||||
| <author initials="A." surname="Melnikov" fullname="Alexey Melnikov" role="ed itor"> | <author initials="A." surname="Melnikov" fullname="Alexey Melnikov" role="ed itor"> | |||
| <organization>Isode Ltd</organization> | <organization>Isode Ltd</organization> | |||
| <address> | <address> | |||
| <postal> | <postal> | |||
| <street>14 Castle Mews</street> | <street>14 Castle Mews</street> | |||
| <city>Hampton</city> | <city>Hampton, Middlesex</city> | |||
| <region>Middlesex</region> | ||||
| <code>TW12 2NP</code> | <code>TW12 2NP</code> | |||
| <country>UK</country> | <country>United Kingdom</country> | |||
| </postal> | </postal> | |||
| <email>Alexey.Melnikov@isode.com</email> | <email>Alexey.Melnikov@isode.com</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <author initials="B." surname="Leiba" fullname="Barry Leiba" role="editor"> | ||||
| <author initials='B.' surname='Leiba' fullname='Barry Leiba' role='editor'> | ||||
| <organization>Futurewei Technologies</organization> | <organization>Futurewei Technologies</organization> | |||
| <address> | <address> | |||
| <phone>+1 646 827 0648</phone> | ||||
| <email>barryleiba@computer.org</email> | <email>barryleiba@computer.org</email> | |||
| <uri>http://internetmessagingtechnology.org/</uri> | <uri>http://internetmessagingtechnology.org/</uri> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <date year="2021" month="August" /> | ||||
| <date /> | ||||
| <area>Applications and RealTime</area> | <area>Applications and RealTime</area> | |||
| <keyword></keyword> | ||||
| <abstract> | <abstract> | |||
| <t> | <t> | |||
| The Internet Message Access Protocol, Version 4rev2 (IMAP4rev2) | The Internet Message Access Protocol Version 4rev2 (IMAP4rev2) | |||
| allows a client to access and manipulate electronic mail messages on | allows a client to access and manipulate electronic mail messages on | |||
| a server. IMAP4rev2 permits manipulation of mailboxes (remote | a server. IMAP4rev2 permits manipulation of mailboxes (remote | |||
| message folders) in a way that is functionally equivalent to local | message folders) in a way that is functionally equivalent to local | |||
| folders. IMAP4rev2 also provides the capability for an offline | folders. IMAP4rev2 also provides the capability for an offline | |||
| client to resynchronize with the server. | client to resynchronize with the server. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| IMAP4rev2 includes operations for creating, deleting, and renaming | IMAP4rev2 includes operations for creating, deleting, and renaming | |||
| mailboxes, checking for new messages, permanently removing messages, | mailboxes; checking for new messages; removing messages permanently; | |||
| setting and clearing flags, RFC 5322, RFC 2045 and RFC 2231 parsing, sea | setting and clearing flags; parsing per RFCs 5322, 2045, and 2231; searc | |||
| rching, | hing; | |||
| and selective fetching of message attributes, texts, and portions | and selective fetching of message attributes, texts, and portions | |||
| thereof. Messages in IMAP4rev2 are accessed by the use of numbers. | thereof. Messages in IMAP4rev2 are accessed by the use of numbers. | |||
| These numbers are either message sequence numbers or unique | These numbers are either message sequence numbers or unique | |||
| identifiers. | identifiers. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| <!--Removed: | ||||
| IMAP4rev2 supports a single server. A mechanism for accessing | ||||
| configuration information to support multiple IMAP4rev2 servers is | ||||
| discussed in RFC 2244. | ||||
| --> | ||||
| </t> | ||||
| <t> | ||||
| IMAP4rev2 does not specify a means of posting mail; this function is | IMAP4rev2 does not specify a means of posting mail; this function is | |||
| handled by a mail submission protocol such as the one specified in RFC 6 409. | handled by a mail submission protocol such as the one specified in RFC 6 409. | |||
| </t> | </t> | |||
| </abstract> | </abstract> | |||
| </front> | </front> | |||
| <middle> | <middle> | |||
| <section numbered="true" toc="default"> | ||||
| <section title='How to Read This Document'> | <name>How to Read This Document</name> | |||
| <section numbered="true" toc="default"> | ||||
| <section title='Organization of This Document'> | <name>Organization of This Document</name> | |||
| <t> | ||||
| <t> | ||||
| This document is written from the point of view of the implementor of | This document is written from the point of view of the implementor of | |||
| an IMAP4rev2 client or server. Beyond the protocol overview in | an IMAP4rev2 client or server. Beyond the protocol overview in | |||
| section 2, it is not optimized for someone trying to understand the | <xref target="protocol_overview"/>, it is not optimized for someone trying to | |||
| operation of the protocol. The material in sections 3 through 5 | understand the | |||
| provides the general context and definitions with which IMAP4rev2 | operation of the protocol. | |||
| operates. | ||||
| </t> | ||||
| <t> | The material in Sections <xref target="state_and_flow" format="counter"/>, <xre | |||
| Sections 6, 7, and 9 describe the IMAP commands, responses, and | f target="data_formats" format="counter"/>, and <xref target="operational_consid | |||
| erations" format="counter"/> | ||||
| provides the general context and definitions with which IMAP4rev2 | ||||
| operates. | ||||
| </t> | ||||
| <t> | ||||
| Sections <xref target="client_commands" format="counter"/>, <xref target="ser | ||||
| ver-responses" format="counter"/>, and <xref target="IMAP-ABNF" format="counter" | ||||
| /> describe the IMAP commands, responses, and | ||||
| syntax, respectively. The relationships among these are such that it | syntax, respectively. The relationships among these are such that it | |||
| is almost impossible to understand any of them separately. In | is almost impossible to understand any of them separately. In | |||
| particular, do not attempt to deduce command syntax from the command | particular, do not attempt to deduce command syntax from the command | |||
| section alone; instead refer to the Formal Syntax (<xref target='IMAP-ABNF'/> | section alone; instead, refer to "Formal Syntax" (<xref target="IMAP-ABNF" fo | |||
| ). | rmat="default"/>). | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section numbered="true" toc="default"> | |||
| <name>Conventions Used in This Document</name> | ||||
| <section title='Conventions Used in This Document'> | <t> | |||
| <t> | ||||
| "Conventions" are basic principles or procedures. Document | "Conventions" are basic principles or procedures. Document | |||
| conventions are noted in this section. | conventions are noted in this section. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| In examples, "C:" and "S:" indicate lines sent by the client and | In examples, "C:" and "S:" indicate lines sent by the client and | |||
| server respectively. Note that each line includes the terminating CRLF. | server, respectively. Note that each line includes the terminating CRLF. | |||
| </t> | </t> | |||
| <iref item="MUST (specification requirement term)" subitem="" primary= | ||||
| <t> | "false"/> | |||
| <iref item='MUST (specification requirement term)'/> | <iref item="MUST NOT (specification requirement term)" subitem="" prim | |||
| <iref item='MUST NOT (specification requirement term)'/> | ary="false"/> | |||
| <iref item='OPTIONAL (specification requirement term)'/> | <iref item="OPTIONAL (specification requirement term)" subitem="" prim | |||
| <iref item='REQUIRED (specification requirement term)'/> | ary="false"/> | |||
| <iref item='SHOULD (specification requirement term)'/> | <iref item="REQUIRED (specification requirement term)" subitem="" prim | |||
| <iref item='SHOULD NOT (specification requirement term)'/> | ary="false"/> | |||
| <iref item='RECOMMENDED (specification requirement term)'/> | <iref item="SHOULD (specification requirement term)" subitem="" primar | |||
| <iref item='NOT RECOMMENDED (specification requirement term)'/> | y="false"/> | |||
| <iref item='MAY (specification requirement term)'/> | <iref item="SHOULD NOT (specification requirement term)" subitem="" pr | |||
| <iref item='OPTIONAL (specification requirement term)'/> | imary="false"/> | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL | <iref item="RECOMMENDED (specification requirement term)" subitem="" p | |||
| NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", | rimary="false"/> | |||
| "MAY", and "OPTIONAL" in this document are to be interpreted as | <iref item="NOT RECOMMENDED (specification requirement term)" subitem= | |||
| described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> | "" primary="false"/> | |||
| when, and only when, they appear in all capitals, as shown here. | <iref item="MAY (specification requirement term)" subitem="" primary=" | |||
| </t> | false"/> | |||
| <iref item="OPTIONAL (specification requirement term)" subitem="" prim | ||||
| <t> | ary="false"/> | |||
| <t> | ||||
| The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQU | ||||
| IRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | ||||
| NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14> | ||||
| RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | ||||
| "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to | ||||
| be interpreted as | ||||
| described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> | ||||
| when, and only when, they appear in all capitals, as shown here. | ||||
| </t> | ||||
| <t> | ||||
| The word "can" (not "may") is used to refer to a possible | The word "can" (not "may") is used to refer to a possible | |||
| circumstance or situation, as opposed to an optional facility of the | circumstance or situation, as opposed to an optional facility of the | |||
| protocol. | protocol. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| "User" is used to refer to a human user, whereas "client" refers to | "User" is used to refer to a human user, whereas "client" refers to | |||
| the software being run by the user. | the software being run by the user. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| "Connection" refers to the entire sequence of client/server | "Connection" refers to the entire sequence of client/server | |||
| <!--"Internet connection"?--> | ||||
| interaction from the initial establishment of the network connection | interaction from the initial establishment of the network connection | |||
| until its termination. | until its termination. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| "Session" refers to the sequence of client/server interaction from | "Session" refers to the sequence of client/server interaction from | |||
| the time that a mailbox is selected (SELECT or EXAMINE command) until | the time that a mailbox is selected (SELECT or EXAMINE command) until | |||
| the time that selection ends (SELECT or EXAMINE of another mailbox, | the time that selection ends (SELECT or EXAMINE of another mailbox, | |||
| CLOSE command, UNSELECT command, or connection termination). | CLOSE command, UNSELECT command, or connection termination). | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The term "Implicit TLS" refers to the automatic negotiation of TLS | The term "Implicit TLS" refers to the automatic negotiation of TLS | |||
| whenever a TCP connection is made on a particular TCP port that is | whenever a TCP connection is made on a particular TCP port that is | |||
| used exclusively by that server for TLS connections. The term | used exclusively by that server for TLS connections. The term | |||
| "Implicit TLS" is intended to contrast with the use of STARTTLS command | "Implicit TLS" is intended to contrast with the use of the STARTTLS command | |||
| in IMAP that is used by the client and the server to explicitly | in IMAP that is used by the client and the server to explicitly | |||
| negotiate TLS on an established cleartext TCP connection. | negotiate TLS on an established cleartext TCP connection. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Characters are 8-bit UTF-8 (of which 7-bit US-ASCII is a subset), unless othe | |||
| Characters are 8-bit UTF-8 (of which 7-bit US-ASCII is a subset) unless other | rwise specified. Other | |||
| wise specified. Other | ||||
| character sets are indicated using a "CHARSET", as described in | character sets are indicated using a "CHARSET", as described in | |||
| <xref target='MIME-IMT'/> and defined in <xref target='CHARSET'/>. CHARSETs | <xref target="RFC2046" format="default"/> and defined in <xref target="RFC297 | |||
| have important | 8" format="default"/>. CHARSETs have important | |||
| additional semantics in addition to defining character set; refer to | additional semantics in addition to defining a character set; refer to | |||
| these documents for more detail. | these documents for more detail. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| There are several protocol conventions in IMAP. These refer to | There are several protocol conventions in IMAP. These refer to | |||
| aspects of the specification which are not strictly part of the IMAP | aspects of the specification that are not strictly part of the IMAP | |||
| protocol, but reflect generally-accepted practice. Implementations | protocol but reflect generally accepted practice. Implementations | |||
| need to be aware of these conventions, and avoid conflicts whether or | need to be aware of these conventions, and avoid conflicts whether or | |||
| not they implement the convention. For example, "&" may not be used | not they implement the convention. For example, "&" may not be used | |||
| as a hierarchy delimiter since it conflicts with the Mailbox | as a hierarchy delimiter since it conflicts with the Mailbox | |||
| International Naming Convention, and other uses of "&" in mailbox | International Naming Convention, and other uses of "&" in mailbox | |||
| names are impacted as well. | names are impacted as well. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section numbered="true" toc="default"> | |||
| <name>Special Notes to Implementors</name> | ||||
| <section title='Special Notes to Implementors'> | <t> | |||
| <t> | ||||
| Implementors of the IMAP protocol are strongly encouraged to read the | Implementors of the IMAP protocol are strongly encouraged to read the | |||
| IMAP implementation recommendations document <xref target='IMAP-IMPLEMENTATIO N'/> in | IMAP implementation recommendations document <xref target="RFC2683" format="d efault"/> in | |||
| conjunction with this document, to help understand the intricacies of | conjunction with this document, to help understand the intricacies of | |||
| this protocol and how best to build an interoperable product. | this protocol and how best to build an interoperable product. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | IMAP4rev2 is designed to be upwards compatible from the IMAP4rev1 <xref targe | |||
| IMAP4rev2 is designed to be upwards compatible from the IMAP4rev1 <xref targe | t="RFC3501" format="default"/>, IMAP2 <xref target="RFC1176" format="default"/>, | |||
| t='RFC3501'/>, the <xref target='IMAP2'/> and | and | |||
| unpublished IMAP2bis <xref target="IMAP2BIS"/> protocols. IMAP4rev2 is large | unpublished IMAP2bis <xref target="I-D.ietf-imap-imap2bis" format="default"/> | |||
| ly compatible with | protocols. IMAP4rev2 is largely compatible with | |||
| the IMAP4rev1 protocol described in RFC 3501 and | the IMAP4rev1 protocol described in RFC 3501 and | |||
| the IMAP4 protocol described in RFC 1730; the exception being in | the IMAP4 protocol described in <xref target="RFC1730" format="default"/>; th | |||
| certain facilities added in RFC 1730 and RFC 3501 that proved problematic and | e exception being in | |||
| were | certain facilities added in <xref target="RFC1730" format="default"/> and <xr | |||
| ef target="RFC3501" format="default"/> that proved problematic and were | ||||
| subsequently removed or replaced by better alternatives. | subsequently removed or replaced by better alternatives. | |||
| In the course of the evolution of IMAP4rev2, | In the course of the evolution of IMAP4rev2, | |||
| some aspects in the earlier protocols have become obsolete. | some aspects in the earlier protocols have become obsolete. | |||
| Obsolete commands, responses, and data formats which an IMAP4rev2 | ||||
| Obsolete commands, responses, and data formats that an IMAP4rev2 | ||||
| implementation can encounter when used with an earlier implementation | implementation can encounter when used with an earlier implementation | |||
| are described in <xref target='changesFromIMAP4rev1'/>, <xref target="IMAP4re | are described in Appendices <xref target="IMAP4rev1-compat" format="counter" | |||
| v1-compat"/> and | derivedContent="A" /> and | |||
| <xref target='IMAP-OBSOLETE'/>. IMAP4rev2 supports 63bit body part and messag | <xref target="changesFromIMAP4rev1" format="counter" derivedContent="E"/> and | |||
| e sizes. | <xref target="RFC2062" format="default"/>. IMAP4rev2 supports 63-bit body parts | |||
| and message sizes. | ||||
| IMAP4rev2 compatibility with BINARY and LIST-EXTENDED IMAP extensions are des cribed in | IMAP4rev2 compatibility with BINARY and LIST-EXTENDED IMAP extensions are des cribed in | |||
| <xref target="BINARY-compat"/> and <xref target="LIST-EXTENDED-compat"/> resp | Appendices <xref target="BINARY-compat" format="counter" sectionFormat="of" d | |||
| ectively. | erivedContent="B"/> and <xref target="LIST-EXTENDED-compat" format="counter" sec | |||
| </t> | tionFormat="of" derivedContent="C"/>, respectively. | |||
| <t> | </t> | |||
| <t> | ||||
| Other compatibility issues with IMAP2bis, the most common variant of | Other compatibility issues with IMAP2bis, the most common variant of | |||
| the earlier protocol, are discussed in <xref target='IMAP-COMPAT'/>. A full | the earlier protocol, are discussed in <xref target="RFC2061" format="default "/>. A full | |||
| discussion of compatibility issues with rare (and presumed extinct) | discussion of compatibility issues with rare (and presumed extinct) | |||
| variants of <xref target='IMAP2'/> is in <xref target='IMAP-HISTORICAL'/>; th is document is | variants of <xref target="RFC1176" format="default"/> is in <xref target="RFC 1732" format="default"/>; this document is | |||
| primarily of historical interest. | primarily of historical interest. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | IMAP was originally developed for the older <xref target="RFC0822" format="def | |||
| IMAP was originally developed for the older <xref target='RFC-822'/> standard | ault"/> standard, and | |||
| , and | as a consequence, the "RFC822.SIZE" fetch item in IMAP incorporates "RFC822" | |||
| as a consequence, "RFC822.SIZE" fetch item in IMAP incorporates "RFC822" in | in | |||
| its name. "RFC822" should be interpreted as a reference to | its name. "RFC822" should be interpreted as a reference to | |||
| the updated <xref target='RFC-5322'/> standard. | the updated <xref target="RFC5322" format="default"/> standard. | |||
| </t> | </t> | |||
| <t> | ||||
| </section> | IMAP4rev2 does not specify a means of posting mail; this function is | |||
| handled by a mail submission protocol such as the one specified in <xref | ||||
| </section> | target="RFC6409"/>. | |||
| </t> | ||||
| <section title='Protocol Overview'> | </section> | |||
| </section> | ||||
| <section title='Link Level'> | <section numbered="true" toc="default" anchor="protocol_overview"> | |||
| <name>Protocol Overview</name> | ||||
| <t> | <section numbered="true" toc="default"> | |||
| <name>Link Level</name> | ||||
| <t> | ||||
| The IMAP4rev2 protocol assumes a reliable data stream such as that | The IMAP4rev2 protocol assumes a reliable data stream such as that | |||
| provided by TCP. When TCP is used, an IMAP4rev2 server listens on | provided by TCP. When TCP is used, an IMAP4rev2 server listens on | |||
| port 143 (cleartext port) or port 993 (Implicit TLS port). | port 143 (cleartext port) or port 993 (Implicit TLS port). | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section numbered="true" toc="default"> | |||
| <name>Commands and Responses</name> | ||||
| <section title='Commands and Responses'> | <t> | |||
| <t> | ||||
| An IMAP4rev2 connection consists of the establishment of a | An IMAP4rev2 connection consists of the establishment of a | |||
| client/server network connection, an initial greeting from the | client/server network connection, an initial greeting from the | |||
| server, and client/server interactions. These client/server | server, and client/server interactions. These client/server | |||
| interactions consist of a client command, server data, and a server | interactions consist of a client command, server data, and a server | |||
| completion result response. | completion result response. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| All interactions transmitted by client and server are in the form of | All interactions transmitted by client and server are in the form of | |||
| lines, that is, strings that end with a CRLF. The protocol receiver | lines, that is, strings that end with a CRLF. The protocol receiver | |||
| of an IMAP4rev2 client or server is either reading a line, or is | of an IMAP4rev2 client or server is reading either a line or | |||
| reading a sequence of octets with a known count followed by a line. | a sequence of octets with a known count followed by a line. | |||
| </t> | </t> | |||
| <section numbered="true" toc="default"> | ||||
| <section title='Client Protocol Sender and Server Protocol Receiver'> | <name>Client Protocol Sender and Server Protocol Receiver</name> | |||
| <t> | ||||
| <t> | ||||
| The client command begins an operation. Each client command is | The client command begins an operation. Each client command is | |||
| prefixed with an identifier (typically a short alphanumeric string, | prefixed with an identifier (typically a short alphanumeric string, | |||
| e.g., A0001, A0002, etc.) called a "tag". A different tag is | e.g., A0001, A0002, etc.) called a "tag". A different tag is | |||
| generated by the client for each command. | generated by the client for each command. | |||
| More formally: the client SHOULD generate a unique tag for every command, | More formally: the client <bcp14>SHOULD</bcp14> generate a unique tag for eve | |||
| but a server MUST accept tag reuse. | ry command, | |||
| </t> | but a server <bcp14>MUST</bcp14> accept tag reuse. | |||
| </t> | ||||
| <t> | <t> | |||
| Clients MUST follow the syntax outlined in this specification | Clients <bcp14>MUST</bcp14> follow the syntax outlined in this specification | |||
| strictly. It is a syntax error to send a command with missing or | strictly. It is a syntax error to send a command with missing or | |||
| extraneous spaces or arguments. | extraneous spaces or arguments. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| There are two cases in which a line from the client does not | There are two cases in which a line from the client does not | |||
| represent a complete command. In one case, a command argument is | represent a complete command. In one case, a command argument is | |||
| quoted with an octet count (see the description of literal in <xref target='d ata-string'/>); | quoted with an octet count (see the description of literal in <xref target="d ata-string" format="default"/>); | |||
| in the other case, the command arguments require | in the other case, the command arguments require | |||
| server feedback (see the AUTHENTICATE command in <xref target='authenticate'/ >). | server feedback (see the AUTHENTICATE command in <xref target="authenticate" format="default"/>). | |||
| In either case, the server sends a command continuation request response if i t is ready | In either case, the server sends a command continuation request response if i t is ready | |||
| for the octets (if appropriate) and the remainder of the command. | for the octets (if appropriate) and the remainder of the command. | |||
| This response is prefixed with the token "+". | This response is prefixed with the token "+". | |||
| </t> | ||||
| <list> | <t indent="3"> | |||
| <t> | ||||
| Note: If, instead, the server detected an error in the | Note: If, instead, the server detected an error in the | |||
| command, it sends a BAD completion response with a tag | command, it sends a BAD completion response with a tag | |||
| matching the command (as described below) to reject the | matching the command (as described below) to reject the | |||
| command and prevent the client from sending any more of the | command and prevent the client from sending any more of the | |||
| command. | command. | |||
| </t> | </t> | |||
| <t indent="3"> | ||||
| <t> | ||||
| It is also possible for the server to send a completion | It is also possible for the server to send a completion | |||
| response for some other command (if multiple commands are | response for some other command (if multiple commands are | |||
| in progress), or untagged data. In either case, the | in progress) or untagged data. In either case, the | |||
| command continuation request is still pending; the client | command continuation request is still pending; the client | |||
| takes the appropriate action for the response, and reads | takes the appropriate action for the response and reads | |||
| another response from the server. In all cases, the client | another response from the server. In all cases, the client | |||
| MUST send a complete command (including receiving all | <bcp14>MUST</bcp14> send a complete command (including receiving all | |||
| command continuation request responses and sending command | command continuation request responses and sending command | |||
| continuations for the command) before initiating a new | continuations for the command) before initiating a new | |||
| command. | command. | |||
| </t> | </t> | |||
| </list> | <t> | |||
| </t> | ||||
| <t> | ||||
| The protocol receiver of an IMAP4rev2 server reads a command line | The protocol receiver of an IMAP4rev2 server reads a command line | |||
| from the client, parses the command and its arguments, and transmits | from the client, parses the command and its arguments, and transmits | |||
| server data and a server command completion result response. | server data and a server command completion result response. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section numbered="true" toc="default"> | |||
| <name>Server Protocol Sender and Client Protocol Receiver</name> | ||||
| <section title='Server Protocol Sender and Client Protocol Receiver'> | <t> | |||
| <t> | ||||
| Data transmitted by the server to the client and status responses | Data transmitted by the server to the client and status responses | |||
| that do not indicate command completion are prefixed with the token | that do not indicate command completion are prefixed with the token | |||
| "*", and are called untagged responses. | "*" and are called untagged responses. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Server data <bcp14>MAY</bcp14> be sent as a result of a client command or <bc | |||
| Server data MAY be sent as a result of a client command, or MAY be | p14>MAY</bcp14> be | |||
| sent unilaterally by the server. There is no syntactic difference | sent unilaterally by the server. There is no syntactic difference | |||
| between server data that resulted from a specific command and server | between server data that resulted from a specific command and server | |||
| data that were sent unilaterally. | data that were sent unilaterally. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The server completion result response indicates the success or | The server completion result response indicates the success or | |||
| failure of the operation. It is tagged with the same tag as the | failure of the operation. It is tagged with the same tag as the | |||
| client command which began the operation. Thus, if more than one | client command that began the operation. Thus, if more than one | |||
| command is in progress, the tag in a server completion response | command is in progress, the tag in a server completion response | |||
| identifies the command to which the response applies. There are | identifies the command to which the response applies. There are | |||
| three possible server completion responses: OK (indicating success), | three possible server completion responses: OK (indicating success), | |||
| NO (indicating failure), or BAD (indicating a protocol error such as | NO (indicating failure), or BAD (indicating a protocol error such as | |||
| unrecognized command or command syntax error). | unrecognized command or command syntax error). | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Servers <bcp14>SHOULD</bcp14> strictly enforce the syntax outlined in this sp | |||
| Servers SHOULD enforce the syntax outlined in this specification | ecification. | |||
| strictly. Any client command with a protocol syntax error, including | Any client command with a protocol syntax error, including | |||
| (but not limited to) missing or extraneous spaces or arguments, | (but not limited to) missing or extraneous spaces or arguments, | |||
| SHOULD be rejected, and the client given a BAD server completion | <bcp14>SHOULD</bcp14> be rejected and the client given a BAD server completio n | |||
| response. | response. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The protocol receiver of an IMAP4rev2 client reads a response line | The protocol receiver of an IMAP4rev2 client reads a response line | |||
| from the server. It then takes action on the response based upon the | from the server. It then takes action on the response based upon the | |||
| first token of the response, which can be a tag, a "*", or a "+". | first token of the response, which can be a tag, a "*", or a "+". | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | A client <bcp14>MUST</bcp14> be prepared to accept any server response at all | |||
| A client MUST be prepared to accept any server response at all times. | times. | |||
| This includes server data that was not requested. Server data SHOULD | This includes server data that was not requested. Server data <bcp14>SHOULD< | |||
| /bcp14> | ||||
| be remembered (cached), so that the client can reference its remembered copy | be remembered (cached), so that the client can reference its remembered copy | |||
| rather than sending a command to the server to request the data. In | rather than sending a command to the server to request the data. In | |||
| the case of certain server data, the data MUST be remembered, | the case of certain server data, the data <bcp14>MUST</bcp14> be remembered, | |||
| as specified elsewhere in this document. | as specified elsewhere in this document. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | This topic is discussed in greater detail in "Server Responses" (see <xref ta | |||
| This topic is discussed in greater detail in the Server Responses | rget="server-responses"/>). | |||
| section. | </t> | |||
| </t> | </section> | |||
| </section> | ||||
| </section> | <section numbered="true" toc="default"> | |||
| <name>Message Attributes</name> | ||||
| </section> | <t> | |||
| <section title='Message Attributes'> | ||||
| <t> | ||||
| In addition to message text, each message has several attributes | In addition to message text, each message has several attributes | |||
| associated with it. These attributes can be retrieved individually | associated with it. These attributes can be retrieved individually | |||
| or in conjunction with other attributes or message texts. | or in conjunction with other attributes or message texts. | |||
| </t> | </t> | |||
| <section numbered="true" toc="default"> | ||||
| <section title='Message Numbers'> | <name>Message Numbers</name> | |||
| <t> | ||||
| <t> | Messages in IMAP4rev2 are accessed by one of two numbers: the Unique | |||
| Messages in IMAP4rev2 are accessed by one of two numbers; the unique | Identifier (UID) or the message sequence number. | |||
| identifier (UID) or the message sequence number. | </t> | |||
| </t> | <section anchor="uid-def" numbered="true" toc="default"> | |||
| <name>Unique Identifier (UID) Message Attribute</name> | ||||
| <section title='Unique Identifier (UID) Message Attribute' anchor='uid-d | <iref item="Unique Identifier (UID) (message attribute)" subitem="" | |||
| ef'> | primary="false"/> | |||
| <iref item='Unique Identifier (UID) (message attribute)'/> | <t> | |||
| <t> | ||||
| A UID is an unsigned non-zero 32-bit value assigned to each message, which wh en used with the | A UID is an unsigned non-zero 32-bit value assigned to each message, which wh en used with the | |||
| unique identifier validity value (see below) forms a 64-bit value | unique identifier validity value (see below) forms a 64-bit value | |||
| that MUST NOT refer to any other message in the mailbox or any | that <bcp14>MUST NOT</bcp14> refer to any other message in the mailbox or any | |||
| subsequent mailbox with the same name forever. Unique identifiers | subsequent mailbox with the same name forever. Unique identifiers | |||
| are assigned in a strictly ascending fashion in the mailbox; as each | are assigned in a strictly ascending fashion in the mailbox; as each | |||
| message is added to the mailbox it is assigned a higher UID than the | message is added to the mailbox, it is assigned a higher UID than those of al | |||
| message(s) which were added previously. Unlike message sequence | l | |||
| message(s) that are already in the mailbox. Unlike message sequence | ||||
| numbers, unique identifiers are not necessarily contiguous. | numbers, unique identifiers are not necessarily contiguous. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | The unique identifier of a message <bcp14>MUST NOT</bcp14> change during the | |||
| The unique identifier of a message MUST NOT change during the | session and <bcp14>SHOULD NOT</bcp14> change between sessions. Any change of | |||
| session, and SHOULD NOT change between sessions. Any change of | unique identifiers between sessions <bcp14>MUST</bcp14> be detectable using t | |||
| unique identifiers between sessions MUST be detectable using the | he | |||
| UIDVALIDITY mechanism discussed below. Persistent unique identifiers | UIDVALIDITY mechanism discussed below. Persistent unique identifiers | |||
| are required for a client to resynchronize its state from a previous | are required for a client to resynchronize its state from a previous | |||
| session with the server (e.g., disconnected or offline access | session with the server (e.g., disconnected or offline access | |||
| clients <xref target="IMAP-MODEL"/>); this is discussed further in <xref targ | clients <xref target="RFC1733" format="default"/>); this is discussed further | |||
| et='IMAP-DISC'/>. | in <xref target="RFC4549" format="default"/>. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Associated with every mailbox are two 32-bit unsigned non-zero values that ai | |||
| Associated with every mailbox are two 32-bit unsigned non-zero values which a | d in unique | |||
| id in unique | ||||
| identifier handling: the next unique identifier value (UIDNEXT) and the uniqu e | identifier handling: the next unique identifier value (UIDNEXT) and the uniqu e | |||
| identifier validity value (UIDVALIDITY). | identifier validity value (UIDVALIDITY). | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The next unique identifier value is the predicted value that will be | The next unique identifier value is the predicted value that will be | |||
| assigned to a new message in the mailbox. Unless the unique | assigned to a new message in the mailbox. Unless the unique | |||
| identifier validity also changes (see below), the next unique | identifier validity also changes (see below), the next unique | |||
| identifier value MUST have the following two characteristics. First, | identifier value <bcp14>MUST</bcp14> have the following two characteristics. | |||
| the next unique identifier value MUST NOT change unless new messages | First, | |||
| the next unique identifier value <bcp14>MUST NOT</bcp14> change unless new me | ||||
| ssages | ||||
| are added to the mailbox; and second, the next unique identifier | are added to the mailbox; and second, the next unique identifier | |||
| value MUST change whenever new messages are added to the mailbox, | value <bcp14>MUST</bcp14> change whenever new messages are added to the mailb ox, | |||
| even if those new messages are subsequently expunged. | even if those new messages are subsequently expunged. | |||
| <list><t> | </t> | |||
| <aside><t> | ||||
| Note: The next unique identifier value is intended to | Note: The next unique identifier value is intended to | |||
| provide a means for a client to determine whether any | provide a means for a client to determine whether any | |||
| messages have been delivered to the mailbox since the | messages have been delivered to the mailbox since the | |||
| previous time it checked this value. It is not intended to | previous time it checked this value. It is not intended to | |||
| provide any guarantee that any message will have this | provide any guarantee that any message will have this | |||
| unique identifier. A client can only assume, at the time | unique identifier. A client can only assume, at the time | |||
| that it obtains the next unique identifier value, that | that it obtains the next unique identifier value, that | |||
| messages arriving after that time will have a UID greater | messages arriving after that time will have a UID greater | |||
| than or equal to that value. | than or equal to that value.</t> | |||
| </t></list> | </aside> | |||
| </t> | <t> | |||
| <t> | ||||
| The unique identifier validity value is sent in a UIDVALIDITY | The unique identifier validity value is sent in a UIDVALIDITY | |||
| response code in an OK untagged response at mailbox selection time. | response code in an OK untagged response at mailbox selection time. | |||
| If unique identifiers from an earlier session fail to persist in this | If unique identifiers from an earlier session fail to persist in this | |||
| session, the unique identifier validity value MUST be greater than | session, the unique identifier validity value <bcp14>MUST</bcp14> be greater than | |||
| the one used in the earlier session. | the one used in the earlier session. | |||
| A good UIDVALIDITY value to use | A good UIDVALIDITY value to use | |||
| is a 32-bit representation of the current date/time when the value | is a 32-bit representation of the current date/time when the value | |||
| is assigned: this ensures that the value is unique and always | is assigned: this ensures that the value is unique and always | |||
| increases. Another possible alternative is a global counter | increases. Another possible alternative is a global counter | |||
| that gets incremented every time a mailbox is created. | that gets incremented every time a mailbox is created. | |||
| <list> | </t> | |||
| <t> | ||||
| Note: Ideally, unique identifiers SHOULD persist at all | <t indent="3"> | |||
| Note: Ideally, unique identifiers <bcp14>SHOULD</bcp14> persist at all | ||||
| times. Although this specification recognizes that failure | times. Although this specification recognizes that failure | |||
| to persist can be unavoidable in certain server | to persist can be unavoidable in certain server | |||
| environments, it strongly encourages message store | environments, it strongly encourages message store | |||
| implementation techniques that avoid this problem. For | implementation techniques that avoid this problem. For | |||
| example: | example: | |||
| </t> | ||||
| <list style='numbers'> | <ol spacing="normal" type="1"><li> | |||
| <t> | Unique identifiers <bcp14>MUST</bcp14> be strictly ascending in the | |||
| Unique identifiers MUST be strictly ascending in the | ||||
| mailbox at all times. If the physical message store is | mailbox at all times. If the physical message store is | |||
| re-ordered by a non-IMAP agent, this requires that the | reordered by a non-IMAP agent, the | |||
| unique identifiers in the mailbox be regenerated, since | unique identifiers in the mailbox <bcp14>MUST</bcp14> be regenerated | |||
| , since | ||||
| the former unique identifiers are no longer strictly | the former unique identifiers are no longer strictly | |||
| ascending as a result of the re-ordering. | ascending as a result of the reordering. | |||
| </t> | </li> | |||
| <li> | ||||
| <t> | ||||
| If the message store has no mechanism to store unique | If the message store has no mechanism to store unique | |||
| identifiers, it must regenerate unique identifiers at | identifiers, it must regenerate unique identifiers at | |||
| each session, and each session must have a unique | each session, and each session must have a unique | |||
| UIDVALIDITY value. | UIDVALIDITY value. Note that this situation can be very disruptive t | |||
| </t> | o client message caching. | |||
| </li> | ||||
| <t> | <li> | |||
| If the mailbox is deleted/renamed and a new mailbox with the | If the mailbox is deleted/renamed and a new mailbox with the | |||
| same name is created at a later date, the server must | same name is created at a later date, the server must | |||
| either keep track of unique identifiers from the | either keep track of unique identifiers from the | |||
| previous instance of the mailbox, or it must assign a | previous instance of the mailbox or assign a | |||
| new UIDVALIDITY value to the new instance of the | new UIDVALIDITY value to the new instance of the | |||
| mailbox. | mailbox. | |||
| </t> | </li> | |||
| <li> | ||||
| <t> | ||||
| The combination of mailbox name, UIDVALIDITY, and UID | The combination of mailbox name, UIDVALIDITY, and UID | |||
| must refer to a single immutable (or expunged) message on that serve | must refer to a single, immutable (or expunged) message on that serv | |||
| r | er | |||
| forever. In particular, the internal date, <xref target='RFC-5322'/ | forever. In particular, the internal date, RFC822.SIZE, envelope, b | |||
| > | ody structure, and message texts | |||
| size, envelope, body structure, and message texts | (all BODY[...] fetch data items) <bcp14>MUST</bcp14> never change. | |||
| (all BODY[...] fetch data items) MUST never change. This does not | This does not | |||
| include message numbers, nor does it include attributes | include message numbers, nor does it include attributes | |||
| that can be set by a STORE command (e.g., FLAGS). When a message | that can be set by a STORE command (such as FLAGS). When a message | |||
| is expunged, its UID MUST NOT be reused under the same | is expunged, its UID <bcp14>MUST NOT</bcp14> be reused under the sam | |||
| e | ||||
| UIDVALIDITY value. | UIDVALIDITY value. | |||
| </t> | </li> | |||
| </list> | </ol> | |||
| </section> | ||||
| </t></list> | <section numbered="true" toc="default"> | |||
| </t> | <name>Message Sequence Number Message Attribute</name> | |||
| <iref item="Message Sequence Number (message attribute)" subitem="" | ||||
| </section> | primary="false"/> | |||
| <t> | ||||
| <section title='Message Sequence Number Message Attribute'> | A message sequence number is a relative position from 1 to the number of mess | |||
| <iref item='Message Sequence Number (message attribute)'/> | ages in the mailbox. | |||
| This position <bcp14>MUST</bcp14> be ordered by ascending unique identifiers. | ||||
| <t> | As | |||
| A Message Sequence Number is a relative position from 1 to the number of mess | ||||
| ages in the mailbox. | ||||
| This position MUST be ordered by ascending unique identifier. As | ||||
| each new message is added, it is assigned a message sequence number | each new message is added, it is assigned a message sequence number | |||
| that is 1 higher than the number of messages in the mailbox before | that is 1 higher than the number of messages in the mailbox before | |||
| that new message was added. | that new message was added. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| Message sequence numbers can be reassigned during the session. For | Message sequence numbers can be reassigned during the session. For | |||
| example, when a message is permanently removed (expunged) from the | example, when a message is permanently removed (expunged) from the | |||
| mailbox, the message sequence number for all subsequent messages is | mailbox, the message sequence number for all subsequent messages is | |||
| decremented. The number of messages in the mailbox is also | decremented. The number of messages in the mailbox is also | |||
| decremented. Similarly, a new message can be assigned a message | decremented. Similarly, a new message can be assigned a message | |||
| sequence number that was once held by some other message prior to an | sequence number that was once held by some other message prior to an | |||
| expunge. | expunge. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| In addition to accessing messages by relative position in the | In addition to accessing messages by relative position in the | |||
| mailbox, message sequence numbers can be used in mathematical | mailbox, message sequence numbers can be used in mathematical | |||
| calculations. For example, if an untagged "11 EXISTS" is received, | calculations. For example, if an untagged "11 EXISTS" is received, | |||
| and previously an untagged "8 EXISTS" was received, three new | and previously an untagged "8 EXISTS" was received, three new | |||
| messages have arrived with message sequence numbers of 9, 10, and 11. | messages have arrived with message sequence numbers of 9, 10, and 11. | |||
| Another example, if message 287 in a 523 message mailbox has UID | As another example, if message 287 in a 523-message mailbox has UID | |||
| 12345, there are exactly 286 messages which have lesser UIDs and 236 | 12345, there are exactly 286 messages that have lesser UIDs and 236 | |||
| messages which have greater UIDs. | messages that have greater UIDs. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| </section> | <name>Flags Message Attribute</name> | |||
| <iref item="Flags (message attribute)" subitem="" primary="false"/> | ||||
| <section title='Flags Message Attribute'> | <t> | |||
| <iref item='Flags (message attribute)'/> | A message has a list of zero or more named tokens, known as "flags", associat | |||
| ed with it. | ||||
| <t> | A flag is set by its addition to this list and is cleared by its | |||
| A message has associated with it a list of zero or more named tokens, | removal. There are two types of flags in IMAP4rev2: system flags and keyword | |||
| known as "flags". A flag is set by its addition to this list, and is cleared | s. | |||
| by its | A flag of either type can be permanent or session-only. | |||
| removal. There are two types of flags in IMAP4rev2: system flags, and keywor | </t> | |||
| ds. | <t> | |||
| A flag of either type can also be permanent or session-only. | <iref item="System Flag (type of flag)" subitem="" primary="false"/> | |||
| </t> | A system flag is a flag name that is predefined in this | |||
| <t> | ||||
| <iref item='System Flag (type of flag)'/> | ||||
| A system flag is a flag name that is pre-defined in this | ||||
| specification and begins with "\". | specification and begins with "\". | |||
| Certain system flags (\Deleted and \Seen) have special semantics described | Certain system flags (\Deleted and \Seen) have special semantics described | |||
| elsewhere in this document. The currently-defined system flags are: | elsewhere in this document. The currently defined system flags are: | |||
| </t> | ||||
| <list style='hanging'> | <dl newline="false" spacing="normal" indent="14"> | |||
| <t hangText='\Seen'> | <dt>\Seen</dt> | |||
| <iref item='\Seen (system flag)'/> | <dd> | |||
| <iref item="\Seen (system flag)" subitem="" primary="false"/> | ||||
| Message has been read | Message has been read | |||
| </t> | </dd> | |||
| <dt>\Answered</dt> | ||||
| <t hangText='\Answered'> | <dd> | |||
| <iref item='\Answered (system flag)'/> | <iref item="\Answered (system flag)" subitem="" primary="false"/> | |||
| Message has been answered | Message has been answered | |||
| </t> | </dd> | |||
| <dt>\Flagged</dt> | ||||
| <t hangText='\Flagged'> | <dd> | |||
| <iref item='\Flagged (system flag)'/> | <iref item="\Flagged (system flag)" subitem="" primary="false"/> | |||
| Message is "flagged" for urgent/special attention | Message is "flagged" for urgent/special attention | |||
| </t> | </dd> | |||
| <dt>\Deleted</dt> | ||||
| <t hangText='\Deleted'> | <dd> | |||
| <iref item='\Deleted (system flag)'/> | <iref item="\Deleted (system flag)" subitem="" primary="false"/> | |||
| Message is "deleted" for removal by later EXPUNGE | Message is "deleted" for removal by later EXPUNGE | |||
| </t> | </dd> | |||
| <dt>\Draft</dt> | ||||
| <t hangText='\Draft'> | <dd> | |||
| <iref item='\Draft (system flag)'/> | <iref item="\Draft (system flag)" subitem="" primary="false"/> | |||
| Message has not completed composition (marked as a draft). | Message has not completed composition (marked as a draft). | |||
| </t> | </dd> | |||
| <dt>\Recent</dt> | ||||
| <t hangText='\Recent'> | <dd> | |||
| <iref item='\Recent (system flag)'/> | <iref item="\Recent (system flag)" subitem="" primary="false"/> | |||
| This flag was in use in IMAP4rev1 and is now deprecated. | This flag was in use in IMAP4rev1 and is now deprecated. | |||
| </t> | </dd> | |||
| </list> | </dl> | |||
| </t> | <t> | |||
| <iref item="Keyword (type of flag)" subitem="" primary="false"/> | ||||
| <t> | ||||
| <iref item='Keyword (type of flag)'/> | ||||
| A keyword is defined by the server implementation. Keywords do not | A keyword is defined by the server implementation. Keywords do not | |||
| begin with "\". Servers MAY permit the client to define new keywords | begin with "\". Servers <bcp14>MAY</bcp14> permit the client to define new k eywords | |||
| in the mailbox (see the description of the PERMANENTFLAGS response | in the mailbox (see the description of the PERMANENTFLAGS response | |||
| code for more information). Some keywords that start with "$" | code for more information). Some keywords that start with "$" | |||
| are also defined in this specification. | are also defined in this specification. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | <iref item="Predefined keywords" subitem="" primary="false"/> | |||
| <iref item='Predefined keywords'/> | ||||
| This document defines several keywords that were not originally defined | This document defines several keywords that were not originally defined | |||
| in RFC 3501, but which were found to be useful by client implementations. | in <xref target="RFC3501" format="default"/> but were found to be useful by c | |||
| These keywords SHOULD be supported (i.e. allowed in SEARCH, allowed and prese | lient implementations. | |||
| rved in APPEND, COPY, MOVE commands) | These keywords <bcp14>SHOULD</bcp14> be supported (allowed in SEARCH and allo | |||
| wed and preserved in APPEND, COPY, and MOVE commands) | ||||
| by server implementations: | by server implementations: | |||
| <list style='hanging'> | </t> | |||
| <dl newline="true" spacing="normal"> | ||||
| <t hangText='$Forwarded'> | <dt>$Forwarded</dt> | |||
| <iref item='$Forwarded (predefined flag)'/> | <dd> | |||
| Message has been forwarded to another email address, | <iref item="$Forwarded (predefined flag)" subitem="" primary="false | |||
| embedded within or attached to a new message. An email client | "/> | |||
| Message has been forwarded to another email address by being | ||||
| embedded within, or attached to a new message. An email client | ||||
| sets this keyword when it successfully forwards the message to | sets this keyword when it successfully forwards the message to | |||
| another email address. Typical usage of this keyword is to show a | another email address. Typical usage of this keyword is to show a | |||
| different (or additional) icon for a message that has been forwarded. | different (or additional) icon for a message that has been forwarded. | |||
| Once set, the flag SHOULD NOT be cleared. | Once set, the flag <bcp14>SHOULD NOT</bcp14> be cleared. | |||
| <!--///Alexey: Add RFC 5550 reference for more reading?--> | ||||
| <!--RFC 5550 has stronger requirements for support than the SHOULD abo | ||||
| ve: | ||||
| IMAP4rev2 servers MUST be able to store the $Forwarded keyword. | ||||
| They MUST preserve it on the COPY or MOVE operation. The servers MUST | ||||
| support the SEARCH KEYWORD $Forwarded. | ||||
| --> | ||||
| </t> | ||||
| <t hangText='$MDNSent'> | </dd> | |||
| <iref item='$MDNSent (predefined flag)'/> | <dt>$MDNSent</dt> | |||
| Message Disposition Notification <xref target='RFC8098'/> was generate | <dd> | |||
| d and sent for this message. | <iref item="$MDNSent (predefined flag)" subitem="" primary="false" | |||
| See <xref target="RFC3503"/> for more details on how this keyword is u | /> | |||
| sed | Message Disposition Notification <xref target="RFC8098" format="defaul | |||
| t"/> was generated and sent for this message. | ||||
| See <xref target="RFC3503" format="default"/> for more details on how | ||||
| this keyword is used | ||||
| and for requirements on clients and servers. | and for requirements on clients and servers. | |||
| </t> | </dd> | |||
| <dt>$Junk</dt> | ||||
| <t hangText='$Junk'> | <dd> | |||
| <iref item='$Junk (predefined flag)'/> | <iref item="$Junk (predefined flag)" subitem="" primary="false"/> | |||
| The user (or a delivery agent on behalf of the user) may choose to mar k a message as definitely | The user (or a delivery agent on behalf of the user) may choose to mar k a message as definitely | |||
| containing junk ($Junk; see also the related keyword $NotJunk). The $J unk keyword | containing junk ($Junk; see also the related keyword $NotJunk). The $J unk keyword | |||
| can be used to mark (and potentially move/delete messages later), grou | can be used to mark, group, or hide undesirable messages (and such mes | |||
| p or hide undesirable messages. | sages might be moved or deleted later). | |||
| See <xref target="IMAP-KEYWORDS-REG"/> for more information. | See <xref target="IMAP-KEYWORDS-REG" format="default"/> for more infor | |||
| </t> | mation. | |||
| </dd> | ||||
| <t hangText='$NotJunk'> | <dt>$NotJunk</dt> | |||
| <iref item='$NotJunk (predefined flag)'/> | <dd> | |||
| <iref item="$NotJunk (predefined flag)" subitem="" primary="false" | ||||
| /> | ||||
| The user (or a delivery agent on behalf of the user) may choose to mar k a message as definitely | The user (or a delivery agent on behalf of the user) may choose to mar k a message as definitely | |||
| not containing junk ($NotJunk; see also the related keyword $Junk). Th e $NotJunk keyword | not containing junk ($NotJunk; see also the related keyword $Junk). Th e $NotJunk keyword | |||
| can be used to mark, group or show messages that the user wants to see | can be used to mark, group, or show messages that the user wants to se | |||
| . | e. | |||
| See <xref target="IMAP-KEYWORDS-REG"/> for more information. | See <xref target="IMAP-KEYWORDS-REG" format="default"/> for more infor | |||
| </t> | mation. | |||
| </dd> | ||||
| <t hangText='$Phishing'> | <dt>$Phishing</dt> | |||
| <iref item='$Phishing (predefined flag)'/> | <dd> | |||
| <t><iref item="$Phishing (predefined flag)" subitem="" primary="fa | ||||
| lse"/> | ||||
| The $Phishing keyword can be used by a delivery agent to mark a messag e | The $Phishing keyword can be used by a delivery agent to mark a messag e | |||
| as highly likely to be a phishing email. An email that’s determined to | as highly likely to be a phishing email. A message that's determined t o | |||
| be a phishing email by the delivery agent should also be considered a | be a phishing email by the delivery agent should also be considered a | |||
| junk email and have the appropriate junk filtering applied, including | junk email and have the appropriate junk filtering applied, including | |||
| setting the $Junk flag and placing in the \Junk special-use mailbox (s | setting the $Junk flag and placing the message in the \Junk special-us | |||
| ee <xref target='list-resp'/>) | e mailbox (see <xref target="list-resp" format="default"/>), | |||
| if available.<vspace/> | if available.</t> | |||
| <t> | ||||
| If both the $Phishing flag and the $Junk flag are set, the user agent | If both the $Phishing flag and the $Junk flag are set, the user agent | |||
| should display an additional warning message to the user. | should display an additional warning message to the user. | |||
| <!-- | Additionally, the user agent might display a warning, | |||
| Phrasing of the form "this message | such as something of the form, "This message | |||
| may be trying to steal your personal information" is recommended. | may be trying to steal your personal information," | |||
| --> | when the user clicks on any hyperlinks within the message.</t> | |||
| Additionally the user agent may display a warning when clicking on any | <t> | |||
| hyperlinks within the message.<vspace/> | ||||
| The requirement for both $Phishing and $Junk to be set before a user | The requirement for both $Phishing and $Junk to be set before a user | |||
| agent displays a warning is for better backwards compatibility with | agent displays a warning is for better backwards compatibility with | |||
| existing clients that understand the $Junk flag but not the $Phishing | existing clients that understand the $Junk flag but not the $Phishing | |||
| flag. This is so that when an unextended client removes the $Junk flag , an | flag. This is so that when an unextended client removes the $Junk flag , an | |||
| extended client will also show the correct state. | extended client will also show the correct state. | |||
| See <xref target="IMAP-KEYWORDS-REG"/> for more information. | See <xref target="IMAP-KEYWORDS-REG" format="default"/> for more infor | |||
| </t> | mation. | |||
| </t> | ||||
| </list> | </dd> | |||
| </t> | </dl> | |||
| <t>$Junk and $NotJunk are mutually exclusive. If more than one of | ||||
| <t>$Junk and $NotJunk are mutually exclusive. If more than one of | these is set for a message, the client <bcp14>MUST</bcp14> treat it as if | |||
| them is set for a message, the client MUST treat this as if | none are set, and it <bcp14>SHOULD</bcp14> unset both of them on the IMAP | |||
| none of them is set and SHOULD unset both of them on the IMAP | ||||
| server. | server. | |||
| </t> | </t> | |||
| <t>Other registered keywords can be found in the "IMAP and JMAP Keywor | ||||
| <t>Other registered keywords can be found in the "IMAP and JMAP Keywords" reg | ds" registry <xref target="IMAP-KEYWORDS-REG" format="default"/>. | |||
| istry <xref target="IMAP-KEYWORDS-REG"/>. | New keywords <bcp14>SHOULD</bcp14> be registered in this registry using the p | |||
| New keywords SHOULD be registered in this registry using the procedure specif | rocedure specified in <xref target="RFC5788" format="default"/>.</t> | |||
| ied in <xref target="RFC5788"/>.</t> | <t> | |||
| <iref item="Permanent Flag (class of flag)" subitem="" primary="false"/> | ||||
| <t> | <iref item="Session Flag (class of flag)" subitem="" primary="false" | |||
| <iref item='Permanent Flag (class of flag)'/> | /> | |||
| <iref item='Session Flag (class of flag)'/> | ||||
| A flag can be permanent or session-only on a per-flag basis. | A flag can be permanent or session-only on a per-flag basis. | |||
| Permanent flags are those which the client can add or remove from the | Permanent flags are those that the client can add or remove from the | |||
| message flags permanently; that is, concurrent and subsequent | message flags permanently; that is, concurrent and subsequent | |||
| sessions will see any change in permanent flags. Changes to session | sessions will see any change in permanent flags. Changes to session | |||
| flags are valid only in that session. | flags are valid only in that session. | |||
| </t> | ||||
| <!-- | </section> | |||
| <list><t> | <section numbered="true" toc="default"> | |||
| Note: The \Recent system flag is a special case of a | <name>Internal Date Message Attribute</name> | |||
| session flag. \Recent can not be used as an argument in a | <iref item="Internal Date (message attribute)" subitem="" primary="fal | |||
| STORE or APPEND command, and thus can not be changed at | se"/> | |||
| all. | <t> | |||
| </t></list> | ||||
| --> | ||||
| </t> | ||||
| </section> | ||||
| <section title='Internal Date Message Attribute'> | ||||
| <iref item='Internal Date (message attribute)'/> | ||||
| <t> | ||||
| An Internal Date message attribute is the internal date and time of the messa ge on the server. This | An Internal Date message attribute is the internal date and time of the messa ge on the server. This | |||
| is not the date and time in the <xref target='RFC-5322'/> header, but rather | is not the date and time in the <xref target="RFC5322" format="default"/> hea | |||
| a | der but rather a | |||
| date and time which reflects when the message was received. In | date and time that reflects when the message was received. In | |||
| the case of messages delivered via <xref target='SMTP'/>, this is the | the case of messages delivered via <xref target="RFC5321" format="default"/>, | |||
| this is the | ||||
| date and time of final delivery of the message as defined by | date and time of final delivery of the message as defined by | |||
| <xref target='SMTP'/>. In the case of messages delivered by the IMAP4rev2 CO | <xref target="RFC5321" format="default"/>. In the case of messages created b | |||
| PY or MOVE | y the IMAP4rev2 COPY or MOVE command, this <bcp14>SHOULD</bcp14> be the same as | |||
| command, this SHOULD be the internal date and time of the source | the Internal Date attribute of the source | |||
| message. In the case of messages delivered by the IMAP4rev2 | message. In the case of messages created by the IMAP4rev2 | |||
| APPEND command, this SHOULD be the date and time as specified in | APPEND command, this <bcp14>SHOULD</bcp14> be the date and time as specified | |||
| in | ||||
| the APPEND command description. All other cases are | the APPEND command description. All other cases are | |||
| implementation defined. | implementation defined. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section numbered="true" toc="default" anchor="RFC822.SIZE_message_attri | |||
| bute"> | ||||
| <section title='[RFC-5322] Size Message Attribute'> | <name>RFC822.SIZE Message Attribute</name> | |||
| <iref item='[RFC-5322] Size (message attribute)'/> | <iref item="RFC822.SIZE (message attribute)" subitem="" primary="false | |||
| "/> | ||||
| <t> | <t> | |||
| An RFC 5322 size is the number of octets in the message, as expressed in <xre | RFC822.SIZE is the number of octets in the message when the message | |||
| f target='RFC-5322'/> | is expressed in <xref target="RFC5322" format="default"/> | |||
| format. | format. This size SHOULD match the result | |||
| </t> | of a "FETCH BODY[]" command. If the message is internally stored in | |||
| </section> | some other format, the server calculates the size and often stores | |||
| it for later use to avoid the need for recalculation. | ||||
| <section title='Envelope Structure Message Attribute'> | </t> | |||
| <iref item='Envelope Structure (message attribute)'/> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <t> | <name>Envelope Structure Message Attribute</name> | |||
| An Envelope Structure is a parsed representation of the <xref target='RFC-532 | <iref item="Envelope Structure (message attribute)" subitem="" primary | |||
| 2'/> header of the message. | ="false"/> | |||
| Note that the IMAP Envelope structure is not the same as an | <t> | |||
| <xref target='SMTP'/> envelope. | An envelope structure is a parsed representation of the <xref target="RFC5322 | |||
| </t> | " format="default"/> header of the message. | |||
| Note that the IMAP envelope structure is not the same as an | ||||
| </section> | <xref target="RFC5321" format="default"/> envelope. | |||
| </t> | ||||
| <section title='Body Structure Message Attribute'> | </section> | |||
| <iref item='Body Structure (message attribute)'/> | <section numbered="true" toc="default"> | |||
| <name>Body Structure Message Attribute</name> | ||||
| <t> | <iref item="Body Structure (message attribute)" subitem="" primary="fa | |||
| A Body Structure is a parsed representation of the <xref target='MIME-IMB'/> | lse"/> | |||
| body structure | <t> | |||
| A body structure is a parsed representation of the <xref target="RFC2045" for | ||||
| mat="default"/> body structure | ||||
| information of the message. | information of the message. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| </section> | <name>Message Texts</name> | |||
| <t> | ||||
| <section title='Message Texts'> | In addition to being able to fetch the full <xref target="RFC5322" format="de | |||
| fault"/> text of a | ||||
| <t> | ||||
| In addition to being able to fetch the full <xref target='RFC-5322'/> text of | ||||
| a | ||||
| message, IMAP4rev2 permits the fetching of portions of the full | message, IMAP4rev2 permits the fetching of portions of the full | |||
| message text. Specifically, it is possible to fetch the | message text. Specifically, it is possible to fetch the | |||
| <xref target='RFC-5322'/> message header, <xref target='RFC-5322'/> message b | <xref target="RFC5322" format="default"/> message header, the <xref target="R | |||
| ody, a <xref target='MIME-IMB'/> | FC5322" format="default"/> message body, a <xref target="RFC2045" format="defaul | |||
| body part, or a <xref target='MIME-IMB'/> header. | t"/> | |||
| </t> | body part, or a <xref target="RFC2045" format="default"/> header. | |||
| </t> | ||||
| </section> | </section> | |||
| </section> | ||||
| </section> | <section numbered="true" toc="default" anchor="state_and_flow"> | |||
| <name>State and Flow Diagram</name> | ||||
| <section title='State and Flow Diagram'> | <t> | |||
| <t> | ||||
| Once the connection between client and server is established, an | Once the connection between client and server is established, an | |||
| IMAP4rev2 connection is in one of four states. The initial | IMAP4rev2 connection is in one of four states. The initial | |||
| state is identified in the server greeting. Most commands are | state is identified in the server greeting. Most commands are | |||
| only valid in certain states. It is a protocol error for the | only valid in certain states. It is a protocol error for the | |||
| client to attempt a command while the connection is in an | client to attempt a command while the connection is in an | |||
| inappropriate state, and the server will respond with a BAD or | inappropriate state, and the server will respond with a BAD or | |||
| NO (depending upon server implementation) command completion | NO (depending upon server implementation) command completion | |||
| result. | result. | |||
| </t> | </t> | |||
| <section numbered="true" toc="default"> | ||||
| <section title='Not Authenticated State'> | <name>Not Authenticated State</name> | |||
| <t> | ||||
| <t> | In the not authenticated state, the client <bcp14>MUST</bcp14> supply | |||
| In the not authenticated state, the client MUST supply | ||||
| authentication credentials before most commands will be | authentication credentials before most commands will be | |||
| permitted. This state is entered when a connection starts | permitted. This state is entered when a connection starts | |||
| unless the connection has been pre-authenticated. | unless the connection has been pre-authenticated. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section numbered="true" toc="default"> | |||
| <name>Authenticated State</name> | ||||
| <section title='Authenticated State'> | <t> | |||
| In the authenticated state, the client is authenticated and <bcp14>MUST</bcp1 | ||||
| <t> | 4> | |||
| In the authenticated state, the client is authenticated and MUST | ||||
| select a mailbox to access before commands that affect messages | select a mailbox to access before commands that affect messages | |||
| will be permitted. This state is entered when a | will be permitted. This state is entered when a | |||
| pre-authenticated connection starts, when acceptable | pre-authenticated connection starts, when acceptable | |||
| authentication credentials have been provided, after an error in | authentication credentials have been provided, after an error in | |||
| selecting a mailbox, or after a successful CLOSE or UNSELECT command. | selecting a mailbox, or after a successful CLOSE or UNSELECT command. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section numbered="true" toc="default"> | |||
| <name>Selected State</name> | ||||
| <section title='Selected State'> | <t> | |||
| <t> | ||||
| In a selected state, a mailbox has been selected to access. | In a selected state, a mailbox has been selected to access. | |||
| This state is entered when a mailbox has been successfully | This state is entered when a mailbox has been successfully | |||
| selected. | selected. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section numbered="true" toc="default"> | |||
| <name>Logout State</name> | ||||
| <section title='Logout State'> | <t> | |||
| <t> | ||||
| In the logout state, the connection is being terminated. This | In the logout state, the connection is being terminated. This | |||
| state can be entered as a result of a client request (via the | state can be entered as a result of a client request (via the | |||
| LOGOUT command) or by unilateral action on the part of either | LOGOUT command) or by unilateral action on the part of either | |||
| the client or server. | the client or the server. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | If the client requests the logout state, the server <bcp14>MUST</bcp14> send | |||
| If the client requests the logout state, the server MUST send an | an | |||
| untagged BYE response and a tagged OK response to the LOGOUT | untagged BYE response and a tagged OK response to the LOGOUT | |||
| command before the server closes the connection; and the client | command before the server closes the connection; and the client | |||
| MUST read the tagged OK response to the LOGOUT command before | <bcp14>MUST</bcp14> read the tagged OK response to the LOGOUT command before | |||
| the client closes the connection. | the client closes the connection. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | A server <bcp14>SHOULD NOT</bcp14> unilaterally close the connection without | |||
| A server SHOULD NOT unilaterally close the connection without | first sending an untagged BYE response that contains the reason for | |||
| sending an untagged BYE response that contains the reason for | doing so. A client <bcp14>SHOULD NOT</bcp14> unilaterally close the | |||
| having done so. A client SHOULD NOT unilaterally close the | connection; instead, it <bcp14>SHOULD</bcp14> issue a LOGOUT command. If the | |||
| connection, and instead SHOULD issue a LOGOUT command. If the | ||||
| server detects that the client has unilaterally closed the | server detects that the client has unilaterally closed the | |||
| connection, the server MAY omit the untagged BYE response and | connection, the server <bcp14>MAY</bcp14> omit the untagged BYE response and | |||
| simply close its connection. | simply close its connection. | |||
| </t> | </t> | |||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| <figure><artwork><![CDATA[ | ||||
| +----------------------+ | +----------------------+ | |||
| |connection established| | |connection established| | |||
| +----------------------+ | +----------------------+ | |||
| || | || | |||
| \/ | \/ | |||
| +--------------------------------------+ | +--------------------------------------+ | |||
| | server greeting | | | server greeting | | |||
| +--------------------------------------+ | +--------------------------------------+ | |||
| || (1) || (2) || (3) | || (1) || (2) || (3) | |||
| \/ || || | \/ || || | |||
| skipping to change at line 886 ¶ | skipping to change at line 773 ¶ | |||
| || || || (7) || | || || || (7) || | |||
| \/ \/ \/ \/ | \/ \/ \/ \/ | |||
| +--------------------------------------+ | +--------------------------------------+ | |||
| | Logout | | | Logout | | |||
| +--------------------------------------+ | +--------------------------------------+ | |||
| || | || | |||
| \/ | \/ | |||
| +-------------------------------+ | +-------------------------------+ | |||
| |both sides close the connection| | |both sides close the connection| | |||
| +-------------------------------+ | +-------------------------------+ | |||
| ]]></artwork> | ||||
| (1) connection without pre-authentication (OK greeting) | <t> | |||
| (2) pre-authenticated connection (PREAUTH greeting) | Legend for the above diagram: | |||
| (3) rejected connection (BYE greeting) | </t> | |||
| (4) successful LOGIN or AUTHENTICATE command | <ol spacing="compact" type="(%d)"> | |||
| (5) successful SELECT or EXAMINE command | <li> connection without pre-authentication (OK greeting)</li> | |||
| (6) CLOSE or UNSELECT command, unsolicited CLOSED | <li> pre-authenticated connection (PREAUTH greeting)</li> | |||
| response code or failed SELECT or EXAMINE command | <li> rejected connection (BYE greeting)</li> | |||
| (7) LOGOUT command, server shutdown, or connection closed | <li> successful LOGIN or AUTHENTICATE command</li> | |||
| <li> successful SELECT or EXAMINE command</li> | ||||
| ]]></artwork></figure> | <li> CLOSE or UNSELECT command, unsolicited CLOSED | |||
| response code, or failed SELECT or EXAMINE command</li> | ||||
| </section> | <li>LOGOUT command, server shutdown, or connection closed </li> | |||
| </ol> | ||||
| </section> | </section> | |||
| </section> | ||||
| <section title='Data Formats'> | <section numbered="true" toc="default" anchor="data_formats"> | |||
| <name>Data Formats</name> | ||||
| <t> | <t> | |||
| IMAP4rev2 uses textual commands and responses. Data in | IMAP4rev2 uses textual commands and responses. Data in | |||
| IMAP4rev2 can be in one of several forms: atom, number, string, | IMAP4rev2 can be in one of several forms: atom, number, string, | |||
| parenthesized list, or NIL. Note that a particular data item | parenthesized list, or NIL. Note that a particular data item | |||
| may take more than one form; for example, a data item defined as | may take more than one form; for example, a data item defined as | |||
| using "astring" syntax may be either an atom or a string. | using "astring" syntax may be either an atom or a string. | |||
| </t> | </t> | |||
| <section numbered="true" toc="default"> | ||||
| <section title='Atom'> | <name>Atom</name> | |||
| <t> | ||||
| <t> | ||||
| An atom consists of one or more non-special characters. | An atom consists of one or more non-special characters. | |||
| </t> | </t> | |||
| <section numbered="true" toc="default"> | ||||
| <section title='Sequence set and UID set'> | <name>Sequence Set and UID Set</name> | |||
| <t>A set of messages can be referenced by a sequence set containing ei | ||||
| <t>A set of messages can be referenced by a sequence set containing eithe | ther | |||
| r | message sequence numbers or unique identifiers. See <xref target="IMAP-AB | |||
| message sequence numbers or unique identifiers. See <xref target='IMAP-AB | NF" format="default"/> for details. | |||
| NF'/> for details. | A sequence set can contain ranges of sequence numbers (such as "5:50"), a | |||
| Sequence sets can contain ranges (e.g. "5:50"), an enumeration of specifi | n enumeration of specific | |||
| c | sequence numbers, or a combination of the above. | |||
| message sequence numbers/unique identifiers, | A sequence set can use the special symbol "*" to represent the maximum se | |||
| a special symbol "*", or a combination of the above. | quence number in the mailbox. | |||
| Note that a sequence set never mixes message sequence numbers and unique | A sequence set never contains unique identifiers. | |||
| identifiers | </t> | |||
| in the same representation. | <t> | |||
| </t> | A "UID set" is similar to the sequence set, but uses unique identifiers i | |||
| nstead of message sequence numbers, and is not permitted to contain the special | ||||
| <t> | symbol "*". | |||
| A "UID set" is similar to the sequence set of unique identifiers; however | </t> | |||
| , the "*" | ||||
| value for a sequence number is not permitted. | ||||
| </t> | ||||
| <!--Only useful for IMAP extension writers? | ||||
| <t>Sequence sets can be represented as <atom>s</t> | ||||
| --> | ||||
| </section> | </section> | |||
| </section> | ||||
| </section> | <section numbered="true" toc="default"> | |||
| <name>Number</name> | ||||
| <section title='Number'> | <t> | |||
| A number consists of one or more digit characters and | ||||
| <t> | ||||
| A number consists of one or more digit characters, and | ||||
| represents a numeric value. | represents a numeric value. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section anchor="data-string" numbered="true" toc="default"> | |||
| <name>String</name> | ||||
| <section title='String' anchor='data-string'> | <t> | |||
| A string is in one of three forms: synchronizing literal, non-synchronizing l | ||||
| <t> | iteral, or quoted | |||
| A string is in one of three forms: synchronizing literal, non-synchronizing l | string. The synchronizing literal form is the general form of a string, with | |||
| iteral or quoted | out limitation on the characters the string may include. | |||
| string. The synchronizing literal form is the general form of string. | The non-synchronizing literal form is also the general form, but it has a len | |||
| The non-synchronizing literal form is also the general form, but has length l | gth restriction. | |||
| imitation. The | The quoted string form is an alternative that avoids the overhead of | |||
| quoted string form is an alternative that avoids the overhead of | processing a literal, but has limitations on the characters that may be used. | |||
| processing a literal at the cost of limitations of characters | </t> | |||
| which may be used. | <t>When the distinction between synchronizing and non-synchronizing lite | |||
| </t> | rals is not important, | |||
| <t>When the distinction between synchronizing and non-synchronizing literals | ||||
| is not important, | ||||
| this document only uses the term "literal".</t> | this document only uses the term "literal".</t> | |||
| <t> | ||||
| <t> | ||||
| A synchronizing literal is a sequence of zero or more octets (including CR an d | A synchronizing literal is a sequence of zero or more octets (including CR an d | |||
| LF), prefix-quoted with an octet count in the form of an open | LF), prefix-quoted with an octet count in the form of an open | |||
| brace ("{"), the number of octets, close brace ("}"), and CRLF. | brace ("{"), the number of octets, a close brace ("}"), and a CRLF. | |||
| In the case of synchronizing literals transmitted from server to client, the | In the case of synchronizing literals transmitted from server to client, the | |||
| CRLF is immediately followed by the octet data. In the case of | CRLF is immediately followed by the octet data. In the case of | |||
| synchronizing literals transmitted from client to server, the client MUST wai t | synchronizing literals transmitted from client to server, the client <bcp14>M UST</bcp14> wait | |||
| to receive a command continuation request (described later in | to receive a command continuation request (described later in | |||
| this document) before sending the octet data (and the remainder | this document) before sending the octet data (and the remainder | |||
| of the command). | of the command). | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | The non-synchronizing literal is an alternative form of synchronizing literal | |||
| The non-synchronizing literal is an alternative form of synchronizing | and may be used from client to server anywhere a synchronizing literal is permi | |||
| literal, and it may appear in communication from client to server | tted. | |||
| instead of the synchonizing form of literal. The non-synchronizing literal f | The non-synchronizing literal form | |||
| orm | <bcp14>MUST NOT</bcp14> be sent from server to client. | |||
| MUST NOT be sent from server to client. | ||||
| The non-synchronizing literal is distinguished from the synchronizing literal | The non-synchronizing literal is distinguished from the synchronizing literal | |||
| by having a plus ("+") between the octet count | by having a plus ("+") between the octet count | |||
| and the closing brace ("}"). The server does not generate a command | and the closing brace ("}"). The server does not generate a command | |||
| continuation request in response to a non-synchronizing literal, and | continuation request in response to a non-synchronizing literal, and | |||
| clients are not required to wait before sending the octets of a non- | clients are not required to wait before sending the octets of a | |||
| synchronizing literal. Unless specified otherwise in an IMAP extension, | non-synchronizing literal. Unless otherwise specified in an IMAP extension, | |||
| non-synchronizing literals MUST NOT be larger than 4096 octets. | non-synchronizing literals <bcp14>MUST NOT</bcp14> be larger than 4096 octets | |||
| Any literal larger than 4096 bytes MUST be sent as a synchronizing literal. | . | |||
| Any literal larger than 4096 bytes <bcp14>MUST</bcp14> be sent as a synchroni | ||||
| zing literal. | ||||
| (Non-synchronizing literals defined in this document are the same as | (Non-synchronizing literals defined in this document are the same as | |||
| non-synchronizing literals defined by the LITERAL- extension from <xref targe t="RFC7888"/>. | non-synchronizing literals defined by the LITERAL- extension from <xref targe t="RFC7888" format="default"/>. | |||
| See that document for details on how to handle invalid non-synchronizing lite rals | See that document for details on how to handle invalid non-synchronizing lite rals | |||
| longer than 4096 octets and for interaction with other IMAP extensions.) | longer than 4096 octets and for interaction with other IMAP extensions.) | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| A quoted string is a sequence of zero or more Unicode characters, | A quoted string is a sequence of zero or more Unicode characters, | |||
| excluding CR and LF, encoded in UTF-8, with double quote (<">) characte rs at each | excluding CR and LF, encoded in UTF-8, with double quote (<">) characte rs at each | |||
| end. | end. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The empty string is represented as "" (a quoted string | The empty string is represented as "" (a quoted string | |||
| with zero characters between double quotes), as {0} followed | with zero characters between double quotes), as {0} followed | |||
| by CRLF (a synchronizing literal with an octet count of 0) or | by a CRLF (a synchronizing literal with an octet count of 0), or | |||
| as {0+} followed by CRLF (a non-synchronizing literal with an octet count of | as {0+} followed by a CRLF (a non-synchronizing literal with an octet count o | |||
| 0). | f 0). | |||
| <list><t> | </t> | |||
| <t indent="3"> | ||||
| Note: Even if the octet count is 0, a client transmitting a | Note: Even if the octet count is 0, a client transmitting a | |||
| synchronizing literal MUST wait to receive a command continuation request. | synchronizing literal <bcp14>MUST</bcp14> wait to receive a command continu | |||
| </t></list> | ation request. | |||
| </t> | </t> | |||
| <section numbered="true" toc="default"> | ||||
| <section title='8-bit and Binary Strings'> | <name>8-Bit and Binary Strings</name> | |||
| <t> | ||||
| <t> | ||||
| 8-bit textual and binary mail is supported through the use of a | 8-bit textual and binary mail is supported through the use of a | |||
| <xref target='MIME-IMB'/> content transfer encoding. IMAP4rev2 implementatio | <xref target="RFC2045" format="default"/> content transfer encoding. IMAP4re | |||
| ns MAY | v2 implementations <bcp14>MAY</bcp14> | |||
| transmit 8-bit or multi-octet characters in literals, but SHOULD do | transmit 8-bit or multi-octet characters in literals but <bcp14>SHOULD</bcp14 | |||
| so only when the <xref target='CHARSET'/> is identified. | > do | |||
| </t> | so only when the <xref target="RFC2978" format="default"/> is identified. | |||
| </t> | ||||
| <t> | <t> | |||
| IMAP4rev2 is compatible with <xref target='I18N-HDRS'/>. As a result, | IMAP4rev2 is compatible with <xref target="RFC6532" format="default"/>. As a | |||
| result, | ||||
| the identified charset for header-field values with 8-bit content is | the identified charset for header-field values with 8-bit content is | |||
| UTF-8 <xref target='UTF-8'/>. IMAP4rev2 implementations MUST accept | UTF-8 <xref target="RFC3629" format="default"/>. IMAP4rev2 implementations <b | |||
| and MAY transmit <xref target='UTF-8'/> text in quoted-strings as | cp14>MUST</bcp14> accept | |||
| and <bcp14>MAY</bcp14> transmit <xref target="RFC3629" format="default"/> tex | ||||
| t in quoted-strings as | ||||
| long as the string does not contain NUL, CR, or LF. This differs from | long as the string does not contain NUL, CR, or LF. This differs from | |||
| IMAP4rev1 implementations. | IMAP4rev1 implementations. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| Although a BINARY content transfer encoding is defined, unencoded binary stri ngs | Although a BINARY content transfer encoding is defined, unencoded binary stri ngs | |||
| are not permitted, unless returned in a <literal8> in response to | are not permitted, unless returned in a <literal8> in response to a | |||
| BINARY.PEEK[<section-binary>]<<partial>> or BINARY[<section-binar | BINARY.PEEK[<section-binary>]<<partial>> or BINARY[<sect | |||
| y>]<<partial>> | ion-binary>]<<partial>> | |||
| FETCH data item. A "binary string" is any string with NUL | FETCH data item. A "binary string" is any string with NUL | |||
| characters. A string with an excessive amount of CTL characters MAY also be considered to be | characters. A string with an excessive amount of CTL characters <bcp14>MAY</ bcp14> also be considered to be | |||
| binary. Unless returned in response to BINARY.PEEK[...]/BINARY[...] FETCH, | binary. Unless returned in response to BINARY.PEEK[...]/BINARY[...] FETCH, | |||
| client and server implementations MUST encode binary data into a textual | client and server implementations <bcp14>MUST</bcp14> encode binary data into | |||
| form, such as BASE64, before transmitting the data. | a textual | |||
| </t> | form, such as base64, before transmitting the data. | |||
| </t> | ||||
| </section> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| </section> | <name>Parenthesized List</name> | |||
| <t> | ||||
| <section title='Parenthesized List'> | ||||
| <t> | ||||
| Data structures are represented as a "parenthesized list"; a sequence | Data structures are represented as a "parenthesized list"; a sequence | |||
| of data items, delimited by space, and bounded at each end by | of data items, delimited by space, and bounded at each end by | |||
| parentheses. A parenthesized list can contain other parenthesized | parentheses. A parenthesized list can contain other parenthesized | |||
| lists, using multiple levels of parentheses to indicate nesting. | lists, using multiple levels of parentheses to indicate nesting. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The empty list is represented as () -- a parenthesized list with no | The empty list is represented as () -- a parenthesized list with no | |||
| members. | members. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section numbered="true" toc="default"> | |||
| <name>NIL</name> | ||||
| <section title='NIL'> | <t> | |||
| <t> | ||||
| The special form "NIL" represents the non-existence of a particular | The special form "NIL" represents the non-existence of a particular | |||
| data item that is represented as a string or parenthesized list, as | data item that is represented as a string or parenthesized list, as | |||
| distinct from the empty string "" or the empty parenthesized list (). | distinct from the empty string "" or the empty parenthesized list (). | |||
| <list><t> | </t> | |||
| Note: NIL is never used for any data item which takes the | <aside><t> | |||
| Note: NIL is never used for any data item that takes the | ||||
| form of an atom. For example, a mailbox name of "NIL" is a | form of an atom. For example, a mailbox name of "NIL" is a | |||
| mailbox named NIL as opposed to a non-existent mailbox | mailbox named NIL as opposed to a non-existent mailbox | |||
| name. This is because mailbox uses "astring" syntax which | name. This is because mailbox uses "astring" syntax, which | |||
| is an atom or a string. Conversely, an addr-name of NIL is | is an atom or a string. Conversely, an addr-name of NIL is | |||
| a non-existent personal name, because addr-name uses | a non-existent personal name, because addr-name uses | |||
| "nstring" syntax which is NIL or a string, but never an | "nstring" syntax, which is NIL or a string, but never an | |||
| atom. | atom.</t> | |||
| </t></list> | </aside> | |||
| </t> | <t> | |||
| Examples:</t> | ||||
| <figure><artwork> | ||||
| Examples: | ||||
| The following LIST response: | ||||
| * LIST () "/" NIL | ||||
| is equivalent to: | <t>The following LIST response:</t> | |||
| * LIST () "/" "NIL" | <sourcecode name="" type=""> | |||
| * LIST () "/" NIL | ||||
| </sourcecode> | ||||
| as LIST response ABNF is using "astring" for mailbox name. | <t>is equivalent to:</t> | |||
| However, the following response | <sourcecode name="" type=""> | |||
| * LIST () "/" "NIL" | ||||
| </sourcecode> | ||||
| * FETCH 1 (BODY[1] NIL) | <t> | |||
| as LIST response ABNF is using "astring" for mailbox name. | ||||
| </t> | ||||
| <t> | ||||
| However, the following response: | ||||
| </t> | ||||
| is not equivalent to: | <sourcecode name="" type=""> | |||
| * FETCH 1 (BODY[1] NIL) | ||||
| </sourcecode> | ||||
| * FETCH 1 (BODY[1] "NIL") | <t>is not equivalent to:</t> | |||
| The former means absence of the body part, while the latter | <sourcecode name="" type=""> | |||
| means that it contains literal sequence of characters "NIL". | * FETCH 1 (BODY[1] "NIL") | |||
| </artwork></figure> | </sourcecode> | |||
| <t> | ||||
| The former indicates absence of the body part, while the latter | ||||
| means that it contains a string with the three characters "NIL".</t> | ||||
| </section> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default" anchor="operational_considerations"> | ||||
| </section> | <name>Operational Considerations</name> | |||
| <t> | ||||
| <section title='Operational Considerations'> | ||||
| <t> | ||||
| The following rules are listed here to ensure that all IMAP4rev2 | The following rules are listed here to ensure that all IMAP4rev2 | |||
| implementations interoperate properly. | implementations interoperate properly. | |||
| </t> | </t> | |||
| <section anchor="mailbox-naming" numbered="true" toc="default"> | ||||
| <section title='Mailbox Naming' anchor='mailbox-naming'> | <name>Mailbox Naming</name> | |||
| <t> | ||||
| <t> | In IMAP4rev2, mailbox names are encoded in Net-Unicode <xref target="RFC5198" | |||
| In IMAP4rev2, Mailbox names are encoded in Net-Unicode <xref | format="default"/> (this differs from IMAP4rev1). Client | |||
| target="NET-UNICODE"/> (this differs from IMAP4rev1). Client | implementations <bcp14>MAY</bcp14> attempt to create Net-Unicode mailbox name | |||
| implementations MAY attempt to create Net-Unicode mailbox names, and | s and | |||
| MUST interpret any 8-bit mailbox names returned by LIST as | <bcp14>MUST</bcp14> interpret any 8-bit mailbox names returned by LIST as | |||
| <xref target="NET-UNICODE"/>. Server implementations MUST prohibit | <xref target="RFC5198" format="default"/>. Server implementations <bcp14>MUST | |||
| </bcp14> prohibit | ||||
| the creation of 8-bit mailbox names that do not comply with | the creation of 8-bit mailbox names that do not comply with | |||
| Net-Unicode. However, servers MAY accept a de-normalized UTF-8 | Net-Unicode. However, servers <bcp14>MAY</bcp14> accept a denormalized UTF-8 | |||
| mailbox name and convert it to Unicode normalization form "NFC" | mailbox name and convert it to Unicode Normalization Form C (NFC) | |||
| (as per Net-Unicode requirements) prior to mailbox creation. | (as per Net-Unicode requirements) prior to mailbox creation. | |||
| Servers that choose to accept such de-normalized UTF-8 mailbox | Servers that choose to accept such denormalized UTF-8 mailbox | |||
| names MUST accept them in all IMAP commands that have a mailbox name paramete | names <bcp14>MUST</bcp14> accept them in all IMAP commands that have a mailbo | |||
| r. | x name parameter. | |||
| In particular SELECT <name> must open the same mailbox that | In particular, SELECT <name> must open the same mailbox that | |||
| was successfully created with CREATE <name>, even if <name> | was successfully created with CREATE <name>, even if <name> | |||
| is a de-normalized UTF-8 mailbox name. | is a denormalized UTF-8 mailbox name. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The case-insensitive mailbox name INBOX is a special name reserved to | The case-insensitive mailbox name INBOX is a special name reserved to | |||
| mean "the primary mailbox for this user on this server". (Note that | mean "the primary mailbox for this user on this server". (Note that | |||
| this special name may not exist on some servers for some users, for example | this special name might not exist on some servers for some users, for example , | |||
| if the user has no access to personal namespace.) The | if the user has no access to personal namespace.) The | |||
| interpretation of all other names is implementation-dependent. | interpretation of all other names is implementation dependent. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| In particular, this specification takes no position on case | In particular, this specification takes no position on case | |||
| sensitivity in non-INBOX mailbox names. Some server implementations | sensitivity in non-INBOX mailbox names. Some server implementations | |||
| are fully case-sensitive in ASCII range; others preserve case of a newly-crea | are fully case sensitive in ASCII range; others preserve the case of a newly | |||
| ted | created | |||
| name but otherwise are case-insensitive; and yet others coerce names | name but otherwise are case insensitive; and yet others coerce names | |||
| to a particular case. Client implementations must be able to interact with a ny | to a particular case. Client implementations must be able to interact with a ny | |||
| of these. | of these. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| There are certain client considerations when creating a new mailbox | There are certain client considerations when creating a new mailbox | |||
| name: | name: | |||
| <list style='numbers'> | </t> | |||
| <t> | <ol spacing="normal" type="1"><li> | |||
| Any character which is one of the atom-specials (see the Formal Syntax | Any character that is one of the atom-specials (see "Formal Syntax" | |||
| in <xref target='IMAP-ABNF'/>) will require that the mailbox name be re | in <xref target="IMAP-ABNF" format="default"/>) will require that the m | |||
| presented as a | ailbox name be represented as a | |||
| quoted string or literal. | quoted string or literal. | |||
| </t> | </li> | |||
| <li> | ||||
| <t> | ||||
| CTL and other non-graphic characters are difficult to represent | CTL and other non-graphic characters are difficult to represent | |||
| in a user interface and are best avoided. Servers MAY refuse to | in a user interface and are best avoided. Servers <bcp14>MAY</bcp14> re fuse to | |||
| create mailbox names containing Unicode CTL characters. | create mailbox names containing Unicode CTL characters. | |||
| </t> | </li> | |||
| <li> | ||||
| <t> | ||||
| Although the list-wildcard characters ("%" and "*") are valid | Although the list-wildcard characters ("%" and "*") are valid | |||
| in a mailbox name, it is difficult to use such mailbox names | in a mailbox name, it is difficult to use such mailbox names | |||
| with the LIST command due to the conflict with | with the LIST command due to the conflict with | |||
| wildcard interpretation. | wildcard interpretation. | |||
| </t> | </li> | |||
| <li> | ||||
| <t> | ||||
| Usually, a character (determined by the server implementation) | Usually, a character (determined by the server implementation) | |||
| is reserved to delimit levels of hierarchy. | is reserved to delimit levels of hierarchy. | |||
| </t> | </li> | |||
| <li> | ||||
| <t> | Two characters, "#" and "&", have meanings by convention and | |||
| Two characters, "#" and "&", have meanings by convention, and | ||||
| should be avoided except when used in that convention. See | should be avoided except when used in that convention. See | |||
| <xref target='namespace-convention'/> and <xref target='mailbox-i18n'/> | <xref target="namespace-convention" format="default"/> and <xref target | |||
| respectively. | ="mailbox-i18n" format="default"/>, respectively. | |||
| </t> | </li> | |||
| </ol> | ||||
| </list> | <section numbered="true" toc="default"> | |||
| </t> | <name>Mailbox Hierarchy Naming</name> | |||
| <t> | ||||
| <section title='Mailbox Hierarchy Naming'> | ||||
| <t> | ||||
| If it is desired to export hierarchical mailbox names, mailbox names | If it is desired to export hierarchical mailbox names, mailbox names | |||
| MUST be left-to-right hierarchical using a single character to | <bcp14>MUST</bcp14> be left-to-right hierarchical, using a single ASCII chara cter to | |||
| separate levels of hierarchy. The same hierarchy separator character | separate levels of hierarchy. The same hierarchy separator character | |||
| is used for all levels of hierarchy within a single name. | is used for all levels of hierarchy within a single name. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section numbered="true" toc="default"> | |||
| <name>Namespaces</name> | ||||
| <section title='Namespaces'> | <dl spacing="normal" newline="true"> | |||
| <dt>Personal Namespace:</dt><dd>A namespace that the server considers wi | ||||
| <t> | thin the | |||
| Personal Namespace: A namespace that the server considers within the | ||||
| personal scope of the authenticated user on a particular connection. | personal scope of the authenticated user on a particular connection. | |||
| Typically, only the authenticated user has access to mailboxes in | Typically, only the authenticated user has access to mailboxes in | |||
| their Personal Namespace. It is the part of the namespace that | their Personal Namespace. It is the part of the namespace that | |||
| belongs to the user that is allocated for mailboxes. If an INBOX | belongs to the user and is allocated for mailboxes. If an INBOX | |||
| exists for a user, it MUST appear within the user's personal | exists for a user, it <bcp14>MUST</bcp14> appear within the user's Perso | |||
| namespace. In the typical case, there SHOULD be only one Personal | nal | |||
| Namespace. In the typical case, there <bcp14>SHOULD</bcp14> be only one | ||||
| Personal | ||||
| Namespace per user on a server. | Namespace per user on a server. | |||
| </t> | </dd> | |||
| <dt> | ||||
| <t> | Other Users' Namespace:</dt><dd>A namespace that consists of mailboxes f | |||
| Other Users' Namespace: A namespace that consists of mailboxes from | rom | |||
| the Personal Namespaces of other users. To access mailboxes in the | the Personal Namespaces of other users. To access mailboxes in the | |||
| Other Users' Namespace, the currently authenticated user MUST be | Other Users' Namespace, the currently authenticated user <bcp14>MUST</bc p14> be | |||
| explicitly granted access rights. For example, it is common for a | explicitly granted access rights. For example, it is common for a | |||
| manager to grant to their administrative support staff access rights to their mailbox. | manager to grant to their administrative support staff access rights to their mailbox. | |||
| In the typical case, there SHOULD be only one Other Users' Namespace | In the typical case, there <bcp14>SHOULD</bcp14> be only one Other Users ' Namespace | |||
| per user on a server. | per user on a server. | |||
| </t> | </dd> | |||
| <dt> | ||||
| <t> | Shared Namespace:</dt><dd>A namespace that consists of mailboxes that ar | |||
| Shared Namespace: A namespace that consists of mailboxes that are | e | |||
| intended to be shared amongst users and do not exist within a user's | intended to be shared amongst users and do not exist within a user's | |||
| Personal Namespace. | Personal Namespace.</dd></dl> | |||
| </t> | <t> | |||
| The namespaces a server uses <bcp14>MAY</bcp14> differ on a per-user bas | ||||
| <t> | is. | |||
| The namespaces a server uses MAY differ on a per-user basis. | </t> | |||
| </t> | <section anchor="namespace-convention" numbered="true" toc="default"> | |||
| <name>Historic Mailbox Namespace Naming Convention</name> | ||||
| <section title='Historic Mailbox Namespace Naming Convention' anchor='na | <t> | |||
| mespace-convention'> | ||||
| <t> | ||||
| By convention, the first hierarchical element of any mailbox name | By convention, the first hierarchical element of any mailbox name | |||
| which begins with "#" identifies the "namespace" of the remainder of | that begins with "#" identifies the "namespace" of the remainder of | |||
| the name. This makes it possible to disambiguate between different | the name. This makes it possible to disambiguate between different | |||
| types of mailbox stores, each of which have their own namespaces. | types of mailbox stores, each of which have their own namespaces. | |||
| <list><t> | </t> | |||
| For example, implementations which offer access to USENET | <t indent="3"> | |||
| newsgroups MAY use the "#news" namespace to partition the | For example, implementations that offer access to USENET | |||
| newsgroups <bcp14>MAY</bcp14> use the "#news" namespace to partition the | ||||
| USENET newsgroup namespace from that of other mailboxes. | USENET newsgroup namespace from that of other mailboxes. | |||
| Thus, the comp.mail.misc newsgroup would have a mailbox | Thus, the comp.mail.misc newsgroup would have a mailbox | |||
| name of "#news.comp.mail.misc", and the name | name of "#news.comp.mail.misc", and the name | |||
| "comp.mail.misc" can refer to a different object (e.g., a | "comp.mail.misc" can refer to a different object (e.g., a | |||
| user's private mailbox). | user's private mailbox). | |||
| </t></list> | </t> | |||
| </t> | <t> | |||
| Namespaces that include the "#" character are not IMAP URL <xref target="RFC5 | ||||
| <t> | 092" format="default"/> friendly | |||
| Namespaces that include the "#" character are not IMAP URL <xref target="IMAP | and require the "#" character to be represented as %23 when within URLs. | |||
| -URL"/> friendly | As such, server implementors <bcp14>MAY</bcp14> instead consider using namesp | |||
| requiring the "#" character to be represented as %23 when within URLs. | ace prefixes that do not contain | |||
| As such, server implementors MAY instead consider using namespace prefixes th | ||||
| at do not contain | ||||
| the "#" character. | the "#" character. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section numbered="true" toc="default"> | |||
| <name>Common Namespace Models</name> | ||||
| <section title='Common namespace models'> | <t> | |||
| <t> | ||||
| The previous version of this protocol did not define a default server na mespace. | The previous version of this protocol did not define a default server na mespace. | |||
| Two common namespace models have evolved: | Two common namespace models have evolved: | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The "Personal Mailbox" model, in which the default namespace that is | The "Personal Mailbox" model, in which the default namespace that is | |||
| presented consists of only the user's personal mailboxes. To access | presented consists of only the user's personal mailboxes. To access | |||
| shared mailboxes, the user must use an escape mechanism to reach | shared mailboxes, the user must use an escape mechanism to reach | |||
| another namespace. | another namespace. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The "Complete Hierarchy" model, in which the default namespace that | The "Complete Hierarchy" model, in which the default namespace that | |||
| is presented includes the user's personal mailboxes along with any | is presented includes the user's personal mailboxes along with any | |||
| other mailboxes they have access to. | other mailboxes they have access to. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| </section> | <name>Mailbox Size and Message Status Updates</name> | |||
| <t> | ||||
| <section title='Mailbox Size and Message Status Updates'> | ||||
| <t> | ||||
| At any time, a server can send data that the client did not request. | At any time, a server can send data that the client did not request. | |||
| Sometimes, such behavior is required by this specification and/or extensions. | Sometimes, such behavior is required by this specification and/or extensions. | |||
| For example, agents other than | For example, agents other than | |||
| the server MAY add messages to the mailbox (e.g., new message | the server may add messages to the mailbox (e.g., new message delivery); | |||
| delivery), change the flags of the messages in the mailbox (e.g., | change the flags of the messages in the mailbox (e.g., | |||
| simultaneous access to the same mailbox by multiple agents), or even | simultaneous access to the same mailbox by multiple agents); or even | |||
| remove messages from the mailbox. A server MUST send mailbox size | remove messages from the mailbox. A server <bcp14>MUST</bcp14> send mailbox | |||
| size | ||||
| updates automatically if a mailbox size change is observed during the | updates automatically if a mailbox size change is observed during the | |||
| processing of a command. A server SHOULD send message flag updates | processing of a command. A server <bcp14>SHOULD</bcp14> send message flag up dates | |||
| automatically, without requiring the client to request such updates | automatically, without requiring the client to request such updates | |||
| explicitly. | explicitly. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| Special rules exist for server notification of a client about the | Special rules exist for server notification of a client about the | |||
| removal of messages to prevent synchronization errors; see the | removal of messages to prevent synchronization errors; see the | |||
| description of the EXPUNGE response (<xref target='expunge-response'/>) for m ore detail. In particular, | description of the EXPUNGE response (<xref target="expunge-response" format=" default"/>) for more detail. In particular, | |||
| it is NOT permitted to send an EXISTS response that would reduce the | it is NOT permitted to send an EXISTS response that would reduce the | |||
| number of messages in the mailbox; only the EXPUNGE response can do | number of messages in the mailbox; only the EXPUNGE response can do | |||
| this. | this. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| Regardless of what implementation decisions a client makes on | Regardless of what implementation decisions a client makes on | |||
| remembering data from the server, a client implementation MUST remember | remembering data from the server, a client implementation <bcp14>MUST</bcp14> | |||
| mailbox size updates. It MUST NOT assume that any command after the | remember | |||
| mailbox size updates. It <bcp14>MUST NOT</bcp14> assume that any command aft | ||||
| er the | ||||
| initial mailbox selection will return the size of the mailbox. | initial mailbox selection will return the size of the mailbox. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section numbered="true" toc="default"> | |||
| <name>Response When No Command in Progress</name> | ||||
| <section title='Response when no Command in Progress'> | <t> | |||
| <t> | ||||
| Server implementations are permitted to send an untagged response | Server implementations are permitted to send an untagged response | |||
| (except for EXPUNGE) while there is no command in progress. Server | (except for EXPUNGE) while there is no command in progress. Server | |||
| implementations that send such responses MUST deal with flow control | implementations that send such responses <bcp14>MUST</bcp14> deal with flow c | |||
| considerations. Specifically, they MUST either (1) verify that the | ontrol | |||
| considerations. Specifically, they <bcp14>MUST</bcp14> either (1) verify tha | ||||
| t the | ||||
| size of the data does not exceed the underlying transport's available | size of the data does not exceed the underlying transport's available | |||
| window size, or (2) use non-blocking writes. | window size or (2) use non-blocking writes. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section numbered="true" toc="default"> | |||
| <name>Autologout Timer</name> | ||||
| <section title='Autologout Timer'> | <t> | |||
| <t> | ||||
| If a server has an inactivity autologout timer that applies to | If a server has an inactivity autologout timer that applies to | |||
| sessions after authentication, the duration of that | sessions after authentication, the duration of that | |||
| timer MUST be at least 30 minutes. The receipt of any command from | timer <bcp14>MUST</bcp14> be at least 30 minutes. The receipt of any command from | |||
| the client during that interval resets the | the client during that interval resets the | |||
| autologout timer. | autologout timer. | |||
| </t> | </t> | |||
| <t>Note that this specification doesn't have any restrictions | ||||
| <t>Note that this specification doesn't have any restrictions | on an autologout timer used before successful client authentication. | |||
| on autologout timer used before successful client authentication. | In particular, servers are allowed to use a shortened pre-authentication | |||
| In particular, servers are allowed to use shortened pre-authentication | timer to protect themselves from Denial-of-Service attacks.</t> | |||
| timer to protect themselves from Denial of Service attacks.</t> | </section> | |||
| <section anchor="pipelining" numbered="true" toc="default"> | ||||
| </section> | <name>Multiple Commands in Progress (Command Pipelining)</name> | |||
| <t> | ||||
| <section title='Multiple Commands in Progress (Command Pipelining)' anchor='p | The client <bcp14>MAY</bcp14> send another command without waiting for the | |||
| ipelining'> | ||||
| <t> | ||||
| The client MAY send another command without waiting for the | ||||
| completion result response of a command, subject to ambiguity rules | completion result response of a command, subject to ambiguity rules | |||
| (see below) and flow control constraints on the underlying data | (see below) and flow control constraints on the underlying data | |||
| stream. Similarly, a server MAY begin processing another command | stream. Similarly, a server <bcp14>MAY</bcp14> begin processing another comm and | |||
| before processing the current command to completion, subject to | before processing the current command to completion, subject to | |||
| ambiguity rules. However, any command continuation request responses | ambiguity rules. However, any command continuation request responses | |||
| and command continuations MUST be negotiated before any subsequent | and command continuations <bcp14>MUST</bcp14> be negotiated before any subseq uent | |||
| command is initiated. | command is initiated. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The exception is if an ambiguity would result because of a command | The exception is if an ambiguity would result because of a command | |||
| that would affect the results of other commands. | that would affect the results of other commands. | |||
| <!--///Alexey: I think the following MUST NOT is nonsense and should be remov | If the server detects a possible ambiguity, it <bcp14>MUST</bcp14> execute co | |||
| ed. | mmands | |||
| The client can always pipeline several commands, because the server is requir | ||||
| ed | ||||
| to process them in order.--> | ||||
| <!-- | ||||
| Clients MUST NOT | ||||
| send multiple commands without waiting if an ambiguity would result. | ||||
| If the server detects a possible ambiguity, it MUST execute commands | ||||
| to completion in the order given by the client. | to completion in the order given by the client. | |||
| </t> | </t> | |||
| <!--///Alexey: This is not a great example: if the client wants to use | ||||
| result of one command to generate another command, it is obvious it can't | ||||
| generate and pipeline both commands at the same time. However, if the client | ||||
| wants to override flags unconditionally, it can clearly do that. | ||||
| This also contadicts one of the examples below:--> | ||||
| <t> | <t> | |||
| The most obvious example of ambiguity is when a command would affect | The most obvious example of ambiguity is when a command would affect | |||
| the results of another command, e.g., a FETCH of a message's flags | the results of another command. One example is a FETCH that would cause \See | |||
| and a STORE of that same message's flags. | n flags | |||
| </t> | to be set and a SEARCH UNSEEN command. | |||
| </t> | ||||
| <t> | <t> | |||
| A non-obvious ambiguity occurs with commands that permit an untagged | A non-obvious ambiguity occurs with commands that permit an untagged | |||
| EXPUNGE response (commands other than FETCH, STORE, and SEARCH), | EXPUNGE response (commands other than FETCH, STORE, and SEARCH), | |||
| since an untagged EXPUNGE response can invalidate sequence numbers in | since an untagged EXPUNGE response can invalidate sequence numbers in | |||
| a subsequent command. This is not a problem for FETCH, STORE, or | a subsequent command. This is not a problem for FETCH, STORE, or | |||
| SEARCH commands because servers are prohibited from sending EXPUNGE | SEARCH commands because servers are prohibited from sending EXPUNGE | |||
| responses while any of those commands are in progress. Therefore, if | responses while any of those commands are in progress. Therefore, if | |||
| the client sends any command other than FETCH, STORE, or SEARCH, it | the client sends any command other than FETCH, STORE, or SEARCH, it | |||
| MUST wait for the completion result response before sending a command | <bcp14>MUST</bcp14> wait for the completion result response before sending a command | |||
| with message sequence numbers. | with message sequence numbers. | |||
| <list><t> | </t> | |||
| <t indent="3"> | ||||
| Note: EXPUNGE responses are permitted while UID FETCH, | Note: EXPUNGE responses are permitted while UID FETCH, | |||
| UID STORE, and UID SEARCH are in progress. If the client | UID STORE, and UID SEARCH are in progress. If the client | |||
| sends a UID command, it MUST wait for a completion result | sends a UID command, it <bcp14>MUST</bcp14> wait for a completion result | |||
| response before sending a command which uses message | response before sending a command that uses message | |||
| sequence numbers (this may include UID SEARCH). Any | sequence numbers (this may include UID SEARCH). Any | |||
| message sequence numbers in an argument to UID SEARCH | message sequence numbers in an argument to UID SEARCH | |||
| are associated with messages prior to the effect of any | are associated with messages prior to the effect of any | |||
| untagged EXPUNGE returned by the UID SEARCH. | untagged EXPUNGE responses returned by the UID SEARCH. | |||
| </t></list> | </t> | |||
| </t> | <t> | |||
| <t> | ||||
| For example, the following non-waiting command sequences are invalid: | For example, the following non-waiting command sequences are invalid: | |||
| <list> | </t> | |||
| <t>FETCH + NOOP + STORE</t> | <ul empty="true" spacing="normal"> | |||
| <t>STORE + COPY + FETCH</t> | <li>FETCH + NOOP + STORE</li> | |||
| <t>COPY + COPY</t> | <li>STORE + COPY + FETCH</li> | |||
| </list> | <li>COPY + COPY</li> | |||
| </t> | </ul> | |||
| <t> | ||||
| <t> | ||||
| The following are examples of valid non-waiting command sequences: | The following are examples of valid non-waiting command sequences: | |||
| </t> | ||||
| <ul empty="true" spacing="normal"> | ||||
| <li>FETCH + STORE + SEARCH + NOOP</li> | ||||
| <li>STORE + COPY + EXPUNGE</li> | ||||
| </ul> | ||||
| <list> | <t>UID SEARCH + UID SEARCH may be valid or invalid as a non-waiting | |||
| <t>FETCH + STORE + SEARCH + NOOP</t> | ||||
| <t>STORE + COPY + EXPUNGE</t> | ||||
| <t>UID SEARCH + UID SEARCH may be valid or invalid as a non-waiting | ||||
| command sequence, depending upon whether or not the second UID | command sequence, depending upon whether or not the second UID | |||
| SEARCH contains message sequence numbers. | SEARCH contains message sequence numbers.</t> | |||
| </t> | ||||
| </list> | ||||
| </t> | ||||
| <t> | <t> | |||
| Use of SEARCH result variable (see <xref target="search-save"/>) creates | Use of a SEARCH result variable (see <xref target="search-save" format="defau | |||
| direct dependency between two commands. See <xref target='search-save-pipelin | lt"/>) creates | |||
| ing'/> | direct dependency between two commands. See <xref target="search-save-pipelin | |||
| ing" format="default"/> | ||||
| for more considerations about pipelining such dependent commands. | for more considerations about pipelining such dependent commands. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default" anchor="client_commands"> | ||||
| </section> | <name>Client Commands</name> | |||
| <t> | ||||
| <section title='Client Commands'> | ||||
| <t> | ||||
| IMAP4rev2 commands are described in this section. Commands are | IMAP4rev2 commands are described in this section. Commands are | |||
| organized by the state in which the command is permitted. Commands | organized by the state in which the command is permitted. Commands | |||
| which are permitted in multiple states are listed in the minimum | that are permitted in multiple states are listed in the minimum | |||
| permitted state (for example, commands valid in authenticated and | permitted state (for example, commands valid in authenticated and | |||
| selected state are listed in the authenticated state commands). | selected states are listed in the authenticated state commands). | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| Command arguments, identified by "Arguments:" in the command | Command arguments, identified by "Arguments:" in the command | |||
| descriptions below, are described by function, not by syntax. The | descriptions below, are described by function, not by syntax. The | |||
| precise syntax of command arguments is described in the Formal Syntax | precise syntax of command arguments is described in "Formal Syntax" | |||
| (<xref target='IMAP-ABNF'/>). | (<xref target="IMAP-ABNF" format="default"/>). | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| Some commands cause specific server responses to be returned; these | Some commands cause specific server responses to be returned; these | |||
| are identified by "Responses:" in the command descriptions below. | are identified by "Responses:" in the command descriptions below. | |||
| See the response descriptions in the Responses section (<xref target='server- | See the response descriptions in "Responses" (<xref target="server-responses" | |||
| responses'/>) for | format="default"/>) for | |||
| information on these responses, and the Formal Syntax (<xref target='IMAP-ABN | information on these responses and in "Formal Syntax" (<xref target="IMAP-ABN | |||
| F'/>) for the | F" format="default"/>) for the | |||
| precise syntax of these responses. It is possible for server data to | precise syntax of these responses. It is possible for server data to | |||
| be transmitted as a result of any command. Thus, commands that do | be transmitted as a result of any command. Thus, commands that do | |||
| not specifically require server data specify "no specific responses | not specifically require server data specify "no specific responses | |||
| for this command" instead of "none". | for this command" instead of "none". | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The "Result:" in the command description refers to the possible | The "Result:" in the command description refers to the possible | |||
| tagged status responses to a command, and any special interpretation | tagged status responses to a command and any special interpretation | |||
| of these status responses. | of these status responses. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The state of a connection is only changed by successful commands | The state of a connection is only changed by successful commands | |||
| which are documented as changing state. A rejected command (BAD | that are documented as changing state. A rejected command (BAD | |||
| response) never changes the state of the connection or of the | response) never changes the state of the connection or of the | |||
| selected mailbox. A failed command (NO response) generally does not | selected mailbox. A failed command (NO response) generally does not | |||
| change the state of the connection or of the selected mailbox; the | change the state of the connection or of the selected mailbox, with the | |||
| exception being the SELECT and EXAMINE commands. | exception of the SELECT and EXAMINE commands. | |||
| </t> | </t> | |||
| <section numbered="true" toc="default"> | ||||
| <section title='Client Commands - Any State'> | <name>Client Commands - Any State</name> | |||
| <t> | ||||
| <t> | ||||
| The following commands are valid in any state: CAPABILITY, NOOP, and | The following commands are valid in any state: CAPABILITY, NOOP, and | |||
| LOGOUT. | LOGOUT. | |||
| </t> | </t> | |||
| <section anchor="capability-command" numbered="true" toc="default"> | ||||
| <section title='CAPABILITY Command' anchor="capability-command"> | <name>CAPABILITY Command</name> | |||
| <iref item='CAPABILITY (command)'/> | ||||
| <t> | ||||
| <list style='hanging' hangIndent='12'> | ||||
| <t hangText='Arguments:'>none</t> | ||||
| <t hangText='Responses:'>REQUIRED untagged response: CAPABILITY</t> | ||||
| <t hangText='Result:'>OK - capability completed<vspace/> | ||||
| BAD - arguments invalid</t> | ||||
| </list> | ||||
| </t> | ||||
| <t> | <iref item="CAPABILITY (command)" subitem="" primary="false"/> | |||
| <dl newline="false" spacing="normal" indent="14"> | ||||
| <dt>Arguments:</dt> | ||||
| <dd>none</dd> | ||||
| <dt>Responses:</dt> | ||||
| <dd> | ||||
| <dl spacing="compact"> | ||||
| <dt><bcp14>REQUIRED</bcp14> untagged response:</dt><dd>CAPABILITY</ | ||||
| dd> | ||||
| </dl> | ||||
| </dd> | ||||
| <dt>Result:</dt> | ||||
| <dd> | ||||
| <dl spacing="compact"> | ||||
| <dt>OK -</dt><dd>capability completed</dd> | ||||
| <dt>BAD -</dt><dd>arguments invalid</dd> | ||||
| </dl> | ||||
| </dd> | ||||
| </dl> | ||||
| <t> | ||||
| The CAPABILITY command requests a listing of capabilities | The CAPABILITY command requests a listing of capabilities | |||
| (e.g. extensions and/or modifications of server behaviour) that the | (e.g., extensions and/or modifications of server behavior) that the | |||
| server supports. The server MUST send a single untagged | server supports. The server <bcp14>MUST</bcp14> send a single untagged | |||
| CAPABILITY response with "IMAP4rev2" as one of the listed | CAPABILITY response with "IMAP4rev2" as one of the listed | |||
| capabilities before the (tagged) OK response. | capabilities before the (tagged) OK response. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | A capability name that begins with "AUTH=" indicates that the | |||
| A capability name which begins with "AUTH=" indicates that the | server supports that particular authentication mechanism as defined in the | |||
| server supports that particular authentication mechanism as defined in <xr | Simple Authentication and Security Layer (SASL) <xref target="RFC4422" format=" | |||
| ef target='SASL'/>. | default"/>. | |||
| All such names are, by definition, part of this specification. | All such names are, by definition, part of this specification. | |||
| <!--///Alexey: If the following text is needed, it is probably should be don | </t> | |||
| e in SASL update? | <t> | |||
| For example, the authorization capability for an experimental | ||||
| "blurdybloop" authenticator would be "AUTH=XBLURDYBLOOP" and not | ||||
| "XAUTH=BLURDYBLOOP" or "XAUTH=XBLURDYBLOOP". | ||||
| --> | ||||
| </t> | ||||
| <t> | ||||
| Other capability names refer to extensions, revisions, or | Other capability names refer to extensions, revisions, or | |||
| amendments to this specification. See the documentation of the | amendments to this specification. See the documentation of the | |||
| CAPABILITY response in <xref target='capability-resp'/> for additional inf ormation. | CAPABILITY response in <xref target="capability-resp" format="default"/> f or additional information. | |||
| If IMAP4rev1 capability is not advertised, no capabilities, beyond the bas e IMAP4rev2 set | If IMAP4rev1 capability is not advertised, no capabilities, beyond the bas e IMAP4rev2 set | |||
| defined in this specification, are enabled without explicit client action to invoke the capability. | defined in this specification, are enabled without explicit client action to invoke the capability. | |||
| If both IMAP4rev1 and IMAP4rev2 capabilities are advertised, no capabiliti es, | If both IMAP4rev1 and IMAP4rev2 capabilities are advertised, no capabiliti es, | |||
| beyond the base IMAP4rev1 set specified in RFC 3501, are enabled without e xplicit | beyond the base IMAP4rev1 set specified in <xref target="RFC3501" format=" default"/>, are enabled without explicit | |||
| client action to invoke the capability. | client action to invoke the capability. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Client and server implementations <bcp14>MUST</bcp14> implement the STARTTL | |||
| Client and server implementations MUST implement the STARTTLS <xref target= | S (<xref target="STARTTLS" format="default"/>) and | |||
| 'STARTTLS'/> and | LOGINDISABLED capabilities on cleartext ports. Client and server implementa | |||
| LOGINDISABLED capabilities on cleartext ports. Client and server implementa | tions <bcp14>MUST</bcp14> | |||
| tions MUST | also implement AUTH=PLAIN (described in <xref target="RFC4616" format="defa | |||
| also implement AUTH=PLAIN (described in <xref target='PLAIN'/>) | ult"/>) | |||
| capability on both cleartext and Implicit TLS ports. | capability on both cleartext and Implicit TLS ports. | |||
| See the Security Considerations (<xref target='sec-cons'/>) for important i | See the Security Considerations (<xref target="sec-cons" format="default"/> | |||
| nformation. | ) for important information. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Unless otherwise specified, all registered extensions to IMAP4rev1 | |||
| Unless specified otherwise, all registered extensions to IMAP4rev1 | ||||
| are also valid extensions to IMAP4rev2. | are also valid extensions to IMAP4rev2. | |||
| </t> | </t> | |||
| <!-- | ||||
| <t> | ||||
| See the section entitled "Client Commands - Experimental/Expansion" | ||||
| for information about the form of site or | ||||
| implementation-specific capabilities. | ||||
| </t> | ||||
| --> | ||||
| <figure><artwork> | ||||
| Example: C: abcd CAPABILITY | ||||
| S: * CAPABILITY IMAP4rev2 STARTTLS AUTH=GSSAPI | ||||
| LOGINDISABLED | ||||
| S: abcd OK CAPABILITY completed | ||||
| C: efgh STARTTLS | ||||
| S: efgh OK STARTLS completed | ||||
| <TLS negotiation, further commands are under [TLS] layer> | ||||
| C: ijkl CAPABILITY | ||||
| S: * CAPABILITY IMAP4rev2 AUTH=GSSAPI AUTH=PLAIN | ||||
| S: ijkl OK CAPABILITY completed | ||||
| </artwork></figure> | ||||
| </section> | ||||
| <section title='NOOP Command'> | ||||
| <iref item='NOOP (command)'/> | ||||
| <t> | ||||
| <list style='hanging' hangIndent='12'> | ||||
| <t hangText='Arguments:'>none</t> | ||||
| <t hangText='Responses:'>no specific responses for this command (but see belo | ||||
| w)</t> | ||||
| <t hangText='Result:'>OK - noop completed<vspace/> | ||||
| BAD - command unknown or arguments invalid</t> | ||||
| </list> | ||||
| </t> | ||||
| <t> | <t>Example:</t> | |||
| <sourcecode type=""> | ||||
| C: abcd CAPABILITY | ||||
| S: * CAPABILITY IMAP4rev2 STARTTLS AUTH=GSSAPI | ||||
| LOGINDISABLED | ||||
| S: abcd OK CAPABILITY completed | ||||
| C: efgh STARTTLS | ||||
| S: efgh OK STARTTLS completed | ||||
| <TLS negotiation, further commands are under TLS layer> | ||||
| C: ijkl CAPABILITY | ||||
| S: * CAPABILITY IMAP4rev2 AUTH=GSSAPI AUTH=PLAIN | ||||
| S: ijkl OK CAPABILITY completed | ||||
| </sourcecode> | ||||
| </section> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>NOOP Command</name> | ||||
| <iref item="NOOP (command)" subitem="" primary="false"/> | ||||
| <dl newline="false" spacing="normal" indent="14"> | ||||
| <dt>Arguments:</dt> | ||||
| <dd>none</dd> | ||||
| <dt>Responses:</dt> | ||||
| <dd>no specific responses for this command (but see below)</dd> | ||||
| <dt>Result:</dt> | ||||
| <dd> | ||||
| <dl spacing="compact"> | ||||
| <dt>OK -</dt><dd>noop completed</dd> | ||||
| <dt> | ||||
| BAD -</dt><dd>command unknown or arguments invalid</dd> | ||||
| </dl> | ||||
| </dd> | ||||
| </dl> | ||||
| <t> | ||||
| The NOOP command always succeeds. It does nothing. | The NOOP command always succeeds. It does nothing. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| Since any command can return a status update as untagged data, the | Since any command can return a status update as untagged data, the | |||
| NOOP command can be used as a periodic poll for new messages or | NOOP command can be used as a periodic poll for new messages or | |||
| message status updates during a period of inactivity (the IDLE | message status updates during a period of inactivity (the IDLE | |||
| command <xref target="idle"/> should be used instead of NOOP if real-time updates | command; see <xref target="idle" format="default"/>) should be used instea d of NOOP if real-time updates | |||
| to mailbox state are desirable). The NOOP command can also be used | to mailbox state are desirable). The NOOP command can also be used | |||
| to reset any inactivity autologout timer on the server. | to reset any inactivity autologout timer on the server. | |||
| </t> | </t> | |||
| <t>Example:</t> | ||||
| <figure><artwork> | <sourcecode type=""> | |||
| Example: C: a002 NOOP | C: a002 NOOP | |||
| S: a002 OK NOOP completed | S: a002 OK NOOP completed | |||
| . . . | . . . | |||
| C: a047 NOOP | C: a047 NOOP | |||
| S: * 22 EXPUNGE | S: * 22 EXPUNGE | |||
| S: * 23 EXISTS | S: * 23 EXISTS | |||
| S: * 14 FETCH (UID 1305 FLAGS (\Seen \Deleted)) | S: * 14 FETCH (UID 1305 FLAGS (\Seen \Deleted)) | |||
| S: a047 OK NOOP completed | S: a047 OK NOOP completed | |||
| </artwork></figure> | </sourcecode> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title='LOGOUT Command'> | <name>LOGOUT Command</name> | |||
| <iref item='LOGOUT (command)'/> | <iref item="LOGOUT (command)" subitem="" primary="false"/> | |||
| <dl newline="false" spacing="normal" indent="14"> | ||||
| <t> | <dt>Arguments:</dt> | |||
| <list style='hanging' hangIndent='12'> | <dd>none</dd> | |||
| <t hangText='Arguments:'>none</t> | <dt>Responses:</dt> | |||
| <dd> | ||||
| <t hangText='Responses:'>REQUIRED untagged response: BYE</t> | <dl spacing="compact"> | |||
| <dt><bcp14>REQUIRED</bcp14> untagged response:</dt><dd>BYE</dd> | ||||
| <t hangText='Result:'>OK - logout completed<vspace/> | </dl> | |||
| BAD - command unknown or arguments invalid</t> | </dd> | |||
| </list> | <dt>Result:</dt> | |||
| </t> | <dd> | |||
| <dl spacing="compact"> | ||||
| <t> | <dt>OK -</dt><dd>logout completed</dd> | |||
| <dt> | ||||
| BAD -</dt><dd>command unknown or arguments invalid</dd> | ||||
| </dl> | ||||
| </dd> | ||||
| </dl> | ||||
| <t> | ||||
| The LOGOUT command informs the server that the client is done with | The LOGOUT command informs the server that the client is done with | |||
| the connection. The server MUST send a BYE untagged response | the connection. The server <bcp14>MUST</bcp14> send a BYE untagged respon se | |||
| before the (tagged) OK response, and then close the network | before the (tagged) OK response, and then close the network | |||
| connection. | connection. | |||
| </t> | </t> | |||
| <t>Example:</t> | ||||
| <figure><artwork> | <sourcecode type=""> | |||
| Example: C: A023 LOGOUT | C: A023 LOGOUT | |||
| S: * BYE IMAP4rev2 Server logging out | S: * BYE IMAP4rev2 Server logging out | |||
| S: A023 OK LOGOUT completed | S: A023 OK LOGOUT completed | |||
| (Server and client then close the connection) | (Server and client then close the connection) | |||
| </artwork></figure> | </sourcecode> | |||
| </section> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| </section> | <name>Client Commands - Not Authenticated State</name> | |||
| <t> | ||||
| <section title='Client Commands - Not Authenticated State'> | ||||
| <t> | ||||
| In the not authenticated state, the AUTHENTICATE or LOGIN command | In the not authenticated state, the AUTHENTICATE or LOGIN command | |||
| establishes authentication and enters the authenticated state. The | establishes authentication and enters the authenticated state. The | |||
| AUTHENTICATE command provides a general mechanism for a variety of | AUTHENTICATE command provides a general mechanism for a variety of | |||
| authentication techniques, privacy protection, and integrity | authentication techniques, privacy protection, and integrity | |||
| checking; whereas the LOGIN command uses a traditional user name and | checking, whereas the LOGIN command uses a conventional user name and | |||
| plaintext password pair and has no means of establishing privacy | plaintext password pair and has no means of establishing privacy | |||
| protection or integrity checking. | protection or integrity checking. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The STARTTLS command is an alternative form of establishing session | The STARTTLS command is an alternative form of establishing session | |||
| privacy protection and integrity checking, but does not by itself establish | privacy protection and integrity checking but does not by itself establish | |||
| authentication or enter the authenticated state. | authentication or enter the authenticated state. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Server implementations <bcp14>MAY</bcp14> allow access to certain mailboxes w | |||
| Server implementations MAY allow access to certain mailboxes without | ithout | |||
| establishing authentication. This can be done by means of the | establishing authentication. | |||
| ANONYMOUS <xref target='SASL'/> authenticator described in <xref target='ANON | This can be done by means of the | |||
| YMOUS'/>. An older | ANONYMOUS <xref target="RFC4422" format="default"/> authenticator described i | |||
| n <xref target="RFC4505" format="default"/>. An older | ||||
| convention is a LOGIN command using the userid "anonymous"; in this | convention is a LOGIN command using the userid "anonymous"; in this | |||
| case, a password is required although the server may choose to accept | case, a password is required although the server may choose to accept | |||
| any password. The restrictions placed on anonymous users are | any password. The restrictions placed on anonymous users are | |||
| implementation-dependent. | implementation dependent. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| Once authenticated (including as anonymous), it is not possible to | Once authenticated (including as anonymous), it is not possible to | |||
| re-enter not authenticated state. | re-enter not authenticated state. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| In addition to the universal commands (CAPABILITY, NOOP, and LOGOUT), | In addition to the universal commands (CAPABILITY, NOOP, and LOGOUT), | |||
| the following commands are valid in the not authenticated state: | the following commands are valid in the not authenticated state: | |||
| STARTTLS, AUTHENTICATE and LOGIN. See the Security Considerations | STARTTLS, AUTHENTICATE, and LOGIN. See the Security Considerations | |||
| (<xref target='sec-cons'/>) for important information about these commands. | (<xref target="sec-cons" format="default"/>) for important information about | |||
| </t> | these commands. | |||
| </t> | ||||
| <section title='STARTTLS Command' anchor='STARTTLS'> | <section anchor="STARTTLS" numbered="true" toc="default"> | |||
| <iref item='STARTTLS (command)'/> | <name>STARTTLS Command</name> | |||
| <iref item="STARTTLS (command)" subitem="" primary="false"/> | ||||
| <t> | <dl newline="false" spacing="normal" indent="14"> | |||
| <list style='hanging' hangIndent='12'> | <dt>Arguments:</dt> | |||
| <t hangText='Arguments:'>none</t> | <dd>none</dd> | |||
| <dt>Responses:</dt> | ||||
| <t hangText='Responses:'>no specific response for this command</t> | <dd>no specific response for this command</dd> | |||
| <dt>Result:</dt> | ||||
| <t hangText='Result:'>OK - starttls completed, begin TLS negotiation<vspace/> | <dd> | |||
| NO - TLS negotiation can't be initiated, due to server configurat | <dl spacing="compact"> | |||
| ion error<vspace/> | <dt>OK -</dt><dd>starttls completed, begin TLS negotiation</dd> | |||
| BAD - STARTTLS received after a successful TLS negotiation or arg | <dt>NO -</dt><dd>TLS negotiation can't be initiated, due to server | |||
| uments invalid</t> | configuration error</dd> | |||
| </list> | <dt>BAD -</dt><dd>STARTTLS received after a successful TLS negotia | |||
| </t> | tion or arguments invalid</dd> | |||
| </dl> | ||||
| <t> | </dd> | |||
| Note that STARTTLS command is available only on cleartext ports. | </dl> | |||
| The server MUST always respond with tagged BAD response when STARTTLS comma | ||||
| nd is received on Implicit TLS port. | ||||
| </t> | ||||
| <t> | ||||
| A <xref target="TLS-1.3">TLS</xref> negotiation begins immediately after t | ||||
| he CRLF at the end | ||||
| of the tagged OK response from the server. Once a client issues a | ||||
| STARTTLS command, it MUST NOT issue further commands until a | ||||
| server response is seen and the TLS negotiation is complete. | ||||
| Some past server implementation incorrectly implemented STARTTLS processin | ||||
| g and | ||||
| are known to contain STARTTLS plaintext command injection vulnerability <x | ||||
| ref target='CERT-555316'/>. | ||||
| In order to avoid this vulnerability, server implementations MUST do one o | ||||
| f the following | ||||
| If any data is received in the same TCP buffer after the CRLF that starts | ||||
| the STARTTLS command: | ||||
| <list style='numbers'> | ||||
| <t> | <t> | |||
| Extra data from the TCP buffer is interpreted as beginning of the TLS | Note that the STARTTLS command is available only on cleartext ports. | |||
| handshake. | The server <bcp14>MUST</bcp14> always respond with a tagged BAD response wh | |||
| (If the data is in cleartext, this will result in the TLS handshake fa | en the STARTTLS command is received on an Implicit TLS port. | |||
| iling.) | ||||
| </t> | </t> | |||
| <t> | <t> | |||
| A <xref target="RFC8446" format="default">TLS</xref> negotiation begins im | ||||
| mediately after the CRLF at the end | ||||
| of the tagged OK response from the server. Once a client issues a | ||||
| STARTTLS command, it <bcp14>MUST NOT</bcp14> issue further commands until | ||||
| a | ||||
| server response is seen and the TLS negotiation is complete. | ||||
| Some past server implementations incorrectly implemented STARTTLS processi | ||||
| ng and | ||||
| are known to contain STARTTLS plaintext command injection vulnerability <x | ||||
| ref target="CERT-555316" format="default"/>. | ||||
| In order to avoid this vulnerability, server implementations <bcp14>MUST</ | ||||
| bcp14> do one of the following | ||||
| if any data is received in the same TCP buffer after the CRLF that starts | ||||
| the STARTTLS command: | ||||
| </t> | ||||
| <ol spacing="normal" type="1"><li> | ||||
| Extra data from the TCP buffer is interpreted as the beginning of the | ||||
| TLS handshake. | ||||
| (If the data is in cleartext, this will result in the TLS handshake fa | ||||
| iling.) | ||||
| </li> | ||||
| <li> | ||||
| Extra data from the TCP buffer is thrown away. | Extra data from the TCP buffer is thrown away. | |||
| </li> | ||||
| </ol> | ||||
| <t> | ||||
| Note that the first option is friendlier to clients that pipeline the begin | ||||
| ning of | ||||
| the STARTTLS command with TLS handshake data. | ||||
| </t> | </t> | |||
| <t> | ||||
| </list> | After successful TLS negotiation, the server remains in the non-authentica | |||
| Note that the first option is friendlier to clients that pipeline beginning | ted state, | |||
| of | ||||
| STARTTLS command with TLS handshake data. | ||||
| </t> | ||||
| <t> | ||||
| After successful TLS negotiation the server remains in the non-authenticat | ||||
| ed state, | ||||
| even if client credentials are supplied during the TLS negotiation. This does | even if client credentials are supplied during the TLS negotiation. This does | |||
| not preclude an authentication mechanism such as EXTERNAL (defined | not preclude an authentication mechanism such as EXTERNAL (defined | |||
| in <xref target='SASL'/>) from using client identity determined by the TLS | in <xref target="RFC4422" format="default"/>) from using client identity d etermined by the TLS | |||
| negotiation. | negotiation. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Once TLS has been started, the client <bcp14>MUST</bcp14> discard cached | |||
| Once TLS has been started, the client MUST discard cached | information about server capabilities and <bcp14>SHOULD</bcp14> reissue th | |||
| information about server capabilities and SHOULD re-issue the | e | |||
| CAPABILITY command. This is necessary to protect against man-in- | CAPABILITY command. This is necessary to protect against active attacks | |||
| the-middle attacks which alter the capabilities list prior to | that alter the capabilities list prior to | |||
| STARTTLS. The server MAY advertise different capabilities, and | STARTTLS. The server <bcp14>MAY</bcp14> advertise different capabilities | |||
| in particular SHOULD NOT advertise the STARTTLS capability, after | and, | |||
| in particular, <bcp14>SHOULD NOT</bcp14> advertise the STARTTLS capability | ||||
| , after | ||||
| a successful STARTTLS command. | a successful STARTTLS command. | |||
| </t> | </t> | |||
| <figure><artwork> | ||||
| Example: C: a001 CAPABILITY | ||||
| S: * CAPABILITY IMAP4rev2 STARTTLS LOGINDISABLED | ||||
| S: a001 OK CAPABILITY completed | ||||
| C: a002 STARTTLS | ||||
| S: a002 OK Begin TLS negotiation now | ||||
| <TLS negotiation, further commands are under TLS layer> | ||||
| C: a003 CAPABILITY | ||||
| S: * CAPABILITY IMAP4rev2 AUTH=PLAIN | ||||
| S: a003 OK CAPABILITY completed | ||||
| C: a004 AUTHENTICATE PLAIN dGVzdAB0ZXN0AHRlc3Q= | ||||
| S: a004 OK Success (tls protection) | ||||
| </artwork></figure> | ||||
| </section> | ||||
| <section title='AUTHENTICATE Command' anchor='authenticate'> | ||||
| <iref item='AUTHENTICATE (command)'/> | ||||
| <t> | ||||
| <list style='hanging' hangIndent='12'> | ||||
| <t hangText='Arguments:'>SASL authentication mechanism name<vspace/> | ||||
| OPTIONAL initial response</t> | ||||
| <t hangText='Responses:'>continuation data can be requested</t> | <t>Example:</t> | |||
| <sourcecode type=""> | ||||
| C: a001 CAPABILITY | ||||
| S: * CAPABILITY IMAP4rev2 STARTTLS LOGINDISABLED | ||||
| S: a001 OK CAPABILITY completed | ||||
| C: a002 STARTTLS | ||||
| S: a002 OK Begin TLS negotiation now | ||||
| <TLS negotiation, further commands are under TLS layer> | ||||
| C: a003 CAPABILITY | ||||
| S: * CAPABILITY IMAP4rev2 AUTH=PLAIN | ||||
| S: a003 OK CAPABILITY completed | ||||
| C: a004 AUTHENTICATE PLAIN dGVzdAB0ZXN0AHRlc3Q= | ||||
| S: a004 OK Success (tls protection) | ||||
| </sourcecode> | ||||
| </section> | ||||
| <section anchor="authenticate" numbered="true" toc="default"> | ||||
| <name>AUTHENTICATE Command</name> | ||||
| <iref item="AUTHENTICATE (command)" subitem="" primary="false"/> | ||||
| <t hangText='Result:'>OK - authenticate completed, now in authenticated state | <dl newline="false" spacing="normal" indent="14"> | |||
| <vspace/> | <dt>Arguments:</dt> | |||
| NO - authenticate failure: unsupported authentication<vspace/> | <dd> | |||
| mechanism, credentials rejected<vspace/> | <t>SASL authentication mechanism name</t> | |||
| BAD - command unknown or arguments invalid,<vspace/> | <t> <bcp14>OPTIONAL</bcp14> initial response</t> | |||
| authentication exchange cancelled</t> | </dd> | |||
| </list> | <dt>Responses:</dt> | |||
| </t> | <dd>continuation data can be requested</dd> | |||
| <dt>Result:</dt> | ||||
| <dd> | ||||
| <dl spacing="compact"> | ||||
| <dt>OK -</dt><dd>authenticate completed, now in authenticated stat | ||||
| e</dd> | ||||
| <dt>NO -</dt><dd>authenticate failure: unsupported authentication | ||||
| mechanism, credentials rejected</dd> | ||||
| <dt> | ||||
| BAD -</dt><dd>command unknown or arguments invalid, | ||||
| authentication exchange canceled</dd> | ||||
| </dl> | ||||
| </dd> | ||||
| </dl> | ||||
| <t> | <t> | |||
| The AUTHENTICATE command indicates a <xref target='SASL'/> authentication | The AUTHENTICATE command indicates a <xref target="RFC4422" format="defaul | |||
| t"/> authentication | ||||
| mechanism to the server. If the server supports the requested | mechanism to the server. If the server supports the requested | |||
| authentication mechanism, it performs an authentication protocol | authentication mechanism, it performs an authentication protocol | |||
| exchange to authenticate and identify the client. It MAY also | exchange to authenticate and identify the client. It <bcp14>MAY</bcp14> a | |||
| negotiate an OPTIONAL security layer for subsequent protocol | lso | |||
| negotiate an <bcp14>OPTIONAL</bcp14> security layer for subsequent protoco | ||||
| l | ||||
| interactions. If the requested authentication mechanism is not | interactions. If the requested authentication mechanism is not | |||
| supported, the server SHOULD reject the AUTHENTICATE command by | supported, the server <bcp14>SHOULD</bcp14> reject the AUTHENTICATE comman d by | |||
| sending a tagged NO response. | sending a tagged NO response. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The AUTHENTICATE command supports the optional "initial response" | The AUTHENTICATE command supports the optional "initial response" | |||
| feature defined in Section 5.1 of <xref target='SASL'/>. The client | feature defined in <xref target="RFC4422" sectionFormat="of" section="4"/> . The client | |||
| doesn't need to use it. If a SASL mechanism supports "initial response", | doesn't need to use it. If a SASL mechanism supports "initial response", | |||
| but it is not specified by the client, the server handles this as specifie | but it is not specified by the client, the server handles it as specified | |||
| d | in <xref target="RFC4422" sectionFormat="of" section="3"/>. | |||
| in Section 3 of <xref target='SASL'/>. | </t> | |||
| </t> | <t> | |||
| The service name specified by this protocol's profile of <xref target="RFC | ||||
| <t> | 4422" format="default"/> is | |||
| The service name specified by this protocol's profile of <xref target='SAS | ||||
| L'/> is | ||||
| "imap". | "imap". | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The authentication protocol exchange consists of a series of | The authentication protocol exchange consists of a series of | |||
| server challenges and client responses that are specific to the | server challenges and client responses that are specific to the | |||
| authentication mechanism. A server challenge consists of a | authentication mechanism. A server challenge consists of a | |||
| command continuation request response with the "+" token followed | command continuation request response with the "+" token followed | |||
| by a BASE64 encoded (see Section 4 of <xref target="RFC4648"/>) string. | by a base64-encoded (see <xref target="RFC4648" sectionFormat="of" section ="4"/>) string. | |||
| The client response consists of a | The client response consists of a | |||
| single line consisting of a BASE64 encoded string. If the client | single line consisting of a base64-encoded string. If the client | |||
| wishes to cancel an authentication exchange, it issues a line | wishes to cancel an authentication exchange, it issues a line | |||
| consisting of a single "*". If the server receives such a | consisting of a single "*". If the server receives such a | |||
| response, or if it receives an invalid BASE64 string (e.g. | response, or if it receives an invalid base64 string (e.g., | |||
| characters outside the BASE64 alphabet, or non-terminal "="), it | characters outside the base64 alphabet or non-terminal "="), it | |||
| MUST reject the AUTHENTICATE command by sending a tagged BAD | <bcp14>MUST</bcp14> reject the AUTHENTICATE command by sending a tagged BA | |||
| D | ||||
| response. | response. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | As with any other client response, the initial response <bcp14>MUST</bcp14 | |||
| As with any other client response, the initial response MUST | > | |||
| be encoded as BASE64. | be encoded as base64. | |||
| It also MUST be transmitted outside of a quoted string or literal. | It also <bcp14>MUST</bcp14> be transmitted outside of a quoted string or l | |||
| To send a zero-length initial response, the client MUST send | iteral. | |||
| To send a zero-length initial response, the client <bcp14>MUST</bcp14> sen | ||||
| d | ||||
| a single pad character ("="). This indicates that the response is present , | a single pad character ("="). This indicates that the response is present , | |||
| but is a zero-length string. | but it is a zero-length string. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | When decoding the base64 data in the initial response, | |||
| When decoding the BASE64 data in the initial response, | decoding errors <bcp14>MUST</bcp14> be treated as in any normal SASL client | |||
| decoding errors MUST be treated as in any normal SASL client response, | response, | |||
| i.e. with a tagged BAD response. In particular, the | i.e., with a tagged BAD response. In particular, the | |||
| server should check for any characters not explicitly allowed by the | server should check for any characters not explicitly allowed by the | |||
| BASE64 alphabet, as well as any sequence of BASE64 characters that | base64 alphabet, as well as any sequence of base64 characters that | |||
| contains the pad character ('=') anywhere other than the end of the | contains the pad character ('=') anywhere other than the end of the | |||
| string (e.g., "=AAA" and "AAA=BBB" are not allowed). | string (e.g., "=AAA" and "AAA=BBB" are not allowed). | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| If the client uses an initial response with a SASL mechanism that | If the client uses an initial response with a SASL mechanism that | |||
| does not support an initial response, the server MUST reject the | does not support an initial response, the server <bcp14>MUST</bcp14> reject the | |||
| command with a tagged BAD response. | command with a tagged BAD response. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | If a security layer is negotiated through the <xref target="RFC4422" forma | |||
| If a security layer is negotiated through the <xref target='SASL'/> | t="default"/> | |||
| authentication exchange, it takes effect immediately following the | authentication exchange, it takes effect immediately following the | |||
| CRLF that concludes the authentication exchange for the client, | CRLF that concludes the authentication exchange for the client | |||
| and the CRLF of the tagged OK response for the server. | and the CRLF of the tagged OK response for the server. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | While client and server implementations <bcp14>MUST</bcp14> implement the | |||
| While client and server implementations MUST implement the | ||||
| AUTHENTICATE command itself, it is not required to implement any | AUTHENTICATE command itself, it is not required to implement any | |||
| authentication mechanisms other than the PLAIN mechanism described | authentication mechanisms other than the PLAIN mechanism described | |||
| in <xref target='PLAIN'/>. Also, an authentication mechanism is not requi red | in <xref target="RFC4616" format="default"/>. Also, an authentication mec hanism is not required | |||
| to support any security layers. | to support any security layers. | |||
| <list><t> | </t> | |||
| Note: a server implementation MUST implement a | <t indent="3"> | |||
| Note: a server implementation <bcp14>MUST</bcp14> implement a | ||||
| configuration in which it does NOT permit any plaintext | configuration in which it does NOT permit any plaintext | |||
| password mechanisms, unless either the STARTTLS command | password mechanisms, unless the STARTTLS command | |||
| has been negotiated, TLS has been negotiated on an Implicit TLS port, | has been negotiated, TLS has been negotiated on an Implicit TLS port, | |||
| or some other mechanism that | or some other mechanism that | |||
| protects the session from password snooping has been | protects the session from password snooping has been | |||
| provided. Server sites SHOULD NOT use any configuration | provided. Server sites <bcp14>SHOULD NOT</bcp14> use any configurati | |||
| which permits a plaintext password mechanism without | on | |||
| that permits a plaintext password mechanism without | ||||
| such a protection mechanism against password snooping. | such a protection mechanism against password snooping. | |||
| Client and server implementations SHOULD implement | Client and server implementations <bcp14>SHOULD</bcp14> implement | |||
| additional <xref target='SASL'/> mechanisms that do not use plaintext | additional <xref target="RFC4422" format="default"/> mechanisms that | |||
| passwords, such the GSSAPI mechanism described in <xref target='RFC47 | do not use plaintext | |||
| 52'/>, | passwords, such as the GSSAPI mechanism described in <xref target="RF | |||
| the SCRAM-SHA-256/SCRAM-SHA-256-PLUS <xref target='SCRAM-SHA-256'/> m | C4752" format="default"/>, | |||
| echanisms | the SCRAM-SHA-256/SCRAM-SHA-256-PLUS <xref target="RFC7677" format="d | |||
| and/or EXTERNAL <xref target='SASL'/> mechanism for mutual TLS authen | efault"/> mechanisms, | |||
| tication. | and/or the EXTERNAL <xref target="RFC4422" format="default"/> mechani | |||
| (Note that SASL framework allows creation of SASL mechanisms that sup | sm for mutual TLS authentication. | |||
| port | (Note that the SASL framework allows for the creation of SASL mechani | |||
| 2FA (2-factor authentication), however none are fully ready to be rec | sms that support | |||
| ommended | 2-factor authentication (2FA); however, none are fully ready to be re | |||
| commended | ||||
| by this document.) | by this document.) | |||
| </t></list> | </t> | |||
| </t> | <t> | |||
| <t> | ||||
| Servers and clients can support multiple authentication | Servers and clients can support multiple authentication | |||
| mechanisms. The server SHOULD list its supported authentication | mechanisms. The server <bcp14>SHOULD</bcp14> list its supported authentic ation | |||
| mechanisms in the response to the CAPABILITY command so that the | mechanisms in the response to the CAPABILITY command so that the | |||
| client knows which authentication mechanisms to use. | client knows which authentication mechanisms to use. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | A server <bcp14>MAY</bcp14> include a CAPABILITY response code in the tagg | |||
| A server MAY include a CAPABILITY response code in the tagged OK | ed OK | |||
| response of a successful AUTHENTICATE command in order to send | response of a successful AUTHENTICATE command in order to send | |||
| capabilities automatically. It is unnecessary for a client to | capabilities automatically. It is unnecessary for a client to | |||
| send a separate CAPABILITY command if it recognizes these | send a separate CAPABILITY command if it recognizes these | |||
| automatic capabilities. This should only be done if a security | automatic capabilities. This should only be done if a security | |||
| layer was not negotiated by the AUTHENTICATE command, because the | layer was not negotiated by the AUTHENTICATE command, because the | |||
| tagged OK response as part of an AUTHENTICATE command is not | tagged OK response as part of an AUTHENTICATE command is not | |||
| protected by encryption/integrity checking. <xref target='SASL'/> require s the | protected by encryption/integrity checking. <xref target="RFC4422" format ="default"/> requires the | |||
| client to re-issue a CAPABILITY command in this case. | client to re-issue a CAPABILITY command in this case. | |||
| The server MAY advertise different capabilities after | The server <bcp14>MAY</bcp14> advertise different capabilities after | |||
| a successful AUTHENTICATE command. | a successful AUTHENTICATE command. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| If an AUTHENTICATE command fails with a NO response, the client | If an AUTHENTICATE command fails with a NO response, the client | |||
| MAY try another authentication mechanism by issuing another | <bcp14>MAY</bcp14> try another authentication mechanism by issuing another | |||
| AUTHENTICATE command. It MAY also attempt to authenticate by | AUTHENTICATE command. It <bcp14>MAY</bcp14> also attempt to authenticate | |||
| using the LOGIN command (see <xref target='login'/> for more detail). In | by | |||
| other words, the client MAY request authentication types in | using the LOGIN command (see <xref target="login" format="default"/> for m | |||
| ore detail). In | ||||
| other words, the client <bcp14>MAY</bcp14> request authentication types in | ||||
| decreasing order of preference, with the LOGIN command as a last | decreasing order of preference, with the LOGIN command as a last | |||
| resort. | resort. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The authorization identity passed from the client to the server | The authorization identity passed from the client to the server | |||
| during the authentication exchange is interpreted by the server as | during the authentication exchange is interpreted by the server as | |||
| the user name whose privileges the client is requesting. | the user name whose privileges the client is requesting. | |||
| </t> | </t> | |||
| <figure><artwork> | ||||
| Example: S: * OK [CAPABILITY IMAP4rev2 STARTTLS AUTH=GSSAPI] | ||||
| Capabilities | ||||
| C: A001 AUTHENTICATE GSSAPI | ||||
| S: + | ||||
| C: YIIB+wYJKoZIhvcSAQICAQBuggHqMIIB5qADAgEFoQMCAQ6iBw | ||||
| MFACAAAACjggEmYYIBIjCCAR6gAwIBBaESGxB1Lndhc2hpbmd0 | ||||
| b24uZWR1oi0wK6ADAgEDoSQwIhsEaW1hcBsac2hpdmFtcy5jYW | ||||
| Mud2FzaGluZ3Rvbi5lZHWjgdMwgdCgAwIBAaEDAgEDooHDBIHA | ||||
| cS1GSa5b+fXnPZNmXB9SjL8Ollj2SKyb+3S0iXMljen/jNkpJX | ||||
| AleKTz6BQPzj8duz8EtoOuNfKgweViyn/9B9bccy1uuAE2HI0y | ||||
| C/PHXNNU9ZrBziJ8Lm0tTNc98kUpjXnHZhsMcz5Mx2GR6dGknb | ||||
| I0iaGcRerMUsWOuBmKKKRmVMMdR9T3EZdpqsBd7jZCNMWotjhi | ||||
| vd5zovQlFqQ2Wjc2+y46vKP/iXxWIuQJuDiisyXF0Y8+5GTpAL | ||||
| pHDc1/pIGmMIGjoAMCAQGigZsEgZg2on5mSuxoDHEA1w9bcW9n | ||||
| FdFxDKpdrQhVGVRDIzcCMCTzvUboqb5KjY1NJKJsfjRQiBYBdE | ||||
| NKfzK+g5DlV8nrw81uOcP8NOQCLR5XkoMHC0Dr/80ziQzbNqhx | ||||
| O6652Npft0LQwJvenwDI13YxpwOdMXzkWZN/XrEqOWp6GCgXTB | ||||
| vCyLWLlWnbaUkZdEYbKHBPjd8t/1x5Yg== | ||||
| S: + YGgGCSqGSIb3EgECAgIAb1kwV6ADAgEFoQMCAQ+iSzBJoAMC | ||||
| AQGiQgRAtHTEuOP2BXb9sBYFR4SJlDZxmg39IxmRBOhXRKdDA0 | ||||
| uHTCOT9Bq3OsUTXUlk0CsFLoa8j+gvGDlgHuqzWHPSQg== | ||||
| C: | ||||
| S: + YDMGCSqGSIb3EgECAgIBAAD/////6jcyG4GE3KkTzBeBiVHe | ||||
| ceP2CWY0SR0fAQAgAAQEBAQ= | ||||
| C: YDMGCSqGSIb3EgECAgIBAAD/////3LQBHXTpFfZgrejpLlLImP | ||||
| wkhbfa2QteAQAgAG1yYwE= | ||||
| S: A001 OK GSSAPI authentication successful | ||||
| </artwork></figure> | ||||
| <figure><artwork> | ||||
| The following example demonstrates use of initial response | ||||
| Example: | <t>Example:</t> | |||
| S: * OK [CAPABILITY IMAP4rev2 STARTTLS AUTH=GSSAPI | <sourcecode type=""> | |||
| LOGINDISABLED] Server ready | S: * OK [CAPABILITY IMAP4rev2 STARTTLS AUTH=GSSAPI] | |||
| C: A01 STARTTLS | Capabilities | |||
| S: A01 OK STARTLS completed | C: A001 AUTHENTICATE GSSAPI | |||
| <TLS negotiation, further commands are under [TLS] layer> | S: + | |||
| C: A02 CAPABILITY | C: YIIB+wYJKoZIhvcSAQICAQBuggHqMIIB5qADAgEFoQMCAQ6iBw | |||
| S: * CAPABILITY IMAP4rev2 AUTH=GSSAPI AUTH=PLAIN | MFACAAAACjggEmYYIBIjCCAR6gAwIBBaESGxB1Lndhc2hpbmd0 | |||
| S: A02 OK CAPABILITY completed | b24uZWR1oi0wK6ADAgEDoSQwIhsEaW1hcBsac2hpdmFtcy5jYW | |||
| C: A03 AUTHENTICATE PLAIN dGVzdAB0ZXN0AHRlc3Q= | Mud2FzaGluZ3Rvbi5lZHWjgdMwgdCgAwIBAaEDAgEDooHDBIHA | |||
| S: A03 OK Success (tls protection) | cS1GSa5b+fXnPZNmXB9SjL8Ollj2SKyb+3S0iXMljen/jNkpJX | |||
| </artwork></figure> | AleKTz6BQPzj8duz8EtoOuNfKgweViyn/9B9bccy1uuAE2HI0y | |||
| C/PHXNNU9ZrBziJ8Lm0tTNc98kUpjXnHZhsMcz5Mx2GR6dGknb | ||||
| I0iaGcRerMUsWOuBmKKKRmVMMdR9T3EZdpqsBd7jZCNMWotjhi | ||||
| vd5zovQlFqQ2Wjc2+y46vKP/iXxWIuQJuDiisyXF0Y8+5GTpAL | ||||
| pHDc1/pIGmMIGjoAMCAQGigZsEgZg2on5mSuxoDHEA1w9bcW9n | ||||
| FdFxDKpdrQhVGVRDIzcCMCTzvUboqb5KjY1NJKJsfjRQiBYBdE | ||||
| NKfzK+g5DlV8nrw81uOcP8NOQCLR5XkoMHC0Dr/80ziQzbNqhx | ||||
| O6652Npft0LQwJvenwDI13YxpwOdMXzkWZN/XrEqOWp6GCgXTB | ||||
| vCyLWLlWnbaUkZdEYbKHBPjd8t/1x5Yg== | ||||
| S: + YGgGCSqGSIb3EgECAgIAb1kwV6ADAgEFoQMCAQ+iSzBJoAMC | ||||
| AQGiQgRAtHTEuOP2BXb9sBYFR4SJlDZxmg39IxmRBOhXRKdDA0 | ||||
| uHTCOT9Bq3OsUTXUlk0CsFLoa8j+gvGDlgHuqzWHPSQg== | ||||
| C: | ||||
| S: + YDMGCSqGSIb3EgECAgIBAAD/////6jcyG4GE3KkTzBeBiVHe | ||||
| ceP2CWY0SR0fAQAgAAQEBAQ= | ||||
| C: YDMGCSqGSIb3EgECAgIBAAD/////3LQBHXTpFfZgrejpLlLImP | ||||
| wkhbfa2QteAQAgAG1yYwE= | ||||
| S: A001 OK GSSAPI authentication successful | ||||
| </sourcecode> | ||||
| <!--Possible extra examples from RFC 4959: | <t> | |||
| The following example demonstrates the use of an initial response. | ||||
| </t> | ||||
| <t>Example:</t> | ||||
| <sourcecode type=""> | ||||
| S: * OK [CAPABILITY IMAP4rev2 STARTTLS AUTH=GSSAPI | ||||
| LOGINDISABLED] Server ready | ||||
| C: A01 STARTTLS | ||||
| S: A01 OK STARTTLS completed | ||||
| <TLS negotiation, further commands are under TLS layer> | ||||
| C: A02 CAPABILITY | ||||
| S: * CAPABILITY IMAP4rev2 AUTH=GSSAPI AUTH=PLAIN | ||||
| S: A02 OK CAPABILITY completed | ||||
| C: A03 AUTHENTICATE PLAIN dGVzdAB0ZXN0AHRlc3Q= | ||||
| S: A03 OK Success (tls protection) | ||||
| </sourcecode> | ||||
| Note that even when a server supports this extension, the following | <t> | |||
| Note that because the initial response is optional, the following | ||||
| negotiation (which does not use the initial response) is still valid | negotiation (which does not use the initial response) is still valid | |||
| and MUST be supported by the server: | and <bcp14>MUST</bcp14> be supported by the server: | |||
| </t> | ||||
| ... client connects to server and negotiates a TLS | ||||
| protection layer ... | ||||
| C: C01 CAPABILITY | ||||
| S: * CAPABILITY IMAP4rev1 SASL-IR AUTH=PLAIN | ||||
| S: C01 OK Completed | ||||
| C: A01 AUTHENTICATE PLAIN | ||||
| (note that there is a space following the "+" in the | ||||
| following line) | ||||
| S: + | ||||
| C: dGVzdAB0ZXN0AHRlc3Q= | ||||
| S: A01 OK Success (tls protection) | ||||
| The following is an example authentication using the SASL EXTERNAL | <sourcecode type=""> | |||
| mechanism (defined in [RFC4422]) under a TLS protection layer (see | ... client connects to server and negotiates a TLS | |||
| [RFC4346]) and an empty initial response: | protection layer ... | |||
| C: C01 CAPABILITY | ||||
| S: * CAPABILITY IMAP4rev2 AUTH=PLAIN | ||||
| S: C01 OK Completed | ||||
| C: A01 AUTHENTICATE PLAIN | ||||
| S: + | ||||
| C: dGVzdAB0ZXN0AHRlc3Q= | ||||
| S: A01 OK Success (tls protection) | ||||
| </sourcecode> | ||||
| ... client connects to server and negotiates a TLS | <t> | |||
| protection layer ... | Note that in the above example there is a space following the "+" from the s | |||
| C: C01 CAPABILITY | erver. | |||
| S: * CAPABILITY IMAP4rev1 SASL-IR AUTH=PLAIN AUTH=EXTERNAL | </t> | |||
| S: C01 OK Completed | ||||
| C: A01 AUTHENTICATE EXTERNAL = | ||||
| S: A01 OK Success (tls protection) | ||||
| This is in contrast with the handling of such a situation when an | <t> | |||
| initial response is omitted: | The following is an example authentication using the SASL EXTERNAL | |||
| mechanism (defined in <xref target="RFC4422" format="default"/>) | ||||
| under a TLS protection layer and an empty initial response: | ||||
| </t> | ||||
| ... client connects to server and negotiates a TLS protection | <sourcecode type=""> | |||
| layer ... | ... client connects to server and negotiates a TLS | |||
| C: C01 CAPABILITY | protection layer ... | |||
| S: * CAPABILITY IMAP4rev1 SASL-IR AUTH=PLAIN AUTH=EXTERNAL | C: C01 CAPABILITY | |||
| S: C01 OK Completed | S: * CAPABILITY IMAP4rev2 AUTH=PLAIN AUTH=EXTERNAL | |||
| C: A01 AUTHENTICATE EXTERNAL | S: C01 OK Completed | |||
| (note that there is a space following the "+" in the | C: A01 AUTHENTICATE EXTERNAL = | |||
| following line) | S: A01 OK Success (tls protection) | |||
| S: + | </sourcecode> | |||
| C: | ||||
| S: A01 OK Success (tls protection) | ||||
| <t> | <t> | |||
| Note: The line breaks within server challenges and client | Note: The line breaks within server challenges and client | |||
| responses are for editorial clarity and are not in real | responses are for editorial clarity and are not in real | |||
| authenticators. | authenticators. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="login" numbered="true" toc="default"> | ||||
| <section title='LOGIN Command' anchor='login'> | <name>LOGIN Command</name> | |||
| <t> | ||||
| <list style='hanging' hangIndent='12'> | ||||
| <t hangText='Arguments:'>user name<vspace/> | ||||
| password</t> | ||||
| <t hangText='Responses:'>no specific responses for this command</t> | ||||
| <t hangText='Result:'>OK - login completed, now in authenticated state<vspace | ||||
| /> | ||||
| NO - login failure: user name or password rejected<vspace/> | ||||
| BAD - command unknown or arguments invalid</t> | ||||
| </list> | ||||
| </t> | ||||
| <t> | <dl newline="false" spacing="normal" indent="14"> | |||
| <dt>Arguments:</dt> | ||||
| <dd> | ||||
| <t>user name</t> | ||||
| <t>password</t> | ||||
| </dd> | ||||
| <dt>Responses:</dt> | ||||
| <dd>no specific responses for this command</dd> | ||||
| <dt>Result:</dt> | ||||
| <dd> | ||||
| <dl spacing="compact" indent="6"> | ||||
| <dt>OK -</dt><dd>login completed, now in authenticated state</dd> | ||||
| <dt>NO -</dt><dd>login failure: user name or password rejected</dd | ||||
| > | ||||
| <dt>BAD -</dt><dd>command unknown or arguments invalid</dd> | ||||
| </dl> | ||||
| </dd> | ||||
| </dl> | ||||
| <t> | ||||
| The LOGIN command identifies the client to the server and carries | The LOGIN command identifies the client to the server and carries | |||
| the plaintext password authenticating this user. | the plaintext password authenticating this user. | |||
| The LOGIN command SHOULD NOT be used except as a last | The LOGIN command <bcp14>SHOULD NOT</bcp14> be used except as a last | |||
| resort (after attempting and failing to authenticate using | resort (after attempting and failing to authenticate using | |||
| the AUTHENTICATE command one or more times), | the AUTHENTICATE command one or more times), | |||
| and it is recommended that client implementations | and it is recommended that client implementations | |||
| have a means to disable any automatic use of the LOGIN | have a means to disable any automatic use of the LOGIN | |||
| command. | command. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | A server <bcp14>MAY</bcp14> include a CAPABILITY response code in the tagg | |||
| A server MAY include a CAPABILITY response code in the tagged OK | ed OK | |||
| response to a successful LOGIN command in order to send | response to a successful LOGIN command in order to send | |||
| capabilities automatically. It is unnecessary for a client to | capabilities automatically. It is unnecessary for a client to | |||
| send a separate CAPABILITY command if it recognizes these | send a separate CAPABILITY command if it recognizes these | |||
| automatic capabilities. | automatic capabilities. | |||
| </t> | </t> | |||
| <t>Example:</t> | ||||
| <figure><artwork> | <sourcecode type=""> | |||
| Example: C: a001 LOGIN SMITH SESAME | C: a001 LOGIN SMITH SESAME | |||
| S: a001 OK LOGIN completed | S: a001 OK LOGIN completed | |||
| </artwork></figure> | </sourcecode> | |||
| <t> | ||||
| <t> | ||||
| Note: Use of the LOGIN command over an insecure network | Note: Use of the LOGIN command over an insecure network | |||
| (such as the Internet) is a security risk, because anyone | (such as the Internet) is a security risk, because anyone | |||
| monitoring network traffic can obtain plaintext passwords. | monitoring network traffic can obtain plaintext passwords. | |||
| For that reason clients MUST NOT use LOGIN on unsecure networks. | For that reason, clients <bcp14>MUST NOT</bcp14> use LOGIN on unsecure n | |||
| </t> | etworks. | |||
| </t> | ||||
| <t> | <t> | |||
| Unless either the client is accessing IMAP service on Implicit TLS port | Unless the client is accessing IMAP service on an Implicit TLS port <xre | |||
| <xref target='RFC8314'/>, | f target="RFC8314" format="default"/>, | |||
| the STARTTLS command has been negotiated or | the STARTTLS command has been negotiated, or | |||
| some other mechanism that protects the session from | some other mechanism that protects the session from | |||
| password snooping has been provided, a server | password snooping has been provided, a server | |||
| implementation MUST implement a configuration in which it | implementation <bcp14>MUST</bcp14> implement a configuration in which it | |||
| advertises the LOGINDISABLED capability and does NOT permit | advertises the LOGINDISABLED capability and does NOT permit | |||
| the LOGIN command. Server sites SHOULD NOT use any | the LOGIN command. Server sites <bcp14>SHOULD NOT</bcp14> use any | |||
| configuration which permits the LOGIN command without such | configuration that permits the LOGIN command without such | |||
| a protection mechanism against password snooping. A client | a protection mechanism against password snooping. A client | |||
| implementation MUST NOT send a LOGIN command if the | implementation <bcp14>MUST NOT</bcp14> send a LOGIN command if the | |||
| LOGINDISABLED capability is advertised. | LOGINDISABLED capability is advertised. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| </section> | <name>Client Commands - Authenticated State</name> | |||
| <t> | ||||
| <section title='Client Commands - Authenticated State'> | ||||
| <t> | ||||
| In the authenticated state, commands that manipulate mailboxes as | In the authenticated state, commands that manipulate mailboxes as | |||
| atomic entities are permitted. Of these commands, the SELECT and | atomic entities are permitted. Of these commands, SELECT and | |||
| EXAMINE commands will select a mailbox for access and enter the | EXAMINE will select a mailbox for access and enter the | |||
| selected state. | selected state. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| In addition to the universal commands (CAPABILITY, NOOP, and LOGOUT), | In addition to the universal commands (CAPABILITY, NOOP, and LOGOUT), | |||
| the following commands are valid in the authenticated state: ENABLE, SELECT, | the following commands are valid in the authenticated state: ENABLE, SELECT, | |||
| EXAMINE, NAMESPACE, CREATE, DELETE, RENAME, SUBSCRIBE, UNSUBSCRIBE, LIST, | EXAMINE, NAMESPACE, CREATE, DELETE, RENAME, SUBSCRIBE, UNSUBSCRIBE, LIST, | |||
| STATUS, APPEND and IDLE. | STATUS, APPEND, and IDLE. | |||
| </t> | </t> | |||
| <section anchor="enable-command" numbered="true" toc="default"> | ||||
| <section title='ENABLE Command' anchor="enable-command"> | <name>ENABLE Command</name> | |||
| <iref item='ENABLE (command)'/> | <iref item="ENABLE (command)" subitem="" primary="false"/> | |||
| <dl newline="false" spacing="normal" indent="14"> | ||||
| <t> | <dt>Arguments:</dt> | |||
| <list style='hanging' hangIndent='12'> | <dd>capability names</dd> | |||
| <t hangText='Arguments:'>capability names</t> | <dt>Responses:</dt> | |||
| <dd>no specific responses for this command</dd> | ||||
| <t hangText='Responses:'>no specific responses for this command</t> | <dt>Result:</dt> | |||
| <dd> | ||||
| <t hangText='Result:'>OK - Relevant capabilities enabled<vspace/> | <dl spacing="compact"> | |||
| BAD - No arguments, or syntax error in an argument</t> | <dt>OK -</dt><dd>Relevant capabilities enabled</dd> | |||
| </list> | <dt>BAD -</dt><dd>No arguments, or syntax error in an argument</d | |||
| </t> | d> | |||
| </dl> | ||||
| <t> | </dd></dl> | |||
| <t> | ||||
| Several IMAP extensions allow the server to return unsolicited | Several IMAP extensions allow the server to return unsolicited | |||
| responses specific to these extensions in certain circumstances. | responses specific to these extensions in certain circumstances. | |||
| However, servers cannot send those unsolicited responses | However, servers cannot send those unsolicited responses | |||
| (with the exception of response codes (see <xref target='server-status-respon ses'/>) | (with the exception of response codes (see <xref target="server-status-respon ses" format="default"/>) | |||
| included in tagged or untagged OK/NO/BAD responses, which can always be sent) | included in tagged or untagged OK/NO/BAD responses, which can always be sent) | |||
| until they know that the clients support such extensions and thus won't choke | until they know that the clients support such extensions and thus will be abl | |||
| on | e to correctly parse and process the extension response data. | |||
| the extension response data. | </t> | |||
| </t> | <t> | |||
| <t> | ||||
| The ENABLE command provides an explicit indication from the client | The ENABLE command provides an explicit indication from the client | |||
| that it supports particular extensions. It is designed such that | that it supports particular extensions. It is designed such that | |||
| the client can send a simple constant string with the extensions it | the client can send a simple constant string with the extensions it | |||
| supports, and the server will enable the shared subset that both | supports, and the server will enable the shared subset that both | |||
| support. | support. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | The ENABLE command takes a list of capability names and requests the | |||
| The ENABLE command takes a list of capability names, and requests the | ||||
| server to enable the named extensions. Once enabled using ENABLE, | server to enable the named extensions. Once enabled using ENABLE, | |||
| each extension remains active until the IMAP connection is closed. | each extension remains active until the IMAP connection is closed. | |||
| For each argument, the server does the following: | For each argument, the server does the following: | |||
| <list style='symbols'> | </t> | |||
| <t> | <ul spacing="normal"> | |||
| <li> | ||||
| If the argument is not an extension known to the server, the server | If the argument is not an extension known to the server, the server | |||
| MUST ignore the argument. | <bcp14>MUST</bcp14> ignore the argument. | |||
| </t> | </li> | |||
| <li> | ||||
| <t> | ||||
| If the argument is an extension known to the server, and it is not | If the argument is an extension known to the server, and it is not | |||
| specifically permitted to be enabled using ENABLE, the server MUST | specifically permitted to be enabled using ENABLE, the server <bcp14>MUST</ bcp14> | |||
| ignore the argument. (Note that knowing about an extension doesn't | ignore the argument. (Note that knowing about an extension doesn't | |||
| necessarily imply supporting that extension.) | necessarily imply supporting that extension.) | |||
| </t> | </li> | |||
| <li> | ||||
| <t> | ||||
| If the argument is an extension that is supported by the server and | If the argument is an extension that is supported by the server and | |||
| that needs to be enabled, the server MUST enable the extension for | that needs to be enabled, the server <bcp14>MUST</bcp14> enable the extensi on for | |||
| the duration of the connection. Note that once an extension is enabled, | the duration of the connection. Note that once an extension is enabled, | |||
| there is no way to disable it. | there is no way to disable it. | |||
| </t> | </li> | |||
| </list> | </ul> | |||
| <t> | ||||
| </t> | If the ENABLE command is successful, the server <bcp14>MUST</bcp14> send an u | |||
| ntagged | ||||
| <t> | ENABLED response (<xref target="enabled" format="default"/>), which includes | |||
| If the ENABLE command is successful, the server MUST send an untagged | all enabled | |||
| ENABLED response <xref target='enabled'/>, which includes all enabled | ||||
| extensions as specified above. The ENABLED response is sent even if | extensions as specified above. The ENABLED response is sent even if | |||
| no extensions were enabled. | no extensions were enabled. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Clients <bcp14>SHOULD</bcp14> only include extensions that need to be enabled | |||
| Clients SHOULD only include extensions that need to be enabled by the | by the | |||
| server. For example, a client can enable IMAP4rev2 specific behaviour | server. For example, a client can enable IMAP4rev2-specific behavior | |||
| when both IMAP4rev1 and IMAP4rev2 are advertised in the CAPABILITY response. | when both IMAP4rev1 and IMAP4rev2 are advertised in the CAPABILITY response. | |||
| Future RFCs may add to this list. | Future RFCs may add to this list. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The ENABLE command is only valid in the authenticated state, | The ENABLE command is only valid in the authenticated state, | |||
| before any mailbox is selected. Clients MUST NOT issue | before any mailbox is selected. Clients <bcp14>MUST NOT</bcp14> issue | |||
| ENABLE once they SELECT/EXAMINE a mailbox; however, server | ENABLE once they SELECT/EXAMINE a mailbox; however, server | |||
| implementations don't have to check that no mailbox is selected or | implementations don't have to check that no mailbox is selected or | |||
| was previously selected during the duration of a connection. | was previously selected during the duration of a connection. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The ENABLE command can be issued multiple times in a session. It is | The ENABLE command can be issued multiple times in a session. It is | |||
| additive; i.e., "ENABLE a b", followed by "ENABLE c" is the same as a | additive; that is, "ENABLE a b", followed by "ENABLE c", is the same as a | |||
| single command "ENABLE a b c". When multiple ENABLE commands are | single command "ENABLE a b c". When multiple ENABLE commands are | |||
| issued, each corresponding ENABLED response SHOULD only contain | issued, each corresponding ENABLED response <bcp14>SHOULD</bcp14> only contai | |||
| extensions enabled by the corresponding ENABLE command, i.e. | n | |||
| extensions enabled by the corresponding ENABLE command, i.e., | ||||
| for the above example, the ENABLED response to "ENABLE c" should not | for the above example, the ENABLED response to "ENABLE c" should not | |||
| contain "a" or "b". | contain "a" or "b". | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| There are no limitations on pipelining ENABLE. For example, it is | There are no limitations on pipelining ENABLE. For example, it is | |||
| possible to send ENABLE and then immediately SELECT, or a LOGIN | possible to send ENABLE and then immediately SELECT, or a LOGIN | |||
| immediately followed by ENABLE. | immediately followed by ENABLE. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | The server <bcp14>MUST NOT</bcp14> change the CAPABILITY list as a result of | |||
| The server MUST NOT change the CAPABILITY list as a result of | executing ENABLE; that is, a CAPABILITY command issued right after an | |||
| executing ENABLE; i.e., a CAPABILITY command issued right after an | ENABLE command <bcp14>MUST</bcp14> list the same capabilities as a CAPABILITY | |||
| ENABLE command MUST list the same capabilities as a CAPABILITY | ||||
| command issued before the ENABLE command. This is demonstrated in | command issued before the ENABLE command. This is demonstrated in | |||
| the following example. Note that below "X-GOOD-IDEA" is a fictitious | the following example. Note that below "X-GOOD-IDEA" is a fictitious | |||
| extension capability that can be ENABLEd. | extension capability that can be ENABLED. | |||
| </t> | </t> | |||
| <figure><artwork> | ||||
| C: t1 CAPABILITY | ||||
| S: * CAPABILITY IMAP4rev2 ID LITERAL+ X-GOOD-IDEA | ||||
| S: t1 OK foo | ||||
| C: t2 ENABLE CONDSTORE X-GOOD-IDEA | ||||
| S: * ENABLED X-GOOD-IDEA | ||||
| S: t2 OK foo | ||||
| C: t3 CAPABILITY | ||||
| S: * CAPABILITY IMAP4rev2 ID LITERAL+ X-GOOD-IDEA | ||||
| S: t3 OK foo again | ||||
| </artwork></figure> | ||||
| <t> | ||||
| In the following example, the client enables CONDSTORE extension <xref target | ||||
| ='RFC7162'/>: | ||||
| </t> | ||||
| <figure><artwork> | ||||
| C: a1 ENABLE CONDSTORE | ||||
| S: * ENABLED CONDSTORE | ||||
| S: a1 OK Conditional Store enabled | ||||
| </artwork></figure> | ||||
| <section title='Note to Designers of Extensions That May Use the ENABLE | ||||
| Command'> | ||||
| <t> | <sourcecode type=""> | |||
| C: t1 CAPABILITY | ||||
| S: * CAPABILITY IMAP4rev2 ID LITERAL+ X-GOOD-IDEA | ||||
| S: t1 OK foo | ||||
| C: t2 ENABLE CONDSTORE X-GOOD-IDEA | ||||
| S: * ENABLED X-GOOD-IDEA | ||||
| S: t2 OK foo | ||||
| C: t3 CAPABILITY | ||||
| S: * CAPABILITY IMAP4rev2 ID LITERAL+ X-GOOD-IDEA | ||||
| S: t3 OK foo again | ||||
| </sourcecode> | ||||
| <t> | ||||
| In the following example, the client enables the Conditional Store (CONDSTORE | ||||
| ) extension <xref target="RFC7162" format="default"/>: | ||||
| </t> | ||||
| <sourcecode type=""> | ||||
| C: a1 ENABLE CONDSTORE | ||||
| S: * ENABLED CONDSTORE | ||||
| S: a1 OK Conditional Store enabled | ||||
| </sourcecode> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>Note to Designers of Extensions That May Use the ENABLE Comman | ||||
| d</name> | ||||
| <t> | ||||
| Designers of IMAP extensions are discouraged from creating extensions | Designers of IMAP extensions are discouraged from creating extensions | |||
| that require ENABLE unless there is no good alternative design. | that require ENABLE unless there is no good alternative design. | |||
| Specifically, extensions that cause potentially incompatible behavior | Specifically, extensions that cause potentially incompatible behavior | |||
| changes to deployed server responses (and thus benefit from ENABLE) | changes to deployed server responses (and thus benefit from ENABLE) | |||
| have a higher complexity cost than extensions that do not. | have a higher complexity cost than extensions that do not. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <name>SELECT Command</name> | ||||
| </section> | <iref item="SELECT (command)" subitem="" primary="false"/> | |||
| <dl newline="false" spacing="normal" indent="14"> | ||||
| <section title='SELECT Command'> | <dt>Arguments:</dt> | |||
| <iref item='SELECT (command)'/> | <dd>mailbox name</dd> | |||
| <dt>Responses:</dt> | ||||
| <t> | <dd> | |||
| <list style='hanging' hangIndent='12'> | <dl spacing="compact"> | |||
| <t hangText='Arguments:'>mailbox name</t> | <dt><bcp14>REQUIRED</bcp14> untagged responses:</dt><dd>FLAGS, EXI | |||
| STS, LIST</dd> | ||||
| <t hangText='Responses:'>REQUIRED untagged responses: FLAGS, EXISTS, LIST<vsp | ||||
| ace/> | ||||
| REQUIRED OK untagged responses: PERMANENTFLAGS,<vspace/> | ||||
| UIDNEXT, UIDVALIDITY</t> | ||||
| <t hangText='Result:'>OK - select completed, now in selected state<vspace/> | ||||
| NO - select failure, now in authenticated state: no<vspace/> | ||||
| such mailbox, can't access mailbox<vspace/> | ||||
| BAD - command unknown or arguments invalid</t> | ||||
| </list> | ||||
| </t> | ||||
| <t> | <dt><bcp14>REQUIRED</bcp14> OK untagged responses:</dt><dd>PERMAN | |||
| ENTFLAGS, | ||||
| UIDNEXT, UIDVALIDITY</dd> | ||||
| </dl> | ||||
| </dd> | ||||
| <dt>Result:</dt> | ||||
| <dd> | ||||
| <dl spacing="compact"> | ||||
| <dt>OK -</dt><dd>select completed, now in selected state</dd> | ||||
| <dt>NO -</dt><dd>select failure, now in authenticated state: no su | ||||
| ch mailbox, can't access mailbox</dd> | ||||
| <dt>BAD -</dt><dd>command unknown or arguments invalid</dd> | ||||
| </dl> | ||||
| </dd> | ||||
| </dl> | ||||
| <t> | ||||
| The SELECT command selects a mailbox so that messages in the | The SELECT command selects a mailbox so that messages in the | |||
| mailbox can be accessed. Before returning an OK to the client, | mailbox can be accessed. Before returning an OK to the client, | |||
| the server MUST send the following untagged data to the client. | the server <bcp14>MUST</bcp14> send the following untagged data to the cli ent. | |||
| (The order of individual responses is not important.) | (The order of individual responses is not important.) | |||
| <!--///But some of these response are marked as REQUIRED above!--> | Note that earlier versions of this protocol, such as the IMAP4rev1 version | |||
| Note that earlier versions of this protocol (e.g. IMAP4rev1 version specif | specified | |||
| ied in RFC 2060) | in <xref target="RFC2060" format="default"/>, | |||
| only required the FLAGS and EXISTS untagged responses and UIDVALIDITY resp | only required the FLAGS and EXISTS untagged responses and UIDVALIDITY resp | |||
| onse code; consequently, client | onse code. | |||
| implementations SHOULD implement default behavior for missing data | Client implementations that need to remain compatible with such older IMAP | |||
| as discussed with the individual item. | versions | |||
| have to implement default behavior for missing data, as discussed with the | ||||
| <list style='hanging'> | individual items. | |||
| <t hangText='FLAGS'>Defined flags in the mailbox. See the description | ||||
| of the FLAGS response in <xref target='flags-resp'/> for mo | ||||
| re detail.</t> | ||||
| <t hangText='<n> EXISTS'>The number of messages in the mailbox. See | ||||
| the | ||||
| description of the EXISTS response in <xref target='exists' | ||||
| /> for more detail.</t> | ||||
| <t hangText='LIST'>The server MUST return a LIST response | ||||
| with the mailbox name. The list of mailbox attributes MUST | ||||
| be accurate. | ||||
| If the server allows de-normalized UTF-8 mailbox names | ||||
| (see <xref target='mailbox-naming'/>) and the supplied mail | ||||
| box name | ||||
| differs from the normalized version, the server MUST return | ||||
| LIST with the OLDNAME extended data item. See <xref target= | ||||
| 'oldname'/> | ||||
| for more details.</t> | ||||
| <t hangText='OK [PERMANENTFLAGS (<list of flags>)]'> | </t> | |||
| <dl newline="true" spacing="normal"> | ||||
| <dt>FLAGS</dt> | ||||
| <dd>Defined flags in the mailbox. See the description | ||||
| of the FLAGS response in <xref target="flags-resp" format=" | ||||
| default"/> for more detail.</dd> | ||||
| <dt><n> EXISTS</dt> | ||||
| <dd>The number of messages in the mailbox. See the | ||||
| description of the EXISTS response in <xref target="exists" | ||||
| format="default"/> for more detail.</dd> | ||||
| <dt>LIST</dt> | ||||
| <dd>The server <bcp14>MUST</bcp14> return a LIST response | ||||
| with the mailbox name. The list of mailbox attributes <bcp1 | ||||
| 4>MUST</bcp14> be accurate. | ||||
| If the server allows denormalized UTF-8 mailbox names | ||||
| (see <xref target="mailbox-naming" format="default"/>) and | ||||
| the supplied mailbox name | ||||
| differs from the normalized version, the server <bcp14>MUST | ||||
| </bcp14> return | ||||
| LIST with the OLDNAME extended data item. See <xref target= | ||||
| "oldname" format="default"/> | ||||
| for more details.</dd> | ||||
| <dt>OK [PERMANENTFLAGS (<list of flags>)]</dt> | ||||
| <dd> | ||||
| A list of message flags that the client can change | A list of message flags that the client can change | |||
| permanently. If this is missing, the client should | permanently. If this is missing, the client should | |||
| assume that all flags can be changed permanently.</t> | assume that all flags can be changed permanently.</dd> | |||
| <dt>OK [UIDNEXT <n>]</dt> | ||||
| <t hangText='OK [UIDNEXT <n>]'> | <dd> | |||
| The next unique identifier value. Refer to | The next unique identifier value. Refer to | |||
| <xref target='uid-def'/> for more information.</t> | <xref target="uid-def" format="default"/> for more informat | |||
| ion.</dd> | ||||
| <t hangText='OK [UIDVALIDITY <n>]'> | <dt>OK [UIDVALIDITY <n>]</dt> | |||
| <dd> | ||||
| The unique identifier validity value. Refer to | The unique identifier validity value. Refer to | |||
| <xref target='uid-def'/> for more information.</t> | <xref target="uid-def" format="default"/> for more informat | |||
| </list> | ion.</dd> | |||
| </t> | </dl> | |||
| <t> | ||||
| <t> | ||||
| Only one mailbox can be selected at a time in a connection; | Only one mailbox can be selected at a time in a connection; | |||
| simultaneous access to multiple mailboxes requires multiple | simultaneous access to multiple mailboxes requires multiple | |||
| connections. The SELECT command automatically deselects any | connections. The SELECT command automatically deselects any | |||
| currently selected mailbox before attempting the new selection. | currently selected mailbox before attempting the new selection. | |||
| Consequently, if a mailbox is selected and a SELECT command that | Consequently, if a mailbox is selected and a SELECT command that | |||
| fails is attempted, no mailbox is selected. | fails is attempted, no mailbox is selected. | |||
| When deselecting a selected mailbox, the server MUST return | When deselecting a selected mailbox, the server <bcp14>MUST</bcp14> return | |||
| an untagged OK response with the "[CLOSED]" response code when | an untagged OK response with the "[CLOSED]" response code when | |||
| <!--RFC Editor: please make sure that the following reference correctly sh | the currently selected mailbox is closed (see <xref target="closed" format | |||
| ows the section number:--> | ="default"/>). | |||
| the currently selected mailbox is closed (see <xref target='closed'/>). | </t> | |||
| </t> | <t> | |||
| <t> | ||||
| If the client is permitted to modify the mailbox, the server | If the client is permitted to modify the mailbox, the server | |||
| SHOULD prefix the text of the tagged OK response with the | <bcp14>SHOULD</bcp14> prefix the text of the tagged OK response with the | |||
| "[READ-WRITE]" response code. | "[READ-WRITE]" response code. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| If the client is not permitted to modify the mailbox but is | If the client is not permitted to modify the mailbox but is | |||
| permitted read access, the mailbox is selected as read-only, and | permitted read access, the mailbox is selected as read-only, and | |||
| the server MUST prefix the text of the tagged OK response to | the server <bcp14>MUST</bcp14> prefix the text of the tagged OK response t o | |||
| SELECT with the "[READ-ONLY]" response code. Read-only access | SELECT with the "[READ-ONLY]" response code. Read-only access | |||
| through SELECT differs from the EXAMINE command in that certain | through SELECT differs from the EXAMINE command in that certain | |||
| read-only mailboxes MAY permit the change of permanent state on a | read-only mailboxes <bcp14>MAY</bcp14> permit the change of permanent stat e on a | |||
| per-user (as opposed to global) basis. Netnews messages marked in | per-user (as opposed to global) basis. Netnews messages marked in | |||
| a server-based .newsrc file are an example of such per-user | a server-based .newsrc file are an example of such per-user | |||
| permanent state that can be modified with read-only mailboxes. | permanent state that can be modified with read-only mailboxes. | |||
| </t> | </t> | |||
| <t>Example:</t> | ||||
| <figure><artwork> | <sourcecode type=""> | |||
| Example: C: A142 SELECT INBOX | C: A142 SELECT INBOX | |||
| S: * 172 EXISTS | S: * 172 EXISTS | |||
| S: * OK [UIDVALIDITY 3857529045] UIDs valid | S: * OK [UIDVALIDITY 3857529045] UIDs valid | |||
| S: * OK [UIDNEXT 4392] Predicted next UID | S: * OK [UIDNEXT 4392] Predicted next UID | |||
| S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) | S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) | |||
| S: * OK [PERMANENTFLAGS (\Deleted \Seen \*)] Limited | S: * OK [PERMANENTFLAGS (\Deleted \Seen \*)] Limited | |||
| S: * LIST () "/" INBOX | S: * LIST () "/" INBOX | |||
| S: A142 OK [READ-WRITE] SELECT completed | S: A142 OK [READ-WRITE] SELECT completed | |||
| </artwork></figure> | </sourcecode> | |||
| <t>Example:</t> | ||||
| <figure><artwork> | <sourcecode type=""> | |||
| Example: C: A142 SELECT INBOX | C: A142 SELECT INBOX | |||
| S: * 172 EXISTS | S: * 172 EXISTS | |||
| S: * OK [UIDVALIDITY 3857529045] UIDs valid | S: * OK [UIDVALIDITY 3857529045] UIDs valid | |||
| S: * OK [UIDNEXT 4392] Predicted next UID | S: * OK [UIDNEXT 4392] Predicted next UID | |||
| S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) | S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) | |||
| S: * OK [PERMANENTFLAGS (\Deleted \Seen \*)] Limited | S: * OK [PERMANENTFLAGS (\Deleted \Seen \*)] Limited | |||
| S: A142 OK [READ-WRITE] SELECT completed | S: A142 OK [READ-WRITE] SELECT completed | |||
| [...some time later...] | [...some time later...] | |||
| C: A143 SELECT Drafts | C: A143 SELECT Drafts | |||
| S: * OK [CLOSED] Previous mailbox is now closed | S: * OK [CLOSED] Previous mailbox is now closed | |||
| S: * 5 EXISTS | S: * 5 EXISTS | |||
| S: * OK [UIDVALIDITY 9877410381] UIDs valid | S: * OK [UIDVALIDITY 9877410381] UIDs valid | |||
| S: * OK [UIDNEXT 102] Predicted next UID | S: * OK [UIDNEXT 102] Predicted next UID | |||
| S: * LIST () "/" Drafts | S: * LIST () "/" Drafts | |||
| S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) | S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) | |||
| S: * OK [PERMANENTFLAGS (\Deleted \Seen \Answered | S: * OK [PERMANENTFLAGS (\Deleted \Seen \Answered | |||
| \Flagged \Draft \*)] System flags and keywords allowed | \Flagged \Draft \*)] System flags and keywords allowed | |||
| S: A143 OK [READ-WRITE] SELECT completed | S: A143 OK [READ-WRITE] SELECT completed | |||
| </artwork></figure> | </sourcecode> | |||
| <t>Note that IMAP4rev1-compliant servers can also send the untagged RE | ||||
| <t>Note that IMAP4rev1 compliant servers can also send the untagged RECENT | CENT | |||
| response which was deprecated in IMAP4rev2. E.g. "* 0 RECENT". | response that was deprecated in IMAP4rev2, e.g., "* 0 RECENT". | |||
| Pure IMAP4rev2 clients are advised to ignore the untagged RECENT response. | Pure IMAP4rev2 clients are advised to ignore the untagged RECENT response. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section numbered="true" toc="default"> | |||
| <name>EXAMINE Command</name> | ||||
| <section title='EXAMINE Command'> | <iref item="EXAMINE (command)" subitem="" primary="false"/> | |||
| <iref item='EXAMINE (command)'/> | <dl newline="false" spacing="normal" indent="14"> | |||
| <dt>Arguments:</dt> | ||||
| <t> | <dd>mailbox name</dd> | |||
| <list style='hanging' hangIndent='12'> | <dt>Responses:</dt> | |||
| <t hangText='Arguments:'>mailbox name</t> | <dd> | |||
| <dl spacing="compact"> | ||||
| <t hangText='Responses:'>REQUIRED untagged responses: FLAGS, EXISTS, LIST<vsp | <dt><bcp14>REQUIRED</bcp14> untagged responses:</dt><dd>FLAGS, EXI | |||
| ace/> | STS, LIST</dd> | |||
| REQUIRED OK untagged responses: PERMANENTFLAGS,<vspace/> | ||||
| UIDNEXT, UIDVALIDITY</t> | ||||
| <t hangText='Result:'>OK - examine completed, now in selected state<vspace/> | ||||
| NO - examine failure, now in authenticated state: no<vspace/> | ||||
| such mailbox, can't access mailbox | ||||
| BAD - command unknown or arguments invalid</t> | ||||
| </list> | ||||
| </t> | ||||
| <t> | <dt><bcp14>REQUIRED</bcp14> OK untagged responses:</dt><dd>PERMANE | |||
| NTFLAGS, | ||||
| UIDNEXT, UIDVALIDITY</dd> | ||||
| </dl> | ||||
| </dd> | ||||
| <dt>Result:</dt> | ||||
| <dd> | ||||
| <dl spacing="compact"> | ||||
| <dt>OK -</dt><dd>examine completed, now in selected state</dd> | ||||
| <dt> NO -</dt><dd>examine failure, now in authenticated state: no | ||||
| such mailbox, can't access mailbox</dd> | ||||
| <dt>BAD -</dt><dd>command unknown or arguments invalid</dd> | ||||
| </dl> | ||||
| </dd> | ||||
| </dl> | ||||
| <t> | ||||
| The EXAMINE command is identical to SELECT and returns the same | The EXAMINE command is identical to SELECT and returns the same | |||
| output; however, the selected mailbox is identified as read-only. | output; however, the selected mailbox is identified as read-only. | |||
| No changes to the permanent state of the mailbox, including | No changes to the permanent state of the mailbox, including | |||
| per-user state, are permitted. | per-user state, are permitted. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | The text of the tagged OK response to the EXAMINE command <bcp14>MUST</bcp | |||
| The text of the tagged OK response to the EXAMINE command MUST | 14> | |||
| begin with the "[READ-ONLY]" response code. | begin with the "[READ-ONLY]" response code. | |||
| </t> | </t> | |||
| <t>Example:</t> | ||||
| <figure><artwork> | <sourcecode type=""> | |||
| Example: C: A932 EXAMINE blurdybloop | C: A932 EXAMINE blurdybloop | |||
| S: * 17 EXISTS | S: * 17 EXISTS | |||
| S: * OK [UIDVALIDITY 3857529045] UIDs valid | S: * OK [UIDVALIDITY 3857529045] UIDs valid | |||
| S: * OK [UIDNEXT 4392] Predicted next UID | S: * OK [UIDNEXT 4392] Predicted next UID | |||
| S: * LIST () "/" blurdybloop | S: * LIST () "/" blurdybloop | |||
| S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) | S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) | |||
| S: * OK [PERMANENTFLAGS ()] No permanent flags permitted | S: * OK [PERMANENTFLAGS ()] No permanent flags permitted | |||
| S: A932 OK [READ-ONLY] EXAMINE completed | S: A932 OK [READ-ONLY] EXAMINE completed | |||
| </artwork></figure> | </sourcecode> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title='CREATE Command'> | <name>CREATE Command</name> | |||
| <iref item='CREATE (command)'/> | <iref item="CREATE (command)" subitem="" primary="false"/> | |||
| <dl newline="false" spacing="normal" indent="14"> | ||||
| <t> | <dt>Arguments:</dt> | |||
| <list style='hanging' hangIndent='12'> | <dd>mailbox name</dd> | |||
| <t hangText='Arguments:'>mailbox name</t> | <dt>Responses:</dt> | |||
| <dd> | ||||
| <t hangText='Responses:'>OPTIONAL untagged response: LIST</t> | <dl spacing="compact"> | |||
| <dt><bcp14>OPTIONAL</bcp14> untagged response:</dt><dd>LIST</dd> | ||||
| <t hangText='Result:'>OK - create completed<vspace/> | </dl> | |||
| NO - create failure: can't create mailbox with that name<vspace/> | </dd> | |||
| BAD - command unknown or arguments invalid</t> | <dt>Result:</dt> | |||
| </list> | <dd> | |||
| </t> | <dl spacing="compact"> | |||
| <dt>OK -</dt><dd>create completed</dd> | ||||
| <t> | <dt>NO -</dt><dd>create failure: can't create mailbox with that na | |||
| me</dd> | ||||
| <dt>BAD -</dt><dd>command unknown or arguments invalid</dd> | ||||
| </dl> | ||||
| </dd> | ||||
| </dl> | ||||
| <t> | ||||
| The CREATE command creates a mailbox with the given name. An OK | The CREATE command creates a mailbox with the given name. An OK | |||
| response is returned only if a new mailbox with that name has been | response is returned only if a new mailbox with that name has been | |||
| created. It is an error to attempt to create INBOX or a mailbox | created. It is an error to attempt to create INBOX or a mailbox | |||
| with a name that refers to an extant mailbox. Any error in | with a name that refers to an extant mailbox. Any error in | |||
| creation will return a tagged NO response. If a client attempts | creation will return a tagged NO response. If a client attempts | |||
| to create a UTF-8 mailbox name that is not a valid Net-Unicode | to create a UTF-8 mailbox name that is not a valid Net-Unicode | |||
| name, the server MUST reject the creation or convert the name to | name, the server <bcp14>MUST</bcp14> reject the creation or convert the na me to | |||
| Net-Unicode prior to creating the mailbox. | Net-Unicode prior to creating the mailbox. | |||
| If the server decides to convert (normalize) the name, | If the server decides to convert (normalize) the name, | |||
| it SHOULD return an untagged LIST with OLDNAME extended data item, | it <bcp14>SHOULD</bcp14> return an untagged LIST with an OLDNAME extended data item, | |||
| with the OLDNAME value being the supplied mailbox name and the | with the OLDNAME value being the supplied mailbox name and the | |||
| name parameter being the normalized mailbox name. | name parameter being the normalized mailbox name. | |||
| (See <xref target='oldname'/> for more details.) | (See <xref target="oldname" format="default"/> for more details.) | |||
| </t> | </t> | |||
| <t>Mailboxes created in one IMAP session <bcp14>MAY</bcp14> be announc | ||||
| <t>Mailboxes created in one IMAP session MAY be announced to other | ed to other | |||
| IMAP sessions using unsolicited LIST response. | IMAP sessions using an unsolicited LIST response. | |||
| If the server automatically subscribes a mailbox when it is created, | If the server automatically subscribes a mailbox when it is created, | |||
| then the unsolicited LIST response for each affected | then the unsolicited LIST response for each affected | |||
| subscribed mailbox name MUST include the \Subscribed attribute. | subscribed mailbox name <bcp14>MUST</bcp14> include the \Subscribed attribute | |||
| </t> | . | |||
| </t> | ||||
| <t> | <t> | |||
| If the mailbox name is suffixed with the server's hierarchy | If the mailbox name is suffixed with the server's hierarchy | |||
| separator character (as returned from the server by a LIST | separator character (as returned from the server by a LIST | |||
| command), this is a declaration that the client intends to create | command), this is a declaration that the client intends to create | |||
| mailbox names under this name in the hierarchy. Server | mailbox names under this name in the hierarchy. Server | |||
| implementations that do not require this declaration MUST ignore | implementations that do not require this declaration <bcp14>MUST</bcp14> i gnore | |||
| the declaration. In any case, the name created is without the | the declaration. In any case, the name created is without the | |||
| trailing hierarchy delimiter. | trailing hierarchy delimiter. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| If the server's hierarchy separator character appears elsewhere in | If the server's hierarchy separator character appears elsewhere in | |||
| the name, the server SHOULD create any superior hierarchical names | the name, the server <bcp14>SHOULD</bcp14> create any superior hierarchica l names | |||
| that are needed for the CREATE command to be successfully | that are needed for the CREATE command to be successfully | |||
| completed. In other words, an attempt to create "foo/bar/zap" on | completed. In other words, an attempt to create "foo/bar/zap" on | |||
| a server in which "/" is the hierarchy separator character SHOULD | a server in which "/" is the hierarchy separator character <bcp14>SHOULD</ bcp14> | |||
| create foo/ and foo/bar/ if they do not already exist. | create foo/ and foo/bar/ if they do not already exist. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | If a new mailbox is created with the same name as a mailbox that | |||
| If a new mailbox is created with the same name as a mailbox which | was deleted, its unique identifiers <bcp14>MUST</bcp14> be greater than an | |||
| was deleted, its unique identifiers MUST be greater than any | y | |||
| unique identifiers used in the previous incarnation of the mailbox | unique identifiers used in the previous incarnation of the mailbox | |||
| unless the new incarnation has a different unique identifier | unless the new incarnation has a different unique identifier | |||
| validity value. See the description of the UID command in <xref target='u id-commands'/> for more | validity value. See the description of the UID command in <xref target="u id-commands" format="default"/> for more | |||
| detail. | detail. | |||
| </t> | </t> | |||
| <figure><artwork> | ||||
| Example: C: A003 CREATE owatagusiam/ | ||||
| S: A003 OK CREATE completed | ||||
| C: A004 CREATE owatagusiam/blurdybloop | ||||
| S: A004 OK CREATE completed | ||||
| C: A005 CREATE NonNormalized | ||||
| S: * LIST () "/" "Normalized" ("OLDNAME" ("NonNormalized")) | ||||
| S: A005 OK CREATE completed | ||||
| (in the last example imagine that "NonNormalized" is | <t>Example:</t> | |||
| a non NFC normalized Unicode mailbox name and that | <sourcecode type=""> | |||
| C: A003 CREATE owatagusiam/ | ||||
| S: A003 OK CREATE completed | ||||
| C: A004 CREATE owatagusiam/blurdybloop | ||||
| S: A004 OK CREATE completed | ||||
| C: A005 CREATE NonNormalized | ||||
| S: * LIST () "/" "Normalized" ("OLDNAME" ("NonNormalized")) | ||||
| S: A005 OK CREATE completed | ||||
| </sourcecode> | ||||
| <t> | ||||
| (In the last example, imagine that "NonNormalized" is | ||||
| a non-NFC normalized Unicode mailbox name and that | ||||
| "Normalized" is its NFC normalized version.) | "Normalized" is its NFC normalized version.) | |||
| </artwork></figure> | </t> | |||
| <aside><t> | ||||
| <t><list><t> | ||||
| Note: The interpretation of this example depends on whether | Note: The interpretation of this example depends on whether | |||
| "/" was returned as the hierarchy separator from LIST. If | "/" was returned as the hierarchy separator from LIST. If | |||
| "/" is the hierarchy separator, a new level of hierarchy | "/" is the hierarchy separator, a new level of hierarchy | |||
| named "owatagusiam" with a member called "blurdybloop" is | named "owatagusiam" with a member called "blurdybloop" is | |||
| created. Otherwise, two mailboxes at the same hierarchy | created. Otherwise, two mailboxes at the same hierarchy | |||
| level are created. | level are created.</t> | |||
| </t></list></t> | </aside> | |||
| </section> | ||||
| </section> | <section numbered="true" toc="default"> | |||
| <name>DELETE Command</name> | ||||
| <section title='DELETE Command'> | <iref item="DELETE (command)" subitem="" primary="false"/> | |||
| <iref item='DELETE (command)'/> | <dl newline="false" spacing="normal" indent="14"> | |||
| <dt>Arguments:</dt> | ||||
| <t> | <dd>mailbox name</dd> | |||
| <list style='hanging' hangIndent='12'> | <dt>Responses:</dt> | |||
| <t hangText='Arguments:'>mailbox name</t> | <dd> | |||
| <dl spacing="compact"> | ||||
| <t hangText='Responses:'>OPTIONAL untagged response: LIST</t> | <dt><bcp14>OPTIONAL</bcp14> untagged response:</dt><dd>LIST</dd> | |||
| </dl> | ||||
| <t hangText='Result:'>OK - delete completed<vspace/> | </dd> | |||
| NO - delete failure: can't delete mailbox with that name<vspace/> | <dt>Result:</dt> | |||
| BAD - command unknown or arguments invalid</t> | <dd> | |||
| </list> | <dl spacing="compact"> | |||
| </t> | <dt>OK -</dt><dd>delete completed</dd> | |||
| <dt>NO -</dt><dd>delete failure: can't delete mailbox with that na | ||||
| <t> | me</dd> | |||
| <dt>BAD -</dt><dd>command unknown or arguments invalid</dd> | ||||
| </dl> | ||||
| </dd> | ||||
| </dl> | ||||
| <t> | ||||
| The DELETE command permanently removes the mailbox with the given | The DELETE command permanently removes the mailbox with the given | |||
| name. A tagged OK response is returned only if the mailbox has | name. A tagged OK response is returned only if the mailbox has | |||
| been deleted. It is an error to attempt to delete INBOX or a | been deleted. It is an error to attempt to delete INBOX or a | |||
| mailbox name that does not exist. | mailbox name that does not exist. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | The DELETE command <bcp14>MUST NOT</bcp14> remove inferior hierarchical nam | |||
| The DELETE command MUST NOT remove inferior hierarchical names. | es. | |||
| For example, if a mailbox "foo" has an inferior "foo.bar" | For example, if a mailbox "foo" has an inferior "foo.bar" | |||
| (assuming "." is the hierarchy delimiter character), removing | (assuming "." is the hierarchy delimiter character), removing | |||
| "foo" MUST NOT remove "foo.bar". It is an error to attempt to | "foo" <bcp14>MUST NOT</bcp14> remove "foo.bar". It is an error to attempt to | |||
| delete a name that has inferior hierarchical names and also has | delete a name that has inferior hierarchical names and also has | |||
| the \Noselect mailbox name attribute (see the description of the | the \Noselect mailbox name attribute (see the description of the | |||
| LIST response (<xref target='list-resp'/>) for more details). | LIST response (<xref target="list-resp" format="default"/>) for more detail | |||
| </t> | s). | |||
| </t> | ||||
| <t> | <t> | |||
| It is permitted to delete a name that has inferior hierarchical | It is permitted to delete a name that has inferior hierarchical | |||
| names and does not have the \Noselect mailbox name attribute. If | names and does not have the \Noselect mailbox name attribute. If | |||
| the server implementation does not permit deleting the name while | the server implementation does not permit deleting the name while | |||
| inferior hierarchical names exists then it SHOULD disallow the | inferior hierarchical names exist, then it <bcp14>SHOULD</bcp14> disallow the | |||
| DELETE command by returning a tagged NO response. The NO response | DELETE command by returning a tagged NO response. The NO response | |||
| SHOULD include the HASCHILDREN response code. | <bcp14>SHOULD</bcp14> include the HASCHILDREN response code. | |||
| Alternatively the server MAY allow the DELETE command, | Alternatively, the server <bcp14>MAY</bcp14> allow the DELETE command, | |||
| but sets the \Noselect mailbox name attribute for that name. | but it sets the \Noselect mailbox name attribute for that name. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | If the server returns an OK response, all messages in | |||
| If the server returns OK response, all messages in | ||||
| that mailbox are removed by the DELETE command. | that mailbox are removed by the DELETE command. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The value of the highest-used unique identifier of the deleted | The value of the highest-used unique identifier of the deleted | |||
| mailbox MUST be preserved so that a new mailbox created with the | mailbox <bcp14>MUST</bcp14> be preserved so that a new mailbox created wit h the | |||
| same name will not reuse the identifiers of the former | same name will not reuse the identifiers of the former | |||
| incarnation, unless the new incarnation has a different unique | incarnation, unless the new incarnation has a different unique | |||
| identifier validity value. See the description of the UID command | identifier validity value. See the description of the UID command | |||
| in <xref target='uid-commands'/> for more detail. | in <xref target="uid-commands" format="default"/> for more detail. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| If the server decides to convert (normalize) the mailbox name, | If the server decides to convert (normalize) the mailbox name, | |||
| it SHOULD return an untagged LIST with the "\NonExistent" attribute and | it <bcp14>SHOULD</bcp14> return an untagged LIST with the "\NonExistent" a ttribute and | |||
| OLDNAME extended data item, | OLDNAME extended data item, | |||
| with the OLDNAME value being the supplied mailbox name and the | with the OLDNAME value being the supplied mailbox name and the | |||
| name parameter being the normalized mailbox name. | name parameter being the normalized mailbox name. | |||
| (See <xref target='oldname'/> for more details.) | (See <xref target="oldname" format="default"/> for more details.) | |||
| </t> | </t> | |||
| <t>Mailboxes deleted in one IMAP session <bcp14>MAY</bcp14> be announc | ||||
| <t>Mailboxes deleted in one IMAP session MAY be announced to other IMAP | ed to other IMAP | |||
| sessions using unsolicited LIST response, containing the "\NonExistent" attri | sessions using an unsolicited LIST response, containing the "\NonExiste | |||
| bute.</t> | nt" attribute.</t> | |||
| <figure><artwork> | ||||
| Example: C: A682 LIST "" * | ||||
| S: * LIST () "/" blurdybloop | ||||
| S: * LIST (\Noselect) "/" foo | ||||
| S: * LIST () "/" foo/bar | ||||
| S: A682 OK LIST completed | ||||
| C: A683 DELETE blurdybloop | ||||
| S: A683 OK DELETE completed | ||||
| C: A684 DELETE foo | ||||
| S: A684 NO Name "foo" has inferior hierarchical names | ||||
| C: A685 DELETE foo/bar | ||||
| S: A685 OK DELETE Completed | ||||
| C: A686 LIST "" * | ||||
| S: * LIST (\Noselect) "/" foo | ||||
| S: A686 OK LIST completed | ||||
| C: A687 DELETE foo | ||||
| S: A687 OK DELETE Completed | ||||
| </artwork></figure> | ||||
| <figure><artwork> | ||||
| Example: C: A82 LIST "" * | ||||
| S: * LIST () "." blurdybloop | ||||
| S: * LIST () "." foo | ||||
| S: * LIST () "." foo.bar | ||||
| S: A82 OK LIST completed | ||||
| C: A83 DELETE blurdybloop | ||||
| S: A83 OK DELETE completed | ||||
| C: A84 DELETE foo | ||||
| S: A84 OK DELETE Completed | ||||
| C: A85 LIST "" * | ||||
| S: * LIST () "." foo.bar | ||||
| S: A85 OK LIST completed | ||||
| C: A86 LIST "" % | ||||
| S: * LIST (\Noselect) "." foo | ||||
| S: A86 OK LIST completed | ||||
| </artwork></figure> | ||||
| </section> | ||||
| <section title='RENAME Command'> | ||||
| <iref item='RENAME (command)'/> | ||||
| <t> | ||||
| <list style='hanging' hangIndent='12'> | ||||
| <t hangText='Arguments:'>existing mailbox name<vspace/> | ||||
| new mailbox name</t> | ||||
| <t hangText='Responses:'>OPTIONAL untagged response: LIST</t> | ||||
| <t hangText='Result:'>OK - rename completed<vspace/> | <t>Example:</t> | |||
| NO - rename failure: can't rename mailbox with that name,<vspace/ | <sourcecode type=""> | |||
| > | C: A682 LIST "" * | |||
| can't rename to mailbox with that name<vspace/> | S: * LIST () "/" blurdybloop | |||
| BAD - command unknown or arguments invalid</t> | S: * LIST (\Noselect) "/" foo | |||
| </list> | S: * LIST () "/" foo/bar | |||
| </t> | S: A682 OK LIST completed | |||
| C: A683 DELETE blurdybloop | ||||
| S: A683 OK DELETE completed | ||||
| C: A684 DELETE foo | ||||
| S: A684 NO Name "foo" has inferior hierarchical names | ||||
| C: A685 DELETE foo/bar | ||||
| S: A685 OK DELETE Completed | ||||
| C: A686 LIST "" * | ||||
| S: * LIST (\Noselect) "/" foo | ||||
| S: A686 OK LIST completed | ||||
| C: A687 DELETE foo | ||||
| S: A687 OK DELETE Completed | ||||
| </sourcecode> | ||||
| <t> | <t>Example:</t> | |||
| <sourcecode type=""> | ||||
| C: A82 LIST "" * | ||||
| S: * LIST () "." blurdybloop | ||||
| S: * LIST () "." foo | ||||
| S: * LIST () "." foo.bar | ||||
| S: A82 OK LIST completed | ||||
| C: A83 DELETE blurdybloop | ||||
| S: A83 OK DELETE completed | ||||
| C: A84 DELETE foo | ||||
| S: A84 OK DELETE Completed | ||||
| C: A85 LIST "" * | ||||
| S: * LIST () "." foo.bar | ||||
| S: A85 OK LIST completed | ||||
| C: A86 LIST "" % | ||||
| S: * LIST (\Noselect) "." foo | ||||
| S: A86 OK LIST completed | ||||
| </sourcecode> | ||||
| </section> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>RENAME Command</name> | ||||
| <iref item="RENAME (command)" subitem="" primary="false"/> | ||||
| <dl newline="false" spacing="normal" indent="14"> | ||||
| <dt>Arguments:</dt> | ||||
| <dd> | ||||
| <t>existing mailbox name</t> | ||||
| <t>new mailbox name</t> | ||||
| </dd> | ||||
| <dt>Responses:</dt> | ||||
| <dd> | ||||
| <dl spacing="compact"> | ||||
| <dt> <bcp14>OPTIONAL</bcp14> untagged response:</dt><dd>LIST</dd> | ||||
| </dl> | ||||
| </dd> | ||||
| <dt>Result:</dt> | ||||
| <dd> | ||||
| <dl spacing="compact"> | ||||
| <dt>OK -</dt><dd>rename completed</dd> | ||||
| <dt>NO -</dt><dd>rename failure: can't rename mailbox with that na | ||||
| me, | ||||
| can't rename to mailbox with that name</dd> | ||||
| <dt>BAD -</dt><dd>command unknown or arguments invalid</dd> | ||||
| </dl> | ||||
| </dd> | ||||
| </dl> | ||||
| <t> | ||||
| The RENAME command changes the name of a mailbox. A tagged OK | The RENAME command changes the name of a mailbox. A tagged OK | |||
| response is returned only if the mailbox has been renamed. It is | response is returned only if the mailbox has been renamed. It is | |||
| an error to attempt to rename from a mailbox name that does not | an error to attempt to rename from a mailbox name that does not | |||
| exist or to a mailbox name that already exists. Any error in | exist or to a mailbox name that already exists. Any error in | |||
| renaming will return a tagged NO response. | renaming will return a tagged NO response. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| If the name has inferior hierarchical names, then the inferior | If the name has inferior hierarchical names, then the inferior | |||
| hierarchical names MUST also be renamed. For example, a rename of | hierarchical names <bcp14>MUST</bcp14> also be renamed. For example, a re name of | |||
| "foo" to "zap" will rename "foo/bar" (assuming "/" is the | "foo" to "zap" will rename "foo/bar" (assuming "/" is the | |||
| hierarchy delimiter character) to "zap/bar". | hierarchy delimiter character) to "zap/bar". | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| If the server's hierarchy separator character appears in the new mailbox n ame, | If the server's hierarchy separator character appears in the new mailbox n ame, | |||
| the server SHOULD create any superior hierarchical names that are | the server <bcp14>SHOULD</bcp14> create any superior hierarchical names th at are | |||
| needed for the RENAME command to complete successfully. In other | needed for the RENAME command to complete successfully. In other | |||
| words, an attempt to rename "foo/bar/zap" to baz/rag/zowie on a | words, an attempt to rename "foo/bar/zap" to "baz/rag/zowie" on a | |||
| server in which "/" is the hierarchy separator character in the correspond | server in which "/" is the hierarchy separator character in the correspond | |||
| ing namespace SHOULD | ing namespace <bcp14>SHOULD</bcp14> | |||
| create baz/ and baz/rag/ if they do not already exist. | create "baz/" and "baz/rag/" if they do not already exist. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The value of the highest-used unique identifier of the old mailbox | The value of the highest-used unique identifier of the old mailbox | |||
| name MUST be preserved so that a new mailbox created with the same | name <bcp14>MUST</bcp14> be preserved so that a new mailbox created with t he same | |||
| name will not reuse the identifiers of the former incarnation, | name will not reuse the identifiers of the former incarnation, | |||
| unless the new incarnation has a different unique identifier | unless the new incarnation has a different unique identifier | |||
| validity value. See the description of the UID command in <xref target='u id-commands'/> | validity value. See the description of the UID command in <xref target="u id-commands" format="default"/> | |||
| for more detail. | for more detail. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Renaming INBOX is permitted and does not result in a tagged BAD response, | |||
| Renaming INBOX is permitted (i.e. it doesn't result in a tagged BAD respon | and it has special behavior: It moves all messages in INBOX to a new mailb | |||
| se), | ox with | |||
| and has special behavior. | the given name, leaving INBOX empty. If the server implementation support | |||
| (Note that some servers disallow renaming INBOX by returning a tagged NO r | s | |||
| esponse, so clients | ||||
| need to be able to handle such RENAME failing). It moves | ||||
| all messages in INBOX to a new mailbox with the given name, | ||||
| leaving INBOX empty. If the server implementation supports | ||||
| inferior hierarchical names of INBOX, these are unaffected by a | inferior hierarchical names of INBOX, these are unaffected by a | |||
| rename of INBOX. | rename of INBOX. | |||
| </t> | (Note that some servers disallow renaming INBOX by returning a tagged NO r | |||
| esponse, | ||||
| <t>If the server allows creation of mailboxes with names that | so clients need to be able to handle the failure of such RENAME commands.) | |||
| </t> | ||||
| <t>If the server allows creation of mailboxes with names that | ||||
| are not valid Net-Unicode names, the server normalizes | are not valid Net-Unicode names, the server normalizes | |||
| both the existing mailbox name parameter and the new mailbox name paramete r. | both the existing mailbox name parameter and the new mailbox name paramete r. | |||
| If the normalized version of any of these 2 parameters differs | If the normalized version of any of these 2 parameters differs | |||
| from the corresponding supplied version, the server SHOULD return | from the corresponding supplied version, the server <bcp14>SHOULD</bcp14> | |||
| an untagged LIST response with OLDNAME extended data item, | return | |||
| an untagged LIST response with an OLDNAME extended data item, | ||||
| with the OLDNAME value being the supplied existing mailbox name and the | with the OLDNAME value being the supplied existing mailbox name and the | |||
| name parameter being the normalized new mailbox name | name parameter being the normalized new mailbox name | |||
| (see <xref target='oldname'/>). | (see <xref target="oldname" format="default"/>). | |||
| This would allow the client to correlate the supplied name with the normal ized name. | This would allow the client to correlate the supplied name with the normal ized name. | |||
| </t> | </t> | |||
| <t>Mailboxes renamed in one IMAP session <bcp14>MAY</bcp14> be announc | ||||
| <t>Mailboxes renamed in one IMAP session MAY be announced to other IMAP sessi | ed to other IMAP sessions | |||
| ons | using an unsolicited LIST response with an OLDNAME extended data item. | |||
| using unsolicited LIST response with OLDNAME extended data item. | </t> | |||
| </t> | <t> | |||
| In both of the above cases, if the server automatically subscribes a mailbo | ||||
| <t> | x | |||
| In both of the above cases: if the server automatically subscribes a mailbo | ||||
| x | ||||
| when it is renamed, then the unsolicited LIST response for each affected | when it is renamed, then the unsolicited LIST response for each affected | |||
| subscribed mailbox name MUST include the \Subscribed attribute. | subscribed mailbox name <bcp14>MUST</bcp14> include the \Subscribed attribu | |||
| No unsolicited LIST responses need to be sent for children mailboxes, if an | te. | |||
| y. | No unsolicited LIST responses need to be sent for child mailboxes. | |||
| When INBOX is successfully renamed, a new INBOX is assumed to be created. | When INBOX is successfully renamed, it is assumed that a new INBOX is creat | |||
| ed. | ||||
| No unsolicited LIST responses need to be sent for INBOX in this case. | No unsolicited LIST responses need to be sent for INBOX in this case. | |||
| </t> | </t> | |||
| <figure><artwork> | ||||
| Examples: C: A682 LIST "" * | ||||
| S: * LIST () "/" blurdybloop | ||||
| S: * LIST (\Noselect) "/" foo | ||||
| S: * LIST () "/" foo/bar | ||||
| S: A682 OK LIST completed | ||||
| C: A683 RENAME blurdybloop sarasoop | ||||
| S: A683 OK RENAME completed | ||||
| C: A684 RENAME foo zowie | ||||
| S: A684 OK RENAME Completed | ||||
| C: A685 LIST "" * | ||||
| S: * LIST () "/" sarasoop | ||||
| S: * LIST (\Noselect) "/" zowie | ||||
| S: * LIST () "/" zowie/bar | ||||
| S: A685 OK LIST completed | ||||
| C: Z432 LIST "" * | <t>Examples:</t> | |||
| S: * LIST () "." INBOX | <sourcecode type=""> | |||
| S: * LIST () "." INBOX.bar | C: A682 LIST "" * | |||
| S: Z432 OK LIST completed | S: * LIST () "/" blurdybloop | |||
| C: Z433 RENAME INBOX old-mail | S: * LIST (\Noselect) "/" foo | |||
| S: Z433 OK RENAME completed | S: * LIST () "/" foo/bar | |||
| C: Z434 LIST "" * | S: A682 OK LIST completed | |||
| S: * LIST () "." INBOX | C: A683 RENAME blurdybloop sarasoop | |||
| S: * LIST () "." INBOX.bar | S: A683 OK RENAME completed | |||
| S: * LIST () "." old-mail | C: A684 RENAME foo zowie | |||
| S: Z434 OK LIST completed | S: A684 OK RENAME Completed | |||
| </artwork></figure> | C: A685 LIST "" * | |||
| S: * LIST () "/" sarasoop | ||||
| S: * LIST (\Noselect) "/" zowie | ||||
| S: * LIST () "/" zowie/bar | ||||
| S: A685 OK LIST completed | ||||
| <t> | C: Z432 LIST "" * | |||
| S: * LIST () "." INBOX | ||||
| S: * LIST () "." INBOX.bar | ||||
| S: Z432 OK LIST completed | ||||
| C: Z433 RENAME INBOX old-mail | ||||
| S: Z433 OK RENAME completed | ||||
| C: Z434 LIST "" * | ||||
| S: * LIST () "." INBOX | ||||
| S: * LIST () "." INBOX.bar | ||||
| S: * LIST () "." old-mail | ||||
| S: Z434 OK LIST completed | ||||
| </sourcecode> | ||||
| <t> | ||||
| Note that renaming a mailbox doesn't update subscription information | Note that renaming a mailbox doesn't update subscription information | |||
| on the original name. To keep subscription information in sync, | on the original name. To keep subscription information in sync, | |||
| the following sequence of commands can be used: | the following sequence of commands can be used: | |||
| </t> | </t> | |||
| <sourcecode type=""> | ||||
| <figure><artwork> | C: 1001 RENAME X Y | |||
| C: 1001 RENAME X Y | C: 1002 SUBSCRIBE Y | |||
| C: 1002 SUBSCRIBE Y | C: 1003 UNSUBSCRIBE X | |||
| C: 1003 UNSUBSCRIBE X | </sourcecode> | |||
| </artwork></figure> | <t> | |||
| <t> | ||||
| Note that the above sequence of commands doesn't account for updating | Note that the above sequence of commands doesn't account for updating | |||
| subscription for any children mailboxes of mailbox X. | the subscription for any child mailboxes of mailbox X. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section numbered="true" toc="default"> | |||
| <name>SUBSCRIBE Command</name> | ||||
| <section title='SUBSCRIBE Command'> | <iref item="SUBSCRIBE (command)" subitem="" primary="false"/> | |||
| <iref item='SUBSCRIBE (command)'/> | <dl newline="false" spacing="normal" indent="14"> | |||
| <dt>Arguments:</dt> | ||||
| <t> | <dd>mailbox</dd> | |||
| <list style='hanging' hangIndent='12'> | <dt>Responses:</dt> | |||
| <t hangText='Arguments:'>mailbox</t> | <dd>no specific responses for this command</dd> | |||
| <dt>Result:</dt> | ||||
| <t hangText='Responses:'>no specific responses for this command</t> | <dd> | |||
| <dl spacing="compact"> | ||||
| <t hangText='Result:'>OK - subscribe completed<vspace/> | <dt>OK -</dt><dd>subscribe completed</dd> | |||
| NO - subscribe failure: can't subscribe to that name<vspace/> | <dt>NO -</dt><dd>subscribe failure: can't subscribe to that name</ | |||
| BAD - command unknown or arguments invalid</t> | dd> | |||
| </list> | <dt>BAD -</dt><dd>command unknown or arguments invalid</dd> | |||
| </t> | </dl> | |||
| </dd> | ||||
| <t> | </dl> | |||
| <t> | ||||
| The SUBSCRIBE command adds the specified mailbox name to the | The SUBSCRIBE command adds the specified mailbox name to the | |||
| server's set of "active" or "subscribed" mailboxes as returned by | server's set of "active" or "subscribed" mailboxes as returned by | |||
| the LIST (SUBSCRIBED) command. This command returns a tagged OK response | the LIST (SUBSCRIBED) command. This command returns a tagged OK response | |||
| if the subscription is successful or if the mailbox is already subscribed. | if the subscription is successful or if the mailbox is already subscribed. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | A server <bcp14>MAY</bcp14> validate the mailbox argument to SUBSCRIBE to | |||
| A server MAY validate the mailbox argument to SUBSCRIBE to verify | verify | |||
| that it exists. However, it SHOULD NOT unilaterally remove an | that it exists. However, it <bcp14>SHOULD NOT</bcp14> unilaterally remove | |||
| an | ||||
| existing mailbox name from the subscription list even if a mailbox | existing mailbox name from the subscription list even if a mailbox | |||
| by that name no longer exists. | by that name no longer exists. | |||
| <list><t> | </t> | |||
| <aside><t> | ||||
| Note: This requirement is because a server site can | Note: This requirement is because a server site can | |||
| choose to routinely remove a mailbox with a well-known | choose to routinely remove a mailbox with a well-known | |||
| name (e.g., "system-alerts") after its contents expire, | name (e.g., "system-alerts") after its contents expire, | |||
| with the intention of recreating it when new contents | with the intention of recreating it when new contents | |||
| are appropriate. | are appropriate.</t> | |||
| </t></list> | </aside> | |||
| </t> | <t>Example:</t> | |||
| <sourcecode type=""> | ||||
| <figure><artwork> | C: A002 SUBSCRIBE #news.comp.mail.mime | |||
| Example: C: A002 SUBSCRIBE #news.comp.mail.mime | S: A002 OK SUBSCRIBE completed | |||
| S: A002 OK SUBSCRIBE completed | </sourcecode> | |||
| </artwork></figure> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| </section> | <name>UNSUBSCRIBE Command</name> | |||
| <iref item="UNSUBSCRIBE (command)" subitem="" primary="false"/> | ||||
| <section title='UNSUBSCRIBE Command'> | <dl newline="false" spacing="normal" indent="14"> | |||
| <iref item='UNSUBSCRIBE (command)'/> | <dt>Arguments:</dt> | |||
| <dd>mailbox name</dd> | ||||
| <t> | <dt>Responses:</dt> | |||
| <list style='hanging' hangIndent='12'> | <dd>no specific responses for this command</dd> | |||
| <t hangText='Arguments:'>mailbox name</t> | <dt>Result:</dt> | |||
| <dd> | ||||
| <t hangText='Responses:'>no specific responses for this command</t> | <dl spacing="compact"> | |||
| <dt>OK -</dt><dd>unsubscribe completed</dd> | ||||
| <t hangText='Result:'>OK - unsubscribe completed<vspace/> | <dt>NO -</dt><dd>unsubscribe failure: can't unsubscribe that name< | |||
| NO - unsubscribe failure: can't unsubscribe that name<vspace/> | /dd> | |||
| BAD - command unknown or arguments invalid</t> | <dt>BAD -</dt><dd>command unknown or arguments invalid</dd> | |||
| </list> | </dl> | |||
| </t> | </dd> | |||
| </dl> | ||||
| <t> | <t> | |||
| The UNSUBSCRIBE command removes the specified mailbox name from | The UNSUBSCRIBE command removes the specified mailbox name from | |||
| the server's set of "active" or "subscribed" mailboxes as returned | the server's set of "active" or "subscribed" mailboxes as returned | |||
| by the LIST (SUBSCRIBED) command. This command returns a tagged OK respon se | by the LIST (SUBSCRIBED) command. This command returns a tagged OK respon se | |||
| if the unsubscription is successful or if the mailbox is not subscribed. | if the unsubscription is successful or if the mailbox is not subscribed. | |||
| </t> | </t> | |||
| <t>Example:</t> | ||||
| <figure><artwork> | <sourcecode type=""> | |||
| Example: C: A002 UNSUBSCRIBE #news.comp.mail.mime | C: A002 UNSUBSCRIBE #news.comp.mail.mime | |||
| S: A002 OK UNSUBSCRIBE completed | S: A002 OK UNSUBSCRIBE completed | |||
| </artwork></figure> | </sourcecode> | |||
| </section> | ||||
| </section> | <section anchor="list-cmd" numbered="true" toc="default"> | |||
| <name>LIST Command</name> | ||||
| <section title='LIST Command' anchor='list-cmd'> | <iref item="LIST (command)" subitem="" primary="false"/> | |||
| <iref item='LIST (command)'/> | <dl newline="false" spacing="normal" indent="14"> | |||
| <dt>Arguments (basic):</dt> | ||||
| <t> | <dd> | |||
| <list style='hanging' hangIndent='12'> | <ul empty="true" bare="true" spacing="compact"> | |||
| <t hangText='Arguments (basic):'>reference name<vspace/> | <li>reference name</li> | |||
| mailbox name with possible wildcards</t> | <li> mailbox name with possible wildcards</li> | |||
| </ul> | ||||
| <t hangText='Arguments (extended):'>selection options (OPTIONAL)<vspace/> | </dd> | |||
| reference name<vspace/> | <dt>Arguments (extended):</dt> | |||
| mailbox patterns<vspace/> | <dd> | |||
| return options (OPTIONAL)</t> | <ul empty="true" bare="true" spacing="compact"> | |||
| <li> selection options (<bcp14>OPTIONAL</bcp14>)</li> | ||||
| <t hangText='Responses:'>untagged responses: LIST</t> | <li>reference name</li> | |||
| <li>mailbox patterns</li> | ||||
| <t hangText='Result:'>OK - list completed<vspace/> | <li>return options (<bcp14>OPTIONAL</bcp14>)</li> | |||
| NO - list failure: can't list that reference or mailbox name<vspa | </ul> | |||
| ce/> | </dd> | |||
| BAD - command unknown or arguments invalid</t> | <dt>Responses:</dt> | |||
| </list> | <dd>untagged responses: LIST</dd> | |||
| </t> | <dt>Result:</dt> | |||
| <dd> | ||||
| <t> | <dl spacing="compact"> | |||
| <dt>OK -</dt><dd>list completed</dd> | ||||
| <dt>NO -</dt><dd>list failure: can't list that reference or mailb | ||||
| ox name</dd> | ||||
| <dt>BAD -</dt><dd>command unknown or arguments invalid</dd> | ||||
| </dl> | ||||
| </dd> | ||||
| </dl> | ||||
| <t> | ||||
| The LIST command returns a subset of mailbox names from the complete set | The LIST command returns a subset of mailbox names from the complete set | |||
| of all mailbox names available to the client. Zero or more untagged LIST | of all mailbox names available to the client. Zero or more untagged LIST | |||
| responses are returned, containing the name attributes, hierarchy | responses are returned, containing the name attributes, hierarchy | |||
| delimiter, name, and possible extension information; see the description o f | delimiter, name, and possible extension information; see the description o f | |||
| the LIST response (<xref target='list-resp'/>) for more detail. | the LIST response (<xref target="list-resp" format="default"/>) for more d | |||
| </t> | etail. | |||
| </t> | ||||
| <t> | <t> | |||
| The LIST command SHOULD return its data quickly, without undue | The LIST command <bcp14>SHOULD</bcp14> return its data quickly, without un | |||
| due | ||||
| delay. For example, it should not go to excess trouble to | delay. For example, it should not go to excess trouble to | |||
| calculate the \Marked or \Unmarked status or perform other | calculate the \Marked or \Unmarked status or perform other | |||
| processing; if each name requires 1 second of processing, then a | processing; if each name requires 1 second of processing, then a | |||
| list of 1200 names would take 20 minutes! | list of 1200 names would take 20 minutes! | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | The extended LIST command, originally introduced in | |||
| The extended LIST command, originally introduced in <xref target="RFC5258" | <xref target="RFC5258" format="default"/>, | |||
| />, | ||||
| provides capabilities beyond that of the original IMAP LIST command. | provides capabilities beyond that of the original IMAP LIST command. | |||
| The extended syntax is being used if one or more of | The extended syntax is being used if one or more of | |||
| the following conditions is true: | the following conditions is true: | |||
| <?rfc compact="no" ?> | </t> | |||
| <list style="numbers"> | <ol spacing="normal" type="1"> | |||
| <t>if the first word after the command name begins with a | <li>the first word after the command name begins with a | |||
| parenthesis ("LIST selection options");</t> | parenthesis ("LIST selection options");</li> | |||
| <li>the second word after the command name begins with a | ||||
| <t>if the second word after the command name begins with a | parenthesis; and</li> | |||
| parenthesis;</t> | <li>the LIST command has more than 2 parameters ("LIST return option | |||
| s").</li> | ||||
| <t>if the LIST command has more than 2 parameters ("LIST return options" | </ol> | |||
| )</t> | <t> | |||
| </list> | ||||
| <?rfc compact="yes" ?> | ||||
| </t> | ||||
| <t> | ||||
| An empty ("" string) reference name argument indicates that the | An empty ("" string) reference name argument indicates that the | |||
| mailbox name is interpreted as by SELECT. The returned mailbox | mailbox name is interpreted as by SELECT. The returned mailbox | |||
| names MUST match the supplied mailbox name pattern(s). A non-empty | names <bcp14>MUST</bcp14> match the supplied mailbox name pattern(s). A n on-empty | |||
| reference name argument is the name of a mailbox or a level of | reference name argument is the name of a mailbox or a level of | |||
| mailbox hierarchy, and indicates the context in which the mailbox | mailbox hierarchy, and it indicates the context in which the mailbox | |||
| name is interpreted. | name is interpreted. | |||
| Clients SHOULD use the empty reference argument. | Clients <bcp14>SHOULD</bcp14> use the empty reference argument. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| In the basic syntax only, | In the basic syntax only, | |||
| an empty ("" string) mailbox name argument is a special request to | an empty ("" string) mailbox name argument is a special request to | |||
| return the hierarchy delimiter and the root name of the name given | return the hierarchy delimiter and the root name of the name given | |||
| in the reference. The value returned as the root MAY be the empty | in the reference. The value returned as the root <bcp14>MAY</bcp14> be th e empty | |||
| string if the reference is non-rooted or is an empty string. In | string if the reference is non-rooted or is an empty string. In | |||
| all cases, a hierarchy delimiter (or NIL if there is no hierarchy) | all cases, a hierarchy delimiter (or NIL if there is no hierarchy) | |||
| is returned. This permits a client to get the hierarchy delimiter | is returned. This permits a client to get the hierarchy delimiter | |||
| (or find out that the mailbox names are flat) even when no | (or find out that the mailbox names are flat) even when no | |||
| mailboxes by that name currently exist. | mailboxes by that name currently exist. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| In the extended syntax, any mailbox name arguments that are empty | In the extended syntax, any mailbox name arguments that are empty | |||
| strings are ignored. There is no special meaning for empty mailbox | strings are ignored. There is no special meaning for empty mailbox | |||
| names when the extended syntax is used. | names when the extended syntax is used. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The reference and mailbox name arguments are interpreted into a | The reference and mailbox name arguments are interpreted into a | |||
| canonical form that represents an unambiguous left-to-right | canonical form that represents an unambiguous left-to-right | |||
| hierarchy. The returned mailbox names will be in the interpreted | hierarchy. The returned mailbox names will be in the interpreted | |||
| form, <!--///Alexey: it looks like we have 2 definitions. Should | form, which we call a "canonical LIST pattern": | |||
| we standardize on one?-->that we call "canonical LIST pattern" | ||||
| later in this document. | ||||
| To define the term "canonical LIST pattern" formally: it refers to | ||||
| the canonical pattern constructed internally by the server from | the canonical pattern constructed internally by the server from | |||
| the reference and mailbox name arguments. | the reference and mailbox name arguments. | |||
| </t> | ||||
| <list> | <t indent="3"> | |||
| <t> | ||||
| Note: The interpretation of the reference argument is | Note: The interpretation of the reference argument is | |||
| implementation-defined. It depends upon whether the | implementation defined. It depends on whether the | |||
| server implementation has a concept of the "current | server implementation has a concept of the "current | |||
| working directory" and leading "break out characters", | working directory" and leading "break out characters", | |||
| which override the current working directory. | which override the current working directory. | |||
| </t> | </t> | |||
| <t indent="3"> | ||||
| <t> | For example, on a server that exports a UNIX or NT | |||
| For example, on a server which exports a UNIX or NT | file system, the reference argument contains the current | |||
| filesystem, the reference argument contains the current | working directory, and the mailbox name argument | |||
| working directory, and the mailbox name argument would | contains the name as interpreted in the current working | |||
| contain the name as interpreted in the current working | ||||
| directory. | directory. | |||
| </t> | </t> | |||
| <t indent="3"> | ||||
| <t> | ||||
| If a server implementation has no concept of break out | If a server implementation has no concept of break out | |||
| characters, the canonical form is normally the reference | characters, the canonical form is normally the reference | |||
| name appended with the mailbox name. Note that if the | name appended with the mailbox name. Note that if the | |||
| server implements the namespace convention (<xref target='namespace-c onvention'/>), | server implements the namespace convention (<xref target="namespace-c onvention" format="default"/>), | |||
| "#" is a break out character and must be treated | "#" is a break out character and must be treated | |||
| as such. | as such. | |||
| </t> | </t> | |||
| <t indent="3"> | ||||
| <t> | ||||
| If the reference argument is not a level of mailbox | If the reference argument is not a level of mailbox | |||
| hierarchy (that is, it is a \NoInferiors name), and/or | hierarchy (that is, it is a \NoInferiors name), and/or | |||
| the reference argument does not end with the hierarchy | the reference argument does not end with the hierarchy | |||
| delimiter, it is implementation-dependent how this is | delimiter, it is | |||
| interpreted. For example, a reference of "foo/bar" and | interpreted as implementation dependent. For example, a reference of | |||
| "foo/bar" and | ||||
| mailbox name of "rag/baz" could be interpreted as | mailbox name of "rag/baz" could be interpreted as | |||
| "foo/bar/rag/baz", "foo/barrag/baz", or "foo/rag/baz". | "foo/bar/rag/baz", "foo/barrag/baz", or "foo/rag/baz". | |||
| A client SHOULD NOT use such a reference argument except | A client <bcp14>SHOULD NOT</bcp14> use such a reference argument exce pt | |||
| at the explicit request of the user. A hierarchical | at the explicit request of the user. A hierarchical | |||
| browser MUST NOT make any assumptions about server | browser <bcp14>MUST NOT</bcp14> make any assumptions about server | |||
| interpretation of the reference unless the reference is | interpretation of the reference unless the reference is | |||
| a level of mailbox hierarchy AND ends with the hierarchy | a level of mailbox hierarchy AND ends with the hierarchy | |||
| delimiter. | delimiter. | |||
| </t> | </t> | |||
| </list> | <t> | |||
| </t> | ||||
| <t> | ||||
| Any part of the reference argument that is included in the | Any part of the reference argument that is included in the | |||
| interpreted form SHOULD prefix the interpreted form. It SHOULD | interpreted form <bcp14>SHOULD</bcp14> prefix the interpreted form. It <b cp14>SHOULD</bcp14> | |||
| also be in the same form as the reference name argument. This | also be in the same form as the reference name argument. This | |||
| rule permits the client to determine if the returned mailbox name | rule permits the client to determine if the returned mailbox name | |||
| is in the context of the reference argument, or if something about | is in the context of the reference argument or if something about | |||
| the mailbox argument overrode the reference argument. Without | the mailbox argument overrode the reference argument. Without | |||
| this rule, the client would have to have knowledge of the server's | this rule, the client would have to have knowledge of the server's | |||
| naming semantics including what characters are "breakouts" that | naming semantics including what characters are "breakouts" that | |||
| override a naming context. | override a naming context. | |||
| </t> | ||||
| <figure><artwork> | <t> | |||
| Here are some examples of how references | Here are some examples of how references | |||
| and mailbox names might be interpreted on a UNIX-based | and mailbox names might be interpreted on a UNIX-based | |||
| server: | server: | |||
| </t> | ||||
| Reference Mailbox Name Interpretation | <table anchor="table_1"> | |||
| ------------ ------------ -------------- | <name></name> | |||
| ~smith/Mail/ foo.* ~smith/Mail/foo.* | <thead> | |||
| archive/ % archive/% | <tr> | |||
| #news. comp.mail.* #news.comp.mail.* | <th>Reference</th> | |||
| ~smith/Mail/ /usr/doc/foo /usr/doc/foo | <th>Mailbox Name</th> | |||
| archive/ ~fred/Mail/* ~fred/Mail/* | <th>Interpretation</th> | |||
| </tr> | ||||
| The first three examples demonstrate interpretations in | </thead> | |||
| <tbody> | ||||
| <tr> | ||||
| <td>~smith/Mail/</td> | ||||
| <td>foo.* </td> | ||||
| <td>~smith/Mail/foo.*</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>archive/</td> | ||||
| <td>%</td> | ||||
| <td>archive/%</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>#news.</td> | ||||
| <td>comp.mail.*</td> | ||||
| <td>#news.comp.mail.*</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>~smith/Mail/</td> | ||||
| <td>/usr/doc/foo</td> | ||||
| <td>/usr/doc/foo</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>archive/</td> | ||||
| <td>~fred/Mail/*</td> | ||||
| <td>~fred/Mail/*</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| <t> | ||||
| The first three examples above demonstrate interpretations in | ||||
| the context of the reference argument. Note that | the context of the reference argument. Note that | |||
| "~smith/Mail" SHOULD NOT be transformed into something | "~smith/Mail" <bcp14>SHOULD NOT</bcp14> be transformed into something | |||
| like "/u2/users/smith/Mail", or it would be impossible | like "/u2/users/smith/Mail", or it would be impossible | |||
| for the client to determine that the interpretation was | for the client to determine that the interpretation was | |||
| in the context of the reference. | in the context of the reference. | |||
| </artwork></figure> | </t> | |||
| </t> | <t> | |||
| The character "*" is a wildcard and matches zero or more | ||||
| <t> | ||||
| The character "*" is a wildcard, and matches zero or more | ||||
| characters at this position. The character "%" is similar to "*", | characters at this position. The character "%" is similar to "*", | |||
| but it does not match a hierarchy delimiter. If the "%" wildcard | but it does not match a hierarchy delimiter. If the "%" wildcard | |||
| is the last character of a mailbox name argument, matching levels | is the last character of a mailbox name argument, matching levels | |||
| of hierarchy are also returned. If these levels of hierarchy are | of hierarchy are also returned. If these levels of hierarchy are | |||
| not also selectable mailboxes, they are returned with the | not also selectable mailboxes, they are returned with the | |||
| \Noselect mailbox name attribute (see the description of the LIST | \Noselect mailbox name attribute (see the description of the LIST | |||
| response (<xref target='list-resp'/>) for more details). | response (<xref target="list-resp" format="default"/>) for more details). | |||
| </t> | </t> | |||
| <t>Any syntactically valid pattern that is not accepted by a | ||||
| <t>Any syntactically valid pattern that is not accepted by a | server for any reason <bcp14>MUST</bcp14> be silently ignored, i.e., it re | |||
| server for any reason MUST be silently ignored. I.e. it results in | sults in | |||
| no LIST responses and the LIST command still returns tagged OK response. | no LIST responses, and the LIST command still returns a tagged OK response | |||
| </t> | . | |||
| </t> | ||||
| <t> | <t> | |||
| Selection options tell the server to limit the mailbox names that | Selection options tell the server to limit the mailbox names that | |||
| are selected by the LIST operation. If selection options are used, | are selected by the LIST operation. If selection options are used, | |||
| the mailboxes returned are those that match both the list of canonical LIS T | the mailboxes returned are those that match both the list of canonical LIS T | |||
| patterns and the selection options. Unless a particular selection | patterns and the selection options. Unless a particular selection | |||
| option provides special rules, the selection options are cumulative: | option provides special rules, the selection options are cumulative: | |||
| a mailbox that matches the mailbox patterns is selected only if it | a mailbox that matches the mailbox patterns is selected only if it | |||
| also matches all of the selection options. | also matches all of the selection options. | |||
| (An example of a selection option with special rules is the RECURSIVEMATCH option.) | (An example of a selection option with special rules is the RECURSIVEMATCH option.) | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| Return options control what information is returned for each matched mailb ox. | Return options control what information is returned for each matched mailb ox. | |||
| Return options MUST NOT cause the server to report information about addit ional | Return options <bcp14>MUST NOT</bcp14> cause the server to report informat ion about additional | |||
| mailbox names other than those that match the canonical LIST patterns and selection options. | mailbox names other than those that match the canonical LIST patterns and selection options. | |||
| If no return options are specified, the client is only expecting informati on | If no return options are specified, the client is only expecting informati on | |||
| about mailbox attributes. The server MAY return other information about t | about mailbox attributes. The server <bcp14>MAY</bcp14> return other info | |||
| he | rmation about the | |||
| matched mailboxes, and clients MUST be able to handle that situation. | matched mailboxes, and clients <bcp14>MUST</bcp14> be able to handle that | |||
| </t> | situation. | |||
| </t> | ||||
| <t> | <t> | |||
| Initial selection options and return options are defined in the following subsections, | Initial selection options and return options are defined in the following subsections, | |||
| and new ones will also be defined in extensions. | and new ones will also be defined in extensions. | |||
| Initial options defined in this document MUST be supported. | Initial options defined in this document <bcp14>MUST</bcp14> be supported. | |||
| Each non-initial option will be enabled by a | Each non-initial option will be enabled by a | |||
| capability string (one capability may enable multiple options), and a clie nt | capability string (one capability may enable multiple options), and a clie nt | |||
| MUST NOT send an option for which the server has not advertised support. | <bcp14>MUST NOT</bcp14> send an option for which the server has not advert | |||
| A server MUST respond to options it does not recognize with a BAD response | ised support. | |||
| . | A server <bcp14>MUST</bcp14> respond to options it does not recognize with | |||
| The client SHOULD NOT specify any option more than once; however, if the | a BAD response. | |||
| client does this, the server MUST act as if it received the option only on | The client <bcp14>SHOULD NOT</bcp14> specify any option more than once; ho | |||
| ce. | wever, if the | |||
| client does this, the server <bcp14>MUST</bcp14> act as if it received the | ||||
| option only once. | ||||
| The order in which options are specified by the client is not significant. | The order in which options are specified by the client is not significant. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| In general, each selection option except RECURSIVEMATCH will have | In general, each selection option except RECURSIVEMATCH will have | |||
| a corresponding return option with the same name. The REMOTE selection op tion is an anomaly | a corresponding return option with the same name. The REMOTE selection op tion is an anomaly | |||
| in this regard, and does not have a corresponding return option. | in this regard and does not have a corresponding return option. | |||
| That is because it expands, rather than restricts, the set of mailboxes | That is because it expands, rather than restricts, the set of mailboxes | |||
| that are returned. Future extensions to this specification should keep | that are returned. Future extensions to this specification should keep | |||
| this parallelism in mind and define a pair of corresponding | this parallelism in mind and define a pair of corresponding | |||
| selection and return options. | selection and return options. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| Server implementations are permitted to "hide" otherwise | Server implementations are permitted to "hide" otherwise | |||
| accessible mailboxes from the wildcard characters, by preventing | accessible mailboxes from the wildcard characters, by preventing | |||
| certain characters or names from matching a wildcard in certain | certain characters or names from matching a wildcard in certain | |||
| situations. For example, a UNIX-based server might restrict the | situations. For example, a UNIX-based server might restrict the | |||
| interpretation of "*" so that an initial "/" character does not | interpretation of "*" so that an initial "/" character does not | |||
| match. | match. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The special name INBOX is included in the output from LIST, if | The special name INBOX is included in the output from LIST, if | |||
| INBOX is supported by this server for this user and if the | INBOX is supported by this server for this user and if the | |||
| uppercase string "INBOX" matches the interpreted reference and | uppercase string "INBOX" matches the interpreted reference and | |||
| mailbox name arguments with wildcards as described above. The | mailbox name arguments with wildcards as described above. The | |||
| criteria for omitting INBOX is whether SELECT INBOX will return | criteria for omitting INBOX is whether SELECT INBOX will return | |||
| failure; it is not relevant whether the user's real INBOX resides | a failure; it is not relevant whether the user's real INBOX resides | |||
| on this or some other server. | on this or some other server. | |||
| </t> | </t> | |||
| <section anchor="list-select-options" numbered="true" toc="default"> | ||||
| <section title='LIST Selection Options' anchor='list-select-options'> | <name>LIST Selection Options</name> | |||
| <t>The selection options defined in this specification are as follows:</t> | <t>The selection options defined in this specification are as follow | |||
| <t> | s:</t> | |||
| <list style="hanging"> | <dl newline="true" spacing="normal"> | |||
| <t hangText="SUBSCRIBED -"> | <dt>SUBSCRIBED</dt> | |||
| causes the LIST command to list subscribed | <dd> | |||
| names, rather than the existing mailboxes. This will often | <t> | |||
| Causes the LIST command to list subscribed | ||||
| names rather than the existing mailboxes. This will often | ||||
| be a subset of the actual mailboxes. It's also possible for | be a subset of the actual mailboxes. It's also possible for | |||
| this list to contain the names of mailboxes that don't exist. | this list to contain the names of mailboxes that don't exist. | |||
| In any case, the list MUST include exactly those mailbox names | In any case, the list <bcp14>MUST</bcp14> include exactly those mailbo x names | |||
| that match the canonical list pattern and are subscribed to. | that match the canonical list pattern and are subscribed to. | |||
| <!--Removed: | </t> | |||
| This option is intended to supplement the LSUB command. | <t> | |||
| Of particular note are the mailbox attributes as returned by this | ||||
| option, compared with what is returned by LSUB. With the | ||||
| latter, the attributes returned may not reflect the actual attribute | ||||
| status on the mailbox name, and the \NoSelect attribute has a second s | ||||
| pecial | ||||
| meaning (it indicates that this mailbox is not, itself, | ||||
| subscribed, but that it has descendant mailboxes that are). | ||||
| With the SUBSCRIBED selection option described here, the attributes ar | ||||
| e | ||||
| accurate and complete, and have no special meanings. | ||||
| "LSUB" and "LIST (SUBSCRIBED)" are, thus, not the same thing, | ||||
| and some servers must do significant extra work to respond to | ||||
| "LIST (SUBSCRIBED)". Because of this, clients SHOULD continue | ||||
| to use "LSUB" unless they specifically want the additional | ||||
| information offered by "LIST (SUBSCRIBED)". | ||||
| --> | ||||
| <vspace blankLines="1"/> | ||||
| This option defines a mailbox attribute, "\Subscribed", that | This option defines a mailbox attribute, "\Subscribed", that | |||
| indicates that a mailbox name is subscribed to. The "\Subscribed" | indicates that a mailbox name is subscribed to. The "\Subscribed" | |||
| attribute MUST be supported and MUST be accurately computed | attribute <bcp14>MUST</bcp14> be supported and <bcp14>MUST</bcp14> be accurately computed | |||
| when the SUBSCRIBED selection option is specified. | when the SUBSCRIBED selection option is specified. | |||
| <vspace blankLines="1"/> | </t> | |||
| <t> | ||||
| Note that the SUBSCRIBED selection option implies the SUBSCRIBED | Note that the SUBSCRIBED selection option implies the SUBSCRIBED | |||
| return option (see below). | return option (see below). | |||
| </t> | </t> | |||
| </dd> | ||||
| <t hangText="REMOTE -"> | <dt>REMOTE</dt> | |||
| causes the LIST command to show remote mailboxes as | <dd> | |||
| well as local ones, as described in <xref target="RFC2193"/>. This op | <t> | |||
| tion | Causes the LIST command to show remote mailboxes as | |||
| well as local ones, as described in <xref target="RFC2193" format="def | ||||
| ault"/>. This option | ||||
| is intended to replace the RLIST command and, in conjunction | is intended to replace the RLIST command and, in conjunction | |||
| with the SUBSCRIBED selection option, the RLSUB command. | with the SUBSCRIBED selection option, the RLSUB command. | |||
| Servers that don't support the concept of remote mailboxes just ignore | Servers that don't support the concept of remote mailboxes can ignore | |||
| this option. | this option. | |||
| <vspace blankLines="1"/> | </t> | |||
| <t> | ||||
| This option defines a mailbox attribute, "\Remote", that | This option defines a mailbox attribute, "\Remote", that | |||
| indicates that a mailbox is a remote mailbox. The "\Remote" | indicates that a mailbox is a remote mailbox. The "\Remote" | |||
| attribute MUST be accurately computed when the REMOTE option is | attribute <bcp14>MUST</bcp14> be accurately computed when the REMOTE o ption is | |||
| specified. | specified. | |||
| <vspace blankLines="1"/> | </t> | |||
| <t> | ||||
| The REMOTE selection option has no interaction with other options. | The REMOTE selection option has no interaction with other options. | |||
| Its effect is to tell the server to apply the other options, if | Its effect is to tell the server to apply the other options, if | |||
| any, to remote mailboxes, in addition to local ones. | any, to remote mailboxes, in addition to local ones. | |||
| In particular, it has no interaction with RECURSIVEMATCH (see below). | In particular, it has no interaction with RECURSIVEMATCH (see below). | |||
| A request for (REMOTE RECURSIVEMATCH) is invalid, because a | A request for (REMOTE RECURSIVEMATCH) is invalid, because a | |||
| request for (RECURSIVEMATCH) is also invalid. A request for (REMOTE R ECURSIVEMATCH SUBSCRIBED) | request for (RECURSIVEMATCH) is also invalid. A request for (REMOTE R ECURSIVEMATCH SUBSCRIBED) | |||
| is asking for all subscribed mailboxes, both local and remote. | is asking for all subscribed mailboxes, both local and remote. | |||
| </t> | </t> | |||
| </dd> | ||||
| <t hangText="RECURSIVEMATCH -"> | <dt>RECURSIVEMATCH</dt> | |||
| this option forces the server to return | <dd> | |||
| <t> | ||||
| Forces the server to return | ||||
| information about parent mailboxes that don't match other | information about parent mailboxes that don't match other | |||
| selection options, but have some submailboxes that do. | selection options but have some submailboxes that do. | |||
| Information about children is returned in the CHILDINFO | Information about children is returned in the CHILDINFO | |||
| extended data item, as described in <xref target="childinfo"/>. | extended data item, as described in <xref target="childinfo" format="d | |||
| <vspace blankLines="1"/> | efault"/>. | |||
| Note 1: In order for a parent mailbox to be returned, it still | </t> | |||
| has to match the canonical LIST pattern. | <dl spacing="normal" newline="false"> | |||
| <vspace blankLines="1"/> | ||||
| Note 2: When returning the CHILDINFO extended data item, | <dt>Note 1:</dt><dd>In order for a parent mailbox to be returned, it s | |||
| till | ||||
| has to match the canonical LIST pattern.</dd> | ||||
| <dt>Note 2:</dt><dd>When returning the CHILDINFO extended data item, | ||||
| it doesn't matter whether or not the submailbox matches | it doesn't matter whether or not the submailbox matches | |||
| the canonical LIST pattern. See also example 9 in | the canonical LIST pattern. See also Example 9 in | |||
| <xref target="examples"/>. | <xref target="examples" format="default"/>.</dd></dl> | |||
| <vspace blankLines="1"/> | ||||
| The RECURSIVEMATCH option MUST NOT occur as the only selection | <t> | |||
| The RECURSIVEMATCH option <bcp14>MUST NOT</bcp14> occur as the only se | ||||
| lection | ||||
| option (or only with REMOTE), | option (or only with REMOTE), | |||
| as it only makes sense when other selection options are | as it only makes sense when other selection options are | |||
| also used. The server MUST return BAD tagged response in such case. | also used. The server <bcp14>MUST</bcp14> return a BAD tagged response | |||
| <vspace blankLines="1"/> | in such case. | |||
| </t> | ||||
| <t> | ||||
| Note that even if the RECURSIVEMATCH option is specified, the client | Note that even if the RECURSIVEMATCH option is specified, the client | |||
| MUST still be able to handle a case when a CHILDINFO extended | <bcp14>MUST</bcp14> still be able to handle cases when a CHILDINFO ext ended | |||
| data item is returned and there are no submailboxes | data item is returned and there are no submailboxes | |||
| that meet the selection criteria of the subsequent LIST command, | that meet the selection criteria of the subsequent LIST command, | |||
| as they can be deleted/renamed after the LIST response was sent, | as they can be deleted/renamed after the LIST response was sent | |||
| but before the client had a chance to access them. | but before the client had a chance to access them. | |||
| </t> | </t> | |||
| </list> | </dd> | |||
| </t> | </dl> | |||
| </section> | </section> | |||
| <section anchor="list-return-options" numbered="true" toc="default"> | ||||
| <section title='LIST Return Options' anchor='list-return-options'> | <name>LIST Return Options</name> | |||
| <t>The return options defined in this specification are as follows:< | ||||
| <t>The return options defined in this specification are as follows:</t> | /t> | |||
| <t> | <dl newline="true" spacing="normal"> | |||
| <list style="hanging"> | <dt>SUBSCRIBED</dt> | |||
| <t hangText="SUBSCRIBED -"> | <dd> | |||
| causes the LIST command to return subscription | <t> | |||
| Causes the LIST command to return subscription | ||||
| state for all matching mailbox names. The "\Subscribed" | state for all matching mailbox names. The "\Subscribed" | |||
| attribute MUST be supported and MUST be accurately computed | attribute <bcp14>MUST</bcp14> be supported and <bcp14>MUST</bcp14> be accurately computed | |||
| when the SUBSCRIBED return option is specified. | when the SUBSCRIBED return option is specified. | |||
| Further, all other mailbox attributes MUST be accurately computed (th | Furthermore, all other mailbox attributes <bcp14>MUST</bcp14> be accu | |||
| is | rately computed (this | |||
| differs from the behavior of the obsolete LSUB command from RFC 3501) | differs from the behavior of the obsolete LSUB command from <xref tar | |||
| . | get="RFC3501" format="default"/>). | |||
| Note that the above requirements don't override the requirement for the LIST | Note that the above requirements don't override the requirement for the LIST | |||
| command to return results quickly (see <xref target='list-cmd'/>), | command to return results quickly (see <xref target="list-cmd" format="d | |||
| i.e. server implementations need to compute results quickly and accurate | efault"/>), | |||
| ly. | i.e., server implementations need to compute results quickly and accurat | |||
| ely. | ||||
| For example, server implementors might need to create quick access indic es. | For example, server implementors might need to create quick access indic es. | |||
| <vspace blankLines="1"/></t> | </t> | |||
| </dd> | ||||
| <t hangText="CHILDREN -"> | <dt>CHILDREN</dt> | |||
| requests mailbox child information as originally | <dd> | |||
| proposed in <xref target="RFC3348"/>. | Requests mailbox child information as originally | |||
| See <xref target="children"/>, below, for details. | proposed in <xref target="RFC3348" format="default"/>. | |||
| <!--Alexey: it is a bit odd to explicitly have a MUST for this, | See <xref target="children" format="default"/>, below, for details. | |||
| despite explicitly saying earlier in the document that all options | </dd> | |||
| from this document MUST be supported. | <dt>STATUS</dt> | |||
| This option MUST be supported by all servers. | <dd> | |||
| --> | <t> | |||
| </t> | Requests STATUS response for each matching mailbox. | |||
| </t> | ||||
| <t hangText="STATUS -"> | ||||
| requests STATUS response for each matching mailbox. | ||||
| <list style="empty"> | <t>This option takes STATUS data items as parameters. For each | |||
| <t>This option takes STATUS data items as parameters. For each selec | selectable | |||
| table | ||||
| mailbox matching the list pattern and selection options, the server | mailbox matching the list pattern and selection options, the server | |||
| MUST return an untagged LIST response followed by an untagged STATUS | <bcp14>MUST</bcp14> return an untagged LIST response followed by an untagged STATUS | |||
| response containing the information requested in the STATUS return | response containing the information requested in the STATUS return | |||
| option, except for some cases described below. | option, except for some cases described below. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| If an attempted STATUS for a listed mailbox fails because the mailbo x | If an attempted STATUS for a listed mailbox fails because the mailbo x | |||
| can't be selected (e.g., if the "l" ACL right <xref target='RFC4314' /> | can't be selected (e.g., if the "l" Access Control List (ACL) right <xref target="RFC4314" format="default"/> | |||
| is granted to the | is granted to the | |||
| mailbox and the "r" right is not granted, or due to a race condition | mailbox and the "r" right is not granted, or is due to a race condit ion | |||
| between LIST and STATUS changing the mailbox to \NoSelect), the | between LIST and STATUS changing the mailbox to \NoSelect), the | |||
| STATUS response MUST NOT be returned and the LIST response MUST | STATUS response <bcp14>MUST NOT</bcp14> be returned, and the LIST re sponse <bcp14>MUST</bcp14> | |||
| include the \NoSelect attribute. This means the server may have to | include the \NoSelect attribute. This means the server may have to | |||
| buffer the LIST reply until it has successfully looked up the | buffer the LIST reply until it has successfully looked up the | |||
| necessary STATUS information. | necessary STATUS information. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| If the server runs into unexpected problems while trying to look up | If the server runs into unexpected problems while trying to look up | |||
| the STATUS information, it MAY drop the corresponding STATUS reply. | the STATUS information, it <bcp14>MAY</bcp14> drop the corresponding STATUS reply. | |||
| In such a situation, the LIST command would still return a tagged OK | In such a situation, the LIST command would still return a tagged OK | |||
| reply. | reply. | |||
| </t> | </t> | |||
| <t> | ||||
| </list> | See the note in the discussion of the STATUS command in | |||
| </t> | <xref target="status-command"/> for information about obtaining stat | |||
| us | ||||
| </list> | on the currently selected mailbox. | |||
| </t> | </t> | |||
| </section> | </dd> | |||
| </dl> | ||||
| <section anchor="general" title="General Principles for Returning LIST Resp | </section> | |||
| onses"> | <section anchor="general" numbered="true" toc="default"> | |||
| <t>This section outlines several principles that can be used by server | <name>General Principles for Returning LIST Responses</name> | |||
| <t>This section outlines several principles that can be used by serv | ||||
| er | ||||
| implementations of this document to decide whether a LIST response shoul d be | implementations of this document to decide whether a LIST response shoul d be | |||
| returned, as well as how many responses and what kind of information | returned, as well as how many responses and what kind of information | |||
| they may contain.</t> | they may contain.</t> | |||
| <ol spacing="normal" type="1"> | ||||
| <t> | <li>At most, one LIST response should be returned for each mailbox | |||
| <list style="numbers"> | ||||
| <t>At most one LIST response should be returned for each mailbox | ||||
| name that matches the canonical LIST pattern. | name that matches the canonical LIST pattern. | |||
| Server implementors must not assume that clients will be able to | Server implementors must not assume that clients will be able to | |||
| assemble mailbox attributes and other information returned in multiple | assemble mailbox attributes and other information returned in multiple | |||
| LIST responses. | LIST responses. | |||
| </t> | </li> | |||
| <li> | ||||
| <t>There are only two reasons for including a matching mailbox name | <t>There are only two reasons for including a matching mailbox n | |||
| ame | ||||
| in the responses to the LIST command (note that the server is allowed | in the responses to the LIST command (note that the server is allowed | |||
| to return unsolicited responses at any time, and such responses are no t | to return unsolicited responses at any time, and such responses are no t | |||
| governed by this rule): | governed by this rule): | |||
| <list style="letters"> | </t> | |||
| <t>The mailbox name also satisfies the selection criteria.</t> | <ol spacing="normal" type="A"><li>The mailbox name also satisfie | |||
| s the selection criteria.</li> | ||||
| <t>The mailbox name doesn't satisfy the selection criteria, but | <li> | |||
| <t>The mailbox name doesn't satisfy the selection criteria, | ||||
| but | ||||
| it has at least one descendant mailbox name that satisfies the | it has at least one descendant mailbox name that satisfies the | |||
| selection criteria and that doesn't match the canonical LIST | selection criteria and that doesn't match the canonical LIST | |||
| pattern. | pattern. | |||
| <vspace blankLines="1"/> | </t> | |||
| <t> | ||||
| For more information on this case, see the CHILDINFO extended data | For more information on this case, see the CHILDINFO extended data | |||
| item described in <xref target="childinfo"/>. Note that the CHILDIN FO extended | item described in <xref target="childinfo" format="default"/>. Note that the CHILDINFO extended | |||
| data item can only be returned when the RECURSIVEMATCH selection | data item can only be returned when the RECURSIVEMATCH selection | |||
| option is specified.</t> | option is specified.</t> | |||
| </list> | </li> | |||
| </t> | </ol> | |||
| <t>Attributes returned in the same LIST response are treated additivel | </li> | |||
| y. | <li> | |||
| <t>Attributes returned in the same LIST response are treated add | ||||
| itively. | ||||
| For example, the following response | For example, the following response | |||
| </t> | ||||
| <list style="empty"> | <sourcecode type=""> | |||
| <t>S: * LIST (\Subscribed \NonExistent) "/" "Fruit/Peach"</t> | S: * LIST (\Subscribed \NonExistent) "/" "Fruit/Peach" | |||
| </list> | </sourcecode> | |||
| <t> | ||||
| means that the "Fruit/Peach" mailbox doesn't exist, but it is | means that the "Fruit/Peach" mailbox doesn't exist, but it is | |||
| subscribed.</t> | subscribed.</t> | |||
| </list> | </li> | |||
| </t> | </ol> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Additional LIST-related Requirements on Clients"> | <name>Additional LIST-Related Requirements on Clients</name> | |||
| <t>All clients MUST treat a LIST attribute with | <t>All clients <bcp14>MUST</bcp14> treat a LIST attribute with | |||
| a stronger meaning as implying any attribute that can be inferred | a stronger meaning as implying any attribute that can be inferred | |||
| from it. (See <xref target='list-resp'/> for the list of currently defin ed attributes). | from it. (See <xref target="list-resp" format="default"/> for the list o f currently defined attributes.) | |||
| For example, the client must treat the presence of the | For example, the client must treat the presence of the | |||
| \NoInferiors attribute as if the \HasNoChildren attribute was also | \NoInferiors attribute as if the \HasNoChildren attribute was also | |||
| sent by the server. | sent by the server. | |||
| </t> | </t> | |||
| <t>The following table summarizes inference rules.</t> | ||||
| <texttable> | <table align="center"> | |||
| <preamble>The following table summarizes inference rules.</preamble> | <thead> | |||
| <tr> | ||||
| <ttcol align='center'>returned attribute</ttcol> | <th align="center">returned attribute</th> | |||
| <ttcol align='center'>implied attribute</ttcol> | <th align="center">implied attribute</th> | |||
| </tr> | ||||
| <c>\NoInferiors</c> | </thead> | |||
| <c>\HasNoChildren</c> | <tbody> | |||
| <tr> | ||||
| <c>\NonExistent</c> | <td align="center">\NoInferiors</td> | |||
| <c>\NoSelect</c> | <td align="center">\HasNoChildren</td> | |||
| </tr> | ||||
| <!--<postamble></postamble>--> | <tr> | |||
| </texttable> | <td align="center">\NonExistent</td> | |||
| <td align="center">\NoSelect</td> | ||||
| </section> | </tr> | |||
| </tbody> | ||||
| <section anchor="children" title="The CHILDREN Return Option"> | </table> | |||
| <t> | </section> | |||
| <section anchor="children" numbered="true" toc="default"> | ||||
| <name>The CHILDREN Return Option</name> | ||||
| <t> | ||||
| The CHILDREN return option is simply an indication that the client wants | The CHILDREN return option is simply an indication that the client wants | |||
| information about whether or not mailboxes contain children mailboxes; | information about whether or not mailboxes contain child mailboxes; | |||
| a server MAY provide it even if the option is not specified.</t> | a server <bcp14>MAY</bcp14> provide it even if the option is not spec | |||
| ified.</t> | ||||
| <t>Many IMAP4 clients present to the user a hierarchical view of | <t>Many IMAP clients present the user with a hierarchical view of | |||
| the mailboxes that a user has access to. Rather than initially | the mailboxes that a user has access to. Rather than initially | |||
| presenting to the user the entire mailbox hierarchy, it is often | presenting the entire mailbox hierarchy to the user, it is often | |||
| preferable to show to the user a collapsed outline list of the | preferable to show the user a collapsed outline list of the | |||
| mailbox hierarchy (particularly if there is a large number of | mailbox hierarchy (particularly if there is a large number of | |||
| mailboxes). The user can then expand the collapsed outline hierarchy | mailboxes). The user can then expand the collapsed outline hierarchy | |||
| as needed. It is common to include within the collapsed hierarchy a | as needed. It is common to include a | |||
| visual clue (such as a ''+'') to indicate that there are child | visual clue (such as a ''+'') within the collapsed hierarchy to indicate t | |||
| hat there are child | ||||
| mailboxes under a particular mailbox. When the visual clue is | mailboxes under a particular mailbox. When the visual clue is | |||
| clicked, the hierarchy list is expanded to show the child mailboxes. | clicked, the hierarchy list is expanded to show the child mailboxes. | |||
| The CHILDREN return option provides a mechanism for a client to | The CHILDREN return option provides a mechanism for a client to | |||
| efficiently determine whether a particular mailbox has children, without | efficiently determine whether a particular mailbox has children, without | |||
| issuing a LIST "" * or a LIST "" % for each mailbox name. | issuing a LIST "" * or a LIST "" % for each mailbox name. | |||
| The CHILDREN return option defines two new attributes that MUST be | The CHILDREN return option defines two new attributes that <bcp14>MUST</bc p14> be | |||
| returned within a LIST response: \HasChildren and \HasNoChildren. | returned within a LIST response: \HasChildren and \HasNoChildren. | |||
| Although these attributes MAY be returned in response to any LIST | Although these attributes <bcp14>MAY</bcp14> be returned in response to an y LIST | |||
| command, the CHILDREN return option is provided to indicate that the | command, the CHILDREN return option is provided to indicate that the | |||
| client particularly wants this information. If the CHILDREN return | client particularly wants this information. If the CHILDREN return | |||
| option is present, the server MUST return these attributes even if | option is present, the server <bcp14>MUST</bcp14> return these attributes even if | |||
| their computation is expensive.</t> | their computation is expensive.</t> | |||
| <t> | <dl newline="true" spacing="normal" indent="5"> | |||
| \HasChildren | <dt>\HasChildren</dt> | |||
| <list style="hanging" hangIndent="5"> | <dd>The presence of this attribute indicates that the | |||
| <t>The presence of this attribute indicates that the | ||||
| mailbox has child mailboxes. | mailbox has child mailboxes. | |||
| A server SHOULD NOT set this attribute if there are child | A server <bcp14>SHOULD NOT</bcp14> set this attribute if there are child | |||
| mailboxes and the user does not have permission to access any | mailboxes and the user does not have permission to access any | |||
| of them. In this case, \HasNoChildren SHOULD be used. | of them. In this case, \HasNoChildren <bcp14>SHOULD</bcp14> be used. | |||
| In many cases, however, a server may not be able to efficiently | In many cases, however, a server may not be able to efficiently | |||
| compute whether a user has access to any child mailbox. | compute whether a user has access to any child mailbox. | |||
| Note that even though the \HasChildren attribute for a mailbox | Note that even though the \HasChildren attribute for a mailbox | |||
| must be correct at the time of processing of the mailbox, a client | must be correct at the time of processing the mailbox, a client | |||
| must be prepared to deal with a situation when a mailbox is marked | must be prepared to deal with a situation when a mailbox is marked | |||
| with the \HasChildren attribute, but no child mailbox appears in the | with the \HasChildren attribute, but no child mailbox appears in the | |||
| response to the LIST command. This might happen, for example, due to | response to the LIST command. This might happen, for example, due to | |||
| children mailboxes being deleted or made inaccessible to the user | child mailboxes being deleted or made inaccessible to the user | |||
| (using access control) by another client before the server is able to | (using access control) by another client before the server is able to | |||
| list them.</t> | list them.</dd> | |||
| </list> | ||||
| <vspace blankLines="1"/> | ||||
| \HasNoChildren | <dt>\HasNoChildren</dt> | |||
| <list style="hanging" hangIndent="5"> | <dd>The presence of this attribute indicates that the | |||
| <t>The presence of this attribute indicates that the | ||||
| mailbox has NO child mailboxes that are accessible to the | mailbox has NO child mailboxes that are accessible to the | |||
| currently authenticated user.</t> | currently authenticated user.</dd> | |||
| </list> | </dl> | |||
| </t> | ||||
| <t>It is an error for the server to return both a | <t>It is an error for the server to return both a | |||
| \HasChildren and a \HasNoChildren attribute in the same LIST response.</t> | \HasChildren and a \HasNoChildren attribute in the same LIST response | |||
| .</t> | ||||
| <t>Note: the \HasNoChildren attribute should not be confused with the | <t>Note: the \HasNoChildren attribute should not be confused with | |||
| the \NoInferiors attribute, which indicates | the \NoInferiors attribute, which indicates | |||
| that no child mailboxes exist now and none can be created in the future.</ t> | that no child mailboxes exist now and none can be created in the future.</ t> | |||
| </section> | </section> | |||
| <section anchor="childinfo" numbered="true" toc="default"> | ||||
| <section anchor="childinfo" title="CHILDINFO Extended Data Item"> | <name>CHILDINFO Extended Data Item</name> | |||
| <t>The CHILDINFO extended data item MUST NOT be returned unless the clie | <t>The CHILDINFO extended data item <bcp14>MUST NOT</bcp14> be retur | |||
| nt | ned unless the client | |||
| has specified the RECURSIVEMATCH selection option.</t> | has specified the RECURSIVEMATCH selection option.</t> | |||
| <t>The CHILDINFO extended data item in a LIST response describes the | ||||
| <t>The CHILDINFO extended data item in a LIST response describes the | ||||
| selection criteria that has caused it to be returned and indicates that | selection criteria that has caused it to be returned and indicates that | |||
| the mailbox has at least one descendant mailbox that matches the selecti on | the mailbox has at least one descendant mailbox that matches the selecti on | |||
| criteria.</t> | criteria.</t> | |||
| <!-- | ||||
| <t>The LSUB command indicates this condition by using the "\NoSelect" | ||||
| attribute, but the LIST (SUBSCRIBED) command MUST NOT do that, since | ||||
| "\NoSelect" retains its original meaning here. Further, the CHILDINFO | ||||
| extended data item is more general, in that it can be used with any | ||||
| extended set of selection criteria.</t> | ||||
| <t>Note: Some servers allow for mailboxes to exist without requiring | <t>Note: Some servers allow for mailboxes to exist without requiring | |||
| their parent to exist. For example, a mailbox "Customers/ABC" can exist | their parent to exist. For example, the mailbox "Customers/ABC" can exis | |||
| while the mailbox "Customers" does not. As CHILDINFO extended data | t | |||
| while the mailbox "Customers" does not. As the CHILDINFO extended data | ||||
| item is not allowed if the RECURSIVEMATCH selection option is not specif ied, | item is not allowed if the RECURSIVEMATCH selection option is not specif ied, | |||
| such servers SHOULD use the "\NonExistent \HasChildren" attribute pair t o signal | such servers <bcp14>SHOULD</bcp14> use the "\NonExistent \HasChildren" a ttribute pair to signal | |||
| to the client that there is a descendant mailbox that matches the select ion | to the client that there is a descendant mailbox that matches the select ion | |||
| criteria. See example 11 in <xref target="examples"/>.</t> | criteria. See Example 11 in <xref target="examples" format="default"/>.< /t> | |||
| <t>The returned selection criteria allow the client to distinguish | <t>The returned selection criteria allows the client to distinguish | |||
| a solicited response from an unsolicited one, as well as to distinguish | a solicited response from an unsolicited one, as well as to distinguish | |||
| among solicited responses caused by multiple pipelined LIST commands | among solicited responses caused by multiple pipelined LIST commands | |||
| that specify different criteria.</t> | that specify different criteria.</t> | |||
| <t>Servers SHOULD only return a non-matching mailbox name along with | <t>Servers <bcp14>SHOULD</bcp14> only return a non-matching mailbox name along with | |||
| CHILDINFO if at least one matching child is not also being returned. | CHILDINFO if at least one matching child is not also being returned. | |||
| That is, servers SHOULD suppress redundant CHILDINFO responses. | That is, servers <bcp14>SHOULD</bcp14> suppress redundant CHILDINFO resp | |||
| </t> | onses. | |||
| </t> | ||||
| <t>Examples 8 and 10 in <xref target="examples"/> demonstrate the differ | <t>Examples 8 and 10 in <xref target="examples" format="default"/> d | |||
| ence between | emonstrate the difference between | |||
| present CHILDINFO extended data item and the "\HasChildren" attribute.</ | the present CHILDINFO extended data item and the "\HasChildren" attribut | |||
| t> | e.</t> | |||
| <t>The following table summarizes interaction between the "\NonExist | ||||
| <texttable> | ent" | |||
| <preamble>The following table summarizes interaction between the "\Non | ||||
| Existent" | ||||
| attribute and CHILDINFO (the first column indicates whether the parent | attribute and CHILDINFO (the first column indicates whether the parent | |||
| mailbox exists):</preamble> | mailbox exists):</t> | |||
| <ttcol align='center'>exists</ttcol> | ||||
| <ttcol align='center'>meets the selection criteria</ttcol> | ||||
| <ttcol align='center'>has a child that meets the selection criteria</t | ||||
| tcol> | ||||
| <ttcol align='center'>returned IMAP4rev2/LIST-EXTENDED attributes and | ||||
| CHILDINFO</ttcol> | ||||
| <c>no</c> | ||||
| <c>no</c> | ||||
| <c>no</c> | ||||
| <c>no LIST response returned</c> | ||||
| <c>yes</c> | ||||
| <c>no</c> | ||||
| <c>no</c> | ||||
| <c>no LIST response returned</c> | ||||
| <c>no</c> | ||||
| <c>yes</c> | ||||
| <c>no</c> | ||||
| <c>(\NonExistent <attr>)</c> | ||||
| <c>yes</c> | ||||
| <c>yes</c> | ||||
| <c>no</c> | ||||
| <c>(<attr>)</c> | ||||
| <c>no</c> | ||||
| <c>no</c> | ||||
| <c>yes</c> | ||||
| <c>(\NonExistent) + CHILDINFO</c> | ||||
| <c>yes</c> | ||||
| <c>no</c> | ||||
| <c>yes</c> | ||||
| <c>() + CHILDINFO</c> | ||||
| <c>no</c> | ||||
| <c>yes</c> | ||||
| <c>yes</c> | ||||
| <c>(\NonExistent <attr>) + CHILDINFO</c> | ||||
| <c>yes</c> | ||||
| <c>yes</c> | ||||
| <c>yes</c> | ||||
| <c>(<attr>) + CHILDINFO</c> | ||||
| <postamble>where <attr> is one or more attributes that correspon | ||||
| d to the | ||||
| selection criteria; for example, for the SUBSCRIBED option the <att | ||||
| r> | ||||
| is \Subscribed.</postamble> | ||||
| </texttable> | ||||
| </section> | ||||
| <section anchor="oldname" title="OLDNAME Extended Data Item"> | ||||
| <t>The OLDNAME extended data item is included when | <table align="center"> | |||
| a mailbox name is created (with CREATE command), renamed (with RENAME co | <thead> | |||
| mmand) | <tr> | |||
| or deleted (with DELETE command). (When a mailbox is deleted the "\NonEx | <th align="center">Exists</th> | |||
| istent" attribute | <th align="center">Meets the selection criteria</th> | |||
| <th align="center">Has a child that meets the selection criter | ||||
| ia</th> | ||||
| <th align="center">Returned IMAP4rev2/LIST-EXTENDED attributes | ||||
| and CHILDINFO</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td align="center">no</td> | ||||
| <td align="center">no</td> | ||||
| <td align="center">no</td> | ||||
| <td align="center">no LIST response returned</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">yes</td> | ||||
| <td align="center">no</td> | ||||
| <td align="center">no</td> | ||||
| <td align="center">no LIST response returned</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">no</td> | ||||
| <td align="center">yes</td> | ||||
| <td align="center">no</td> | ||||
| <td align="center">(\NonExistent <attr>)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">yes</td> | ||||
| <td align="center">yes</td> | ||||
| <td align="center">no</td> | ||||
| <td align="center">(<attr>)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">no</td> | ||||
| <td align="center">no</td> | ||||
| <td align="center">yes</td> | ||||
| <td align="center">(\NonExistent) + CHILDINFO</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">yes</td> | ||||
| <td align="center">no</td> | ||||
| <td align="center">yes</td> | ||||
| <td align="center">() + CHILDINFO</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">no</td> | ||||
| <td align="center">yes</td> | ||||
| <td align="center">yes</td> | ||||
| <td align="center">(\NonExistent <attr>) + CHILDINFO</td | ||||
| > | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">yes</td> | ||||
| <td align="center">yes</td> | ||||
| <td align="center">yes</td> | ||||
| <td align="center">(<attr>) + CHILDINFO</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| <t>where <attr> is one or more attributes that correspond to t | ||||
| he | ||||
| selection criteria; for example, for the SUBSCRIBED option, the <at | ||||
| tr> | ||||
| is \Subscribed.</t> | ||||
| </section> | ||||
| <section anchor="oldname" numbered="true" toc="default"> | ||||
| <name>OLDNAME Extended Data Item</name> | ||||
| <t>The OLDNAME extended data item is included when | ||||
| a mailbox name is created (with the CREATE command), renamed (with the R | ||||
| ENAME command), | ||||
| or deleted (with the DELETE command). (When a mailbox is deleted, the "\ | ||||
| NonExistent" attribute | ||||
| is also included.) IMAP extensions can specify other conditions when | is also included.) IMAP extensions can specify other conditions when | |||
| OLDNAME extended data item should be included.</t> | the OLDNAME extended data item should be included.</t> | |||
| <t>If the server allows de-normalized mailbox names (see <xref target="m | ||||
| ailbox-naming"/>) | ||||
| in SELECT/EXAMINE, CREATE, RENAME or DELETE, it SHOULD return an unsolic | ||||
| ited LIST response | ||||
| that includes OLDNAME extended data item, whenever the supplied mailbox | ||||
| name differs from | ||||
| the resulting normalized mailbox name. From the client point of view thi | ||||
| s is indistinguishable | ||||
| from another user renaming or deleting the mailbox, as specified in the | ||||
| previous paragraph.</t> | ||||
| <t> | ||||
| <figure><artwork> | ||||
| A deleted mailbox can be announced like this: | ||||
| S: * LIST (\NonExistent) "." "INBOX.DeletedMailbox" | ||||
| Example of a renamed mailbox: | ||||
| S: * LIST () "/" "NewMailbox" ("OLDNAME" ("OldMailbox")) | ||||
| </artwork></figure> | ||||
| </t> | ||||
| </section> | <t>If the server allows denormalized mailbox names (see <xref target | |||
| ="mailbox-naming" format="default"/>) | ||||
| in SELECT/EXAMINE, CREATE, RENAME, or DELETE, it <bcp14>SHOULD</bcp14> r | ||||
| eturn an unsolicited LIST response | ||||
| that includes the OLDNAME extended data item, whenever the supplied mail | ||||
| box name differs from | ||||
| the resulting normalized mailbox name. From the client point of view, th | ||||
| is is indistinguishable | ||||
| from another user renaming or deleting the mailbox, as specified in | ||||
| the previous paragraph.</t> | ||||
| <section anchor="examples" title='LIST Command Examples'> | <t> | |||
| A deleted mailbox can be announced as follows: | ||||
| </t> | ||||
| <sourcecode type=""> | ||||
| S: * LIST (\NonExistent) "." "INBOX.DeletedMailbox" | ||||
| </sourcecode> | ||||
| <t> | <t> | |||
| This example shows some uses of the basic LIST command: | Example of a renamed mailbox: | |||
| <figure><artwork> | ||||
| Example: C: A101 LIST "" "" | ||||
| S: * LIST (\Noselect) "/" "" | ||||
| S: A101 OK LIST Completed | ||||
| C: A102 LIST #news.comp.mail.misc "" | ||||
| S: * LIST (\Noselect) "." #news. | ||||
| S: A102 OK LIST Completed | ||||
| C: A103 LIST /usr/staff/jones "" | ||||
| S: * LIST (\Noselect) "/" / | ||||
| S: A103 OK LIST Completed | ||||
| C: A202 LIST ~/Mail/ % | ||||
| S: * LIST (\Noselect) "/" ~/Mail/foo | ||||
| S: * LIST () "/" ~/Mail/meetings | ||||
| S: A202 OK LIST completed | ||||
| </artwork></figure> | ||||
| </t> | </t> | |||
| <sourcecode type=""> | ||||
| S: * LIST () "/" "NewMailbox" ("OLDNAME" ("OldMailbox")) | ||||
| </sourcecode> | ||||
| </section> | ||||
| <t> | <section anchor="examples" numbered="true" toc="default"> | |||
| <name>LIST Command Examples</name> | ||||
| <t> | ||||
| This example shows some uses of the basic LIST command: | ||||
| </t> | ||||
| <t> | ||||
| Example: | ||||
| </t> | ||||
| <sourcecode type=""> | ||||
| C: A101 LIST "" "" | ||||
| S: * LIST (\Noselect) "/" "" | ||||
| S: A101 OK LIST Completed | ||||
| C: A102 LIST #news.comp.mail.misc "" | ||||
| S: * LIST (\Noselect) "." #news. | ||||
| S: A102 OK LIST Completed | ||||
| C: A103 LIST /usr/staff/jones "" | ||||
| S: * LIST (\Noselect) "/" / | ||||
| S: A103 OK LIST Completed | ||||
| C: A202 LIST ~/Mail/ % | ||||
| S: * LIST (\Noselect) "/" ~/Mail/foo | ||||
| S: * LIST () "/" ~/Mail/meetings | ||||
| S: A202 OK LIST completed | ||||
| </sourcecode> | ||||
| <t> | ||||
| Extended examples: | Extended examples: | |||
| <list style="format %d:" counter="Examples" hangIndent="0"> | </t> | |||
| <!-- ================================================== --> | ||||
| <t> | <ol group="Examples" spacing="normal" type="%d:"> | |||
| <li> | ||||
| <t> | ||||
| The first example shows the complete local hierarchy that will be | The first example shows the complete local hierarchy that will be | |||
| used for the other examples. | used for the other examples. | |||
| <figure><artwork> | </t> | |||
| C: A01 LIST "" "*" | <sourcecode type=""> | |||
| S: * LIST (\Marked \NoInferiors) "/" "inbox" | C: A01 LIST "" "*" | |||
| S: * LIST () "/" "Fruit" | S: * LIST (\Marked \NoInferiors) "/" "inbox" | |||
| S: * LIST () "/" "Fruit/Apple" | S: * LIST () "/" "Fruit" | |||
| S: * LIST () "/" "Fruit/Banana" | S: * LIST () "/" "Fruit/Apple" | |||
| S: * LIST () "/" "Tofu" | S: * LIST () "/" "Fruit/Banana" | |||
| S: * LIST () "/" "Vegetable" | S: * LIST () "/" "Tofu" | |||
| S: * LIST () "/" "Vegetable/Broccoli" | S: * LIST () "/" "Vegetable" | |||
| S: * LIST () "/" "Vegetable/Corn" | S: * LIST () "/" "Vegetable/Broccoli" | |||
| S: A01 OK done | S: * LIST () "/" "Vegetable/Corn" | |||
| </artwork></figure> | S: A01 OK done | |||
| </t> | </sourcecode> | |||
| </li> | ||||
| <!-- ================================================== --> | <li> | |||
| <t> | <t> | |||
| In the next example, we will see the subscribed mailboxes. This is | In the next example, we will see the subscribed mailboxes. This is | |||
| similar to, but not equivalent with now deprecated, <LSUB "" "*"> | similar to, but not equivalent with, the now deprecated <LSUB "" "*"& | |||
| (see <xref target="RFC3501"/> for more details on LSUB command). Note th | gt; | |||
| at the mailbox | (see <xref target="RFC3501" format="default"/> for more details on the L | |||
| called "Fruit/Peach" is subscribed to, but does not actually exist | SUB command). Note that the mailbox | |||
| called "Fruit/Peach" is subscribed to, but it does not actually exist | ||||
| (perhaps it was deleted while still subscribed). The "Fruit" | (perhaps it was deleted while still subscribed). The "Fruit" | |||
| mailbox is not subscribed to, but it has two subscribed children. | mailbox is not subscribed to, but it has two subscribed children. | |||
| The "Vegetable" mailbox is subscribed and has two children; one | The "Vegetable" mailbox is subscribed and has two children; one | |||
| of them is subscribed as well. | of them is subscribed as well. | |||
| <figure><artwork> | </t> | |||
| C: A02 LIST (SUBSCRIBED) "" "*" | <sourcecode type=""> | |||
| S: * LIST (\Marked \NoInferiors \Subscribed) "/" "inbox" | C: A02 LIST (SUBSCRIBED) "" "*" | |||
| S: * LIST (\Subscribed) "/" "Fruit/Banana" | S: * LIST (\Marked \NoInferiors \Subscribed) "/" "inbox" | |||
| S: * LIST (\Subscribed \NonExistent) "/" "Fruit/Peach" | S: * LIST (\Subscribed) "/" "Fruit/Banana" | |||
| S: * LIST (\Subscribed) "/" "Vegetable" | S: * LIST (\Subscribed \NonExistent) "/" "Fruit/Peach" | |||
| S: * LIST (\Subscribed) "/" "Vegetable/Broccoli" | S: * LIST (\Subscribed) "/" "Vegetable" | |||
| S: A02 OK done | S: * LIST (\Subscribed) "/" "Vegetable/Broccoli" | |||
| </artwork></figure> | S: A02 OK done | |||
| </t> | </sourcecode> | |||
| </li> | ||||
| <!-- ================================================== --> | <li> | |||
| <t> | <t> | |||
| The next example shows the use of the CHILDREN option. The client, | The next example shows the use of the CHILDREN option. The client, | |||
| without having to list the second level of hierarchy, now knows which | without having to list the second level of hierarchy, now knows which | |||
| of the top-level mailboxes have submailboxes (children) and which do | of the top-level mailboxes have submailboxes (children) and which do | |||
| not. Note that it's not necessary for the server to return the | not. Note that it's not necessary for the server to return the | |||
| \HasNoChildren attribute for the inbox, because the \NoInferiors attribu te | \HasNoChildren attribute for the inbox, because the \NoInferiors attribu te | |||
| already implies that, and has a stronger meaning. | already implies that and has a stronger meaning. | |||
| <figure><artwork> | </t> | |||
| C: A03 LIST () "" "%" RETURN (CHILDREN) | <sourcecode type=""> | |||
| S: * LIST (\Marked \NoInferiors) "/" "inbox" | C: A03 LIST () "" "%" RETURN (CHILDREN) | |||
| S: * LIST (\HasChildren) "/" "Fruit" | S: * LIST (\Marked \NoInferiors) "/" "inbox" | |||
| S: * LIST (\HasNoChildren) "/" "Tofu" | S: * LIST (\HasChildren) "/" "Fruit" | |||
| S: * LIST (\HasChildren) "/" "Vegetable" | S: * LIST (\HasNoChildren) "/" "Tofu" | |||
| S: A03 OK done | S: * LIST (\HasChildren) "/" "Vegetable" | |||
| </artwork></figure> | S: A03 OK done | |||
| </t> | </sourcecode> | |||
| </li> | ||||
| <!-- ================================================== --> | <li> | |||
| <t> | <t> | |||
| In this example, we see more mailboxes that reside on another server. | In this example, we see more mailboxes that reside on another server. | |||
| This is similar to the command | This is similar to the command | |||
| <RLIST "" "%">. | <RLIST "" "%">. | |||
| <figure><artwork> | </t> | |||
| C: A04 LIST (REMOTE) "" "%" RETURN (CHILDREN) | <sourcecode type=""> | |||
| S: * LIST (\Marked \NoInferiors) "/" "inbox" | C: A04 LIST (REMOTE) "" "%" RETURN (CHILDREN) | |||
| S: * LIST (\HasChildren) "/" "Fruit" | S: * LIST (\Marked \NoInferiors) "/" "inbox" | |||
| S: * LIST (\HasNoChildren) "/" "Tofu" | S: * LIST (\HasChildren) "/" "Fruit" | |||
| S: * LIST (\HasChildren) "/" "Vegetable" | S: * LIST (\HasNoChildren) "/" "Tofu" | |||
| S: * LIST (\Remote \HasNoChildren) "/" "Bread" | S: * LIST (\HasChildren) "/" "Vegetable" | |||
| S: * LIST (\HasChildren \Remote) "/" "Meat" | S: * LIST (\Remote \HasNoChildren) "/" "Bread" | |||
| S: A04 OK done | S: * LIST (\HasChildren \Remote) "/" "Meat" | |||
| </artwork></figure> | S: A04 OK done | |||
| </t> | </sourcecode> | |||
| </li> | ||||
| <!-- ================================================== --> | <li> | |||
| <t> | <t> | |||
| The following example also requests the server to include mailboxes | The following example also requests the server to include mailboxes | |||
| that reside on another server. The server returns information about | that reside on another server. The server returns information about | |||
| all mailboxes that are subscribed. This is similar to the command | all mailboxes that are subscribed. This is similar to the command | |||
| <RLSUB "" "*"> (see <xref target="RFC2193"/> for more details | <RLSUB "" "*"> (see <xref target="RFC2193" format="default"/> for more details | |||
| on RLSUB). We also see the use of two selection options. | on RLSUB). We also see the use of two selection options. | |||
| <figure><artwork> | </t> | |||
| C: A05 LIST (REMOTE SUBSCRIBED) "" "*" | <sourcecode type=""> | |||
| S: * LIST (\Marked \NoInferiors \Subscribed) "/" "inbox" | C: A05 LIST (REMOTE SUBSCRIBED) "" "*" | |||
| S: * LIST (\Subscribed) "/" "Fruit/Banana" | S: * LIST (\Marked \NoInferiors \Subscribed) "/" "inbox" | |||
| S: * LIST (\Subscribed \NonExistent) "/" "Fruit/Peach" | S: * LIST (\Subscribed) "/" "Fruit/Banana" | |||
| S: * LIST (\Subscribed) "/" "Vegetable" | S: * LIST (\Subscribed \NonExistent) "/" "Fruit/Peach" | |||
| S: * LIST (\Subscribed) "/" "Vegetable/Broccoli" | S: * LIST (\Subscribed) "/" "Vegetable" | |||
| S: * LIST (\Remote \Subscribed) "/" "Bread" | S: * LIST (\Subscribed) "/" "Vegetable/Broccoli" | |||
| S: A05 OK done | S: * LIST (\Remote \Subscribed) "/" "Bread" | |||
| </artwork></figure> | S: A05 OK done | |||
| </t> | </sourcecode> | |||
| </li> | ||||
| <!-- ================================================== --> | <li> | |||
| <t> | <t> | |||
| The following example requests the server to include mailboxes | The following example requests the server to include mailboxes | |||
| that reside on another server. The server is asked to return | that reside on another server. The server is asked to return | |||
| subscription information for all returned mailboxes. | subscription information for all returned mailboxes. | |||
| This is different from the example above. | This is different from the example above. | |||
| <vspace blankLines="1"/> | </t> | |||
| <t> | ||||
| Note that the output of this command is not a superset of the output | Note that the output of this command is not a superset of the output | |||
| in the previous example, as it doesn't include LIST response for the | in the previous example, as it doesn't include a LIST response for the | |||
| non-existent "Fruit/Peach". | non-existent "Fruit/Peach". | |||
| <figure><artwork> | </t> | |||
| C: A06 LIST (REMOTE) "" "*" RETURN (SUBSCRIBED) | <sourcecode type=""> | |||
| S: * LIST (\Marked \NoInferiors \Subscribed) "/" "inbox" | C: A06 LIST (REMOTE) "" "*" RETURN (SUBSCRIBED) | |||
| S: * LIST () "/" "Fruit" | S: * LIST (\Marked \NoInferiors \Subscribed) "/" "inbox" | |||
| S: * LIST () "/" "Fruit/Apple" | S: * LIST () "/" "Fruit" | |||
| S: * LIST (\Subscribed) "/" "Fruit/Banana" | S: * LIST () "/" "Fruit/Apple" | |||
| S: * LIST () "/" "Tofu" | S: * LIST (\Subscribed) "/" "Fruit/Banana" | |||
| S: * LIST (\Subscribed) "/" "Vegetable" | S: * LIST () "/" "Tofu" | |||
| S: * LIST (\Subscribed) "/" "Vegetable/Broccoli" | S: * LIST (\Subscribed) "/" "Vegetable" | |||
| S: * LIST () "/" "Vegetable/Corn" | S: * LIST (\Subscribed) "/" "Vegetable/Broccoli" | |||
| S: * LIST (\Remote \Subscribed) "/" "Bread" | S: * LIST () "/" "Vegetable/Corn" | |||
| S: * LIST (\Remote) "/" "Meat" | S: * LIST (\Remote \Subscribed) "/" "Bread" | |||
| S: A06 OK done | S: * LIST (\Remote) "/" "Meat" | |||
| </artwork></figure> | S: A06 OK done | |||
| </t> | </sourcecode> | |||
| </li> | ||||
| <!-- ================================================== --> | <li> | |||
| <t> | <t> | |||
| The following example demonstrates the difference between the | The following example demonstrates the difference between the | |||
| \HasChildren attribute and the CHILDINFO extended data item. | \HasChildren attribute and the CHILDINFO extended data item. | |||
| <vspace blankLines="1"/> | </t> | |||
| <t> | ||||
| Let's assume there is the following hierarchy: | Let's assume there is the following hierarchy: | |||
| <figure><artwork> | </t> | |||
| C: C01 LIST "" "*" | <sourcecode type=""> | |||
| S: * LIST (\Marked \NoInferiors) "/" "inbox" | C: C01 LIST "" "*" | |||
| S: * LIST () "/" "Foo" | S: * LIST (\Marked \NoInferiors) "/" "inbox" | |||
| S: * LIST () "/" "Foo/Bar" | S: * LIST () "/" "Foo" | |||
| S: * LIST () "/" "Foo/Baz" | S: * LIST () "/" "Foo/Bar" | |||
| S: * LIST () "/" "Moo" | S: * LIST () "/" "Foo/Baz" | |||
| S: C01 OK done | S: * LIST () "/" "Moo" | |||
| </artwork></figure> | S: C01 OK done | |||
| </sourcecode> | ||||
| <t> | ||||
| If the client asks RETURN (CHILDREN), it will get this: | If the client asks RETURN (CHILDREN), it will get this: | |||
| </t> | ||||
| <figure><artwork> | <sourcecode type=""> | |||
| C: CA3 LIST "" "%" RETURN (CHILDREN) | C: CA3 LIST "" "%" RETURN (CHILDREN) | |||
| S: * LIST (\Marked \NoInferiors) "/" "inbox" | S: * LIST (\Marked \NoInferiors) "/" "inbox" | |||
| S: * LIST (\HasChildren) "/" "Foo" | S: * LIST (\HasChildren) "/" "Foo" | |||
| S: * LIST (\HasNoChildren) "/" "Moo" | S: * LIST (\HasNoChildren) "/" "Moo" | |||
| S: CA3 OK done | S: CA3 OK done | |||
| </artwork></figure> | </sourcecode> | |||
| <ol spacing="normal" type="%C)"> | ||||
| A) Let's also assume that the mailbox "Foo/Baz" is the only | <li><t> | |||
| Let's also assume that the mailbox "Foo/Baz" is the only | ||||
| subscribed mailbox. Then we get this result: | subscribed mailbox. Then we get this result: | |||
| <figure><artwork> | </t> | |||
| C: C02 LIST (SUBSCRIBED) "" "*" | <sourcecode type=""> | |||
| S: * LIST (\Subscribed) "/" "Foo/Baz" | C: C02 LIST (SUBSCRIBED) "" "*" | |||
| S: C02 OK done | S: * LIST (\Subscribed) "/" "Foo/Baz" | |||
| </artwork></figure> | S: C02 OK done | |||
| </sourcecode> | ||||
| <t> | ||||
| Now, if the client issues <LIST (SUBSCRIBED) "" "%">, the server w ill | Now, if the client issues <LIST (SUBSCRIBED) "" "%">, the server w ill | |||
| return no mailboxes (as the mailboxes "Moo", "Foo", and "Inbox" are NOT | return no mailboxes (as the mailboxes "Moo", "Foo", and "Inbox" are NOT | |||
| subscribed). However, if the client issues this: | subscribed). However, if the client issues this: | |||
| <figure><artwork> | </t> | |||
| C: C04 LIST (SUBSCRIBED RECURSIVEMATCH) "" "%" | <sourcecode type=""> | |||
| S: * LIST () "/" "Foo" ("CHILDINFO" ("SUBSCRIBED")) | C: C04 LIST (SUBSCRIBED RECURSIVEMATCH) "" "%" | |||
| S: C04 OK done | S: * LIST () "/" "Foo" ("CHILDINFO" ("SUBSCRIBED")) | |||
| </artwork></figure> | S: C04 OK done | |||
| </sourcecode> | ||||
| (i.e., the mailbox "Foo" is not subscribed, but it has a child that is.) | <t> | |||
| <vspace blankLines="1"/> | ||||
| A1) If the mailbox "Foo" had also been subscribed, the last | ||||
| command would return this: | ||||
| <figure><artwork> | ||||
| C: C04 LIST (SUBSCRIBED RECURSIVEMATCH) "" "%" | ||||
| S: * LIST (\Subscribed) "/" "Foo" ("CHILDINFO" ("SUBSCRIBED")) | ||||
| S: C04 OK done | ||||
| </artwork></figure> | ||||
| or even this: | (that is, the mailbox "Foo" is not subscribed, but it has a child that is | |||
| ), then A1 or A2 occurs. | ||||
| </t> | ||||
| <ol spacing="normal" type="A%d)"> | ||||
| <li><t>If the mailbox "Foo" had also been subscribed, the last | ||||
| command would return this:</t> | ||||
| <figure><artwork> | <sourcecode type=""> | |||
| C: C04 LIST (SUBSCRIBED RECURSIVEMATCH) "" "%" | C: C04 LIST (SUBSCRIBED RECURSIVEMATCH) "" "%" | |||
| S: * LIST (\Subscribed \HasChildren) "/" "Foo" ("CHILDINFO" | S: * LIST (\Subscribed) "/" "Foo" ("CHILDINFO" | |||
| ("SUBSCRIBED")) | ("SUBSCRIBED")) | |||
| S: C04 OK done | S: C04 OK done | |||
| </artwork></figure> | </sourcecode> | |||
| A2) If we assume instead that the mailbox "Foo" is not part of the | <t> or even this:</t> | |||
| <sourcecode type=""> | ||||
| C: C04 LIST (SUBSCRIBED RECURSIVEMATCH) "" "%" | ||||
| S: * LIST (\Subscribed \HasChildren) "/" "Foo" | ||||
| ("CHILDINFO" ("SUBSCRIBED")) | ||||
| S: C04 OK done | ||||
| </sourcecode></li> | ||||
| <li> | ||||
| <t> | ||||
| If we assume instead that the mailbox "Foo" is not part of the | ||||
| original hierarchy and is not subscribed, the last command will | original hierarchy and is not subscribed, the last command will | |||
| give this result: | give this result: | |||
| </t> | ||||
| <sourcecode type=""> | ||||
| C: C04 LIST (SUBSCRIBED RECURSIVEMATCH) "" "%" | ||||
| S: * LIST (\NonExistent) "/" "Foo" ("CHILDINFO" | ||||
| ("SUBSCRIBED")) | ||||
| S: C04 OK done | ||||
| </sourcecode></li></ol></li> | ||||
| <figure><artwork> | <li><t>Now, let's assume that no mailbox is subscribed. In this case, | |||
| C: C04 LIST (SUBSCRIBED RECURSIVEMATCH) "" "%" | ||||
| S: * LIST (\NonExistent) "/" "Foo" ("CHILDINFO" ("SUBSCRIBED")) | ||||
| S: C04 OK done | ||||
| </artwork></figure> | ||||
| B) Now, let's assume that no mailbox is subscribed. In this case, | ||||
| the command <LIST (SUBSCRIBED RECURSIVEMATCH) "" "%"> will return | the command <LIST (SUBSCRIBED RECURSIVEMATCH) "" "%"> will return | |||
| no responses, as there are no subscribed children (even though | no responses, as there are no subscribed children (even though | |||
| "Foo" has children). | "Foo" has children). | |||
| <vspace blankLines="1"/> | </t></li> | |||
| C) And finally, suppose that only the mailboxes "Foo" and "Moo" are | ||||
| subscribed. In that case, we see this result: | ||||
| <figure><artwork> | <li><t>And finally, suppose that only the mailboxes "Foo" and "Moo" are | |||
| C: C04 LIST (SUBSCRIBED RECURSIVEMATCH) "" "%" RETURN (CHILDREN) | subscribed. In that case, we see this result: | |||
| S: * LIST (\HasChildren \Subscribed) "/" "Foo" | </t> | |||
| S: * LIST (\HasNoChildren \Subscribed) "/" "Moo" | <sourcecode type=""> | |||
| S: C04 OK done | C: C04 LIST (SUBSCRIBED RECURSIVEMATCH) "" "%" RETURN | |||
| </artwork></figure> | (CHILDREN) | |||
| S: * LIST (\HasChildren \Subscribed) "/" "Foo" | ||||
| S: * LIST (\HasNoChildren \Subscribed) "/" "Moo" | ||||
| S: C04 OK done | ||||
| </sourcecode> | ||||
| <t> | ||||
| (which means that the mailbox "Foo" has children, but none of them | (which means that the mailbox "Foo" has children, but none of them | |||
| is subscribed). | is subscribed). | |||
| </t> | </t></li></ol> | |||
| </li> | ||||
| <!-- ================================================== --> | <li> | |||
| <t> | <t> | |||
| The following example demonstrates that the CHILDINFO extended data item | The following example demonstrates that the CHILDINFO extended data item | |||
| is returned whether or not children mailboxes match the canonical LIST p | is returned whether or not child mailboxes match the canonical LIST patt | |||
| attern. | ern. | |||
| <vspace blankLines="1"/> | </t> | |||
| <t> | ||||
| Let's assume there is the following hierarchy: | Let's assume there is the following hierarchy: | |||
| <figure><artwork> | </t> | |||
| C: D01 LIST "" "*" | <sourcecode type=""> | |||
| S: * LIST (\Marked \NoInferiors) "/" "inbox" | C: D01 LIST "" "*" | |||
| S: * LIST () "/" "foo2" | S: * LIST (\Marked \NoInferiors) "/" "inbox" | |||
| S: * LIST () "/" "foo2/bar1" | S: * LIST () "/" "foo2" | |||
| S: * LIST () "/" "foo2/bar2" | S: * LIST () "/" "foo2/bar1" | |||
| S: * LIST () "/" "baz2" | S: * LIST () "/" "foo2/bar2" | |||
| S: * LIST () "/" "baz2/bar2" | S: * LIST () "/" "baz2" | |||
| S: * LIST () "/" "baz2/bar22" | S: * LIST () "/" "baz2/bar2" | |||
| S: * LIST () "/" "baz2/bar222" | S: * LIST () "/" "baz2/bar22" | |||
| S: * LIST () "/" "eps2" | S: * LIST () "/" "baz2/bar222" | |||
| S: * LIST () "/" "eps2/mamba" | S: * LIST () "/" "eps2" | |||
| S: * LIST () "/" "qux2/bar2" | S: * LIST () "/" "eps2/mamba" | |||
| S: D01 OK done | S: * LIST () "/" "qux2/bar2" | |||
| </artwork></figure> | S: D01 OK done | |||
| </sourcecode> | ||||
| <t> | ||||
| And that the following mailboxes are subscribed: | And that the following mailboxes are subscribed: | |||
| <figure><artwork> | </t> | |||
| C: D02 LIST (SUBSCRIBED) "" "*" | <sourcecode type=""> | |||
| S: * LIST (\Subscribed) "/" "foo2/bar1" | C: D02 LIST (SUBSCRIBED) "" "*" | |||
| S: * LIST (\Subscribed) "/" "foo2/bar2" | S: * LIST (\Subscribed) "/" "foo2/bar1" | |||
| S: * LIST (\Subscribed) "/" "baz2/bar2" | S: * LIST (\Subscribed) "/" "foo2/bar2" | |||
| S: * LIST (\Subscribed) "/" "baz2/bar22" | S: * LIST (\Subscribed) "/" "baz2/bar2" | |||
| S: * LIST (\Subscribed) "/" "baz2/bar222" | S: * LIST (\Subscribed) "/" "baz2/bar22" | |||
| S: * LIST (\Subscribed) "/" "eps2" | S: * LIST (\Subscribed) "/" "baz2/bar222" | |||
| S: * LIST (\Subscribed) "/" "eps2/mamba" | S: * LIST (\Subscribed) "/" "eps2" | |||
| S: * LIST (\Subscribed) "/" "qux2/bar2" | S: * LIST (\Subscribed) "/" "eps2/mamba" | |||
| S: D02 OK done | S: * LIST (\Subscribed) "/" "qux2/bar2" | |||
| </artwork></figure> | S: D02 OK done | |||
| </sourcecode> | ||||
| <t> | ||||
| The client issues the following command first: | The client issues the following command first: | |||
| <figure><artwork> | </t> | |||
| C: D03 LIST (RECURSIVEMATCH SUBSCRIBED) "" "*2" | <sourcecode type=""> | |||
| S: * LIST () "/" "foo2" ("CHILDINFO" ("SUBSCRIBED")) | C: D03 LIST (RECURSIVEMATCH SUBSCRIBED) "" "*2" | |||
| S: * LIST (\Subscribed) "/" "foo2/bar2" | S: * LIST () "/" "foo2" ("CHILDINFO" ("SUBSCRIBED")) | |||
| S: * LIST (\Subscribed) "/" "baz2/bar2" | S: * LIST (\Subscribed) "/" "foo2/bar2" | |||
| S: * LIST (\Subscribed) "/" "baz2/bar22" | S: * LIST (\Subscribed) "/" "baz2/bar2" | |||
| S: * LIST (\Subscribed) "/" "baz2/bar222" | S: * LIST (\Subscribed) "/" "baz2/bar22" | |||
| S: * LIST (\Subscribed) "/" "eps2" ("CHILDINFO" ("SUBSCRIBED")) | S: * LIST (\Subscribed) "/" "baz2/bar222" | |||
| S: * LIST (\Subscribed) "/" "qux2/bar2" | S: * LIST (\Subscribed) "/" "eps2" ("CHILDINFO" ("SUBSCRIBED")) | |||
| S: D03 OK done | S: * LIST (\Subscribed) "/" "qux2/bar2" | |||
| </artwork></figure> | S: D03 OK done | |||
| </sourcecode> | ||||
| and the server may also include (but this would violate a SHOULD NOT in | <t> | |||
| Section 3.5, because CHILDINFO is redundant) | and the server may also include the following (but this would violate a | |||
| restriction in <xref target="childinfo"/>, because CHILDINFO is redundant): | ||||
| <figure><artwork> | </t> | |||
| S: * LIST () "/" "baz2" ("CHILDINFO" ("SUBSCRIBED")) | <sourcecode type=""> | |||
| S: * LIST (\NonExistent) "/" "qux2" ("CHILDINFO" ("SUBSCRIBED")) | S: * LIST () "/" "baz2" ("CHILDINFO" ("SUBSCRIBED")) | |||
| </artwork></figure> | S: * LIST (\NonExistent) "/" "qux2" ("CHILDINFO" ("SUBSCRIBED")) | |||
| </sourcecode> | ||||
| <t> | ||||
| The CHILDINFO extended data item is returned for mailboxes "foo2", "baz2 ", | The CHILDINFO extended data item is returned for mailboxes "foo2", "baz2 ", | |||
| and "eps2", because all of them have subscribed children, | and "eps2" because all of them have subscribed children, | |||
| even though for the mailbox "foo2" only one of the two subscribed | even though for the mailbox "foo2", only one of the two subscribed | |||
| children matches the pattern, for the mailbox "baz2" all the subscribed | children matches the pattern; for the mailbox "baz2", all of the subscri | |||
| children match the pattern, and for the mailbox "eps2" none of the | bed | |||
| subscribed children matches the pattern. | children match the pattern; and for the mailbox "eps2", none of the | |||
| <vspace blankLines="1"/> | subscribed children match the pattern. | |||
| Note that if the client issues | </t> | |||
| <t> | ||||
| Note that if the client issues the following: | ||||
| <figure><artwork> | </t> | |||
| C: D03 LIST (RECURSIVEMATCH SUBSCRIBED) "" "*" | <sourcecode type=""> | |||
| S: * LIST () "/" "foo2" ("CHILDINFO" ("SUBSCRIBED")) | C: D03 LIST (RECURSIVEMATCH SUBSCRIBED) "" "*" | |||
| S: * LIST (\Subscribed) "/" "foo2/bar1" | S: * LIST () "/" "foo2" ("CHILDINFO" ("SUBSCRIBED")) | |||
| S: * LIST (\Subscribed) "/" "foo2/bar2" | S: * LIST (\Subscribed) "/" "foo2/bar1" | |||
| S: * LIST () "/" "baz2" ("CHILDINFO" ("SUBSCRIBED")) | S: * LIST (\Subscribed) "/" "foo2/bar2" | |||
| S: * LIST (\Subscribed) "/" "baz2/bar2" | S: * LIST () "/" "baz2" ("CHILDINFO" ("SUBSCRIBED")) | |||
| S: * LIST (\Subscribed) "/" "baz2/bar22" | S: * LIST (\Subscribed) "/" "baz2/bar2" | |||
| S: * LIST (\Subscribed) "/" "baz2/bar222" | S: * LIST (\Subscribed) "/" "baz2/bar22" | |||
| S: * LIST (\Subscribed) "/" "eps2" ("CHILDINFO" ("SUBSCRIBED")) | S: * LIST (\Subscribed) "/" "baz2/bar222" | |||
| S: * LIST (\Subscribed) "/" "eps2/mamba" | S: * LIST (\Subscribed) "/" "eps2" ("CHILDINFO" ("SUBSCRIBED")) | |||
| S: * LIST (\Subscribed) "/" "qux2/bar2" | S: * LIST (\Subscribed) "/" "eps2/mamba" | |||
| S: D03 OK done | S: * LIST (\Subscribed) "/" "qux2/bar2" | |||
| </artwork></figure> | S: D03 OK done | |||
| </sourcecode> | ||||
| <t> | ||||
| The LIST responses for mailboxes "foo2", "baz2", and "eps2" still have | the LIST responses for mailboxes "foo2", "baz2", and "eps2" still have | |||
| the CHILDINFO extended data item, even though this information | the CHILDINFO extended data item, even though this information | |||
| is redundant and the client can determine it by itself. | is redundant and the client can determine it by itself. | |||
| </t> | </t> | |||
| </li> | ||||
| <!-- ================================================== --> | <li> | |||
| <t> | <t> | |||
| The following example shows usage of extended syntax for mailbox pattern | The following example shows usage of an extended syntax for the mailbox | |||
| . | pattern. | |||
| It also demonstrates that the presence of the CHILDINFO extended data it em | It also demonstrates that the presence of the CHILDINFO extended data it em | |||
| doesn't necessarily imply \HasChildren. | doesn't necessarily imply \HasChildren. | |||
| <figure><artwork> | </t> | |||
| C: a1 LIST "" ("foo") | <sourcecode type=""> | |||
| S: * LIST () "/" foo | C: a1 LIST "" ("foo") | |||
| S: a1 OK done | S: * LIST () "/" foo | |||
| S: a1 OK done | ||||
| C: a2 LIST (SUBSCRIBED) "" "foo/*" | ||||
| S: * LIST (\Subscribed \NonExistent) "/" foo/bar | ||||
| S: a2 OK done | ||||
| C: a3 LIST (SUBSCRIBED RECURSIVEMATCH) "" foo RETURN (CHILDREN) | C: a2 LIST (SUBSCRIBED) "" "foo/*" | |||
| S: * LIST (\HasNoChildren) "/" foo ("CHILDINFO" ("SUBSCRIBED")) | S: * LIST (\Subscribed \NonExistent) "/" foo/bar | |||
| S: a3 OK done | S: a2 OK done | |||
| </artwork></figure> | ||||
| </t> | ||||
| <!-- ================================================== --> | C: a3 LIST (SUBSCRIBED RECURSIVEMATCH) "" foo RETURN (CHILDREN) | |||
| <t> | S: * LIST (\HasNoChildren) "/" foo ("CHILDINFO" ("SUBSCRIBED")) | |||
| S: a3 OK done | ||||
| </sourcecode> | ||||
| </li> | ||||
| <li> | ||||
| <t> | ||||
| The following example shows how a server that supports missing | The following example shows how a server that supports missing | |||
| mailbox hierarchy elements can signal to a client that didn't | mailbox hierarchy elements can signal to a client that didn't | |||
| specify the RECURSIVEMATCH selection option that there is | specify the RECURSIVEMATCH selection option that there is | |||
| a child mailbox that matches the selection criteria. | a child mailbox that matches the selection criteria. | |||
| <figure><artwork> | </t> | |||
| C: a1 LIST (REMOTE) "" * | <sourcecode type=""> | |||
| S: * LIST () "/" music/rock | C: a1 LIST (REMOTE) "" * | |||
| S: * LIST (\Remote) "/" also/jazz | S: * LIST () "/" music/rock | |||
| S: a1 OK done | S: * LIST (\Remote) "/" also/jazz | |||
| S: a1 OK done | ||||
| C: a2 LIST () "" % | C: a2 LIST () "" % | |||
| S: * LIST (\NonExistent \HasChildren) "/" music | S: * LIST (\NonExistent \HasChildren) "/" music | |||
| S: a2 OK done | S: a2 OK done | |||
| C: a3 LIST (REMOTE) "" % | C: a3 LIST (REMOTE) "" % | |||
| S: * LIST (\NonExistent \HasChildren) "/" music | S: * LIST (\NonExistent \HasChildren) "/" music | |||
| S: * LIST (\NonExistent \HasChildren) "/" also | S: * LIST (\NonExistent \HasChildren) "/" also | |||
| S: a3 OK done | S: a3 OK done | |||
| C: a3.1 LIST "" (% music/rock) | C: a3.1 LIST "" (% music/rock) | |||
| S: * LIST () "/" music/rock | S: * LIST () "/" music/rock | |||
| S: a3.1 OK done | S: a3.1 OK done | |||
| </artwork></figure> | </sourcecode> | |||
| <t> | ||||
| Because "music/rock" is the only mailbox under "music", there's no | Because "music/rock" is the only mailbox under "music", there's no | |||
| need for the server to also return "music". However clients must | need for the server to also return "music". However, clients must | |||
| handle both cases. | handle both cases. | |||
| </t> | </t> | |||
| </li> | ||||
| <!-- ================================================== --> | <li> | |||
| <t> | <t> | |||
| The following examples show use of STATUS return option. | The following examples show use of the STATUS return option. | |||
| <figure><artwork> | </t> | |||
| C: A01 LIST "" % RETURN (STATUS (MESSAGES UNSEEN)) | <sourcecode type=""> | |||
| S: * LIST () "." "INBOX" | C: A01 LIST "" % RETURN (STATUS (MESSAGES UNSEEN)) | |||
| S: * STATUS "INBOX" (MESSAGES 17 UNSEEN 16) | S: * LIST () "." "INBOX" | |||
| S: * LIST () "." "foo" | S: * STATUS "INBOX" (MESSAGES 17 UNSEEN 16) | |||
| S: * STATUS "foo" (MESSAGES 30 UNSEEN 29) | S: * LIST () "." "foo" | |||
| S: * LIST (\NoSelect) "." "bar" | S: * STATUS "foo" (MESSAGES 30 UNSEEN 29) | |||
| S: A01 OK List completed. | S: * LIST (\NoSelect) "." "bar" | |||
| </artwork></figure> | S: A01 OK List completed. | |||
| </sourcecode> | ||||
| <t> | ||||
| The "bar" mailbox isn't selectable, so it has no STATUS reply. | The "bar" mailbox isn't selectable, so it has no STATUS reply. | |||
| <figure><artwork> | </t> | |||
| C: A02 LIST (SUBSCRIBED RECURSIVEMATCH) "" % RETURN (STATUS | <sourcecode type=""> | |||
| C: A02 LIST (SUBSCRIBED RECURSIVEMATCH) "" % RETURN (STATUS | ||||
| (MESSAGES)) | (MESSAGES)) | |||
| S: * LIST (\Subscribed) "." "INBOX" | S: * LIST (\Subscribed) "." "INBOX" | |||
| S: * STATUS "INBOX" (MESSAGES 17) | S: * STATUS "INBOX" (MESSAGES 17) | |||
| S: * LIST () "." "foo" (CHILDINFO ("SUBSCRIBED")) | S: * LIST () "." "foo" (CHILDINFO ("SUBSCRIBED")) | |||
| S: A02 OK List completed. | S: A02 OK List completed. | |||
| </artwork></figure> | </sourcecode> | |||
| <t> | ||||
| The LIST reply for "foo" is returned because it has matching | The LIST reply for "foo" is returned because it has matching | |||
| children, but no STATUS reply is returned because "foo" itself | children, but no STATUS reply is returned because "foo" itself | |||
| doesn't match the selection criteria. | doesn't match the selection criteria. | |||
| </t> | </t> | |||
| </li> | ||||
| <!-- ================================================== --> | </ol> | |||
| </list> | </section> | |||
| </t> | </section> | |||
| </section> | <section numbered="true" toc="default"> | |||
| <name>NAMESPACE Command</name> | ||||
| </section> | <iref item="NAMESPACE (command)" subitem="" primary="false"/> | |||
| <dl newline="false" spacing="normal" indent="14"> | ||||
| <section title='NAMESPACE Command'> | <dt>Arguments:</dt> | |||
| <iref item='NAMESPACE (command)'/> | <dd>none</dd> | |||
| <dt>Responses:</dt> | ||||
| <t> | <dd> | |||
| <list style='hanging' hangIndent='12'> | <dl spacing="compact"> | |||
| <t hangText='Arguments:'>none</t> | <dt><bcp14>REQUIRED</bcp14> untagged responses:</dt><dd>NAMESPACE</ | |||
| dd> | ||||
| <t hangText='Responses:'>REQUIRED untagged responses: NAMESPACE</t> | </dl> | |||
| </dd> | ||||
| <t hangText='Result:'>OK - command completed<vspace/> | <dt>Result:</dt> | |||
| NO - Can't complete the command<vspace/> | <dd> | |||
| BAD - arguments invalid</t> | <dl spacing="compact"> | |||
| </list> | <dt>OK -</dt><dd>command completed</dd> | |||
| </t> | <dt>NO -</dt><dd>Can't complete the command</dd> | |||
| <dt>BAD -</dt><dd>arguments invalid</dd> | ||||
| <t> | </dl> | |||
| </dd> | ||||
| </dl> | ||||
| <t> | ||||
| The NAMESPACE command causes a single untagged NAMESPACE response to be ret urned. | The NAMESPACE command causes a single untagged NAMESPACE response to be ret urned. | |||
| The untagged NAMESPACE response contains the prefix | The untagged NAMESPACE response contains the prefix | |||
| and hierarchy delimiter to the server's Personal | and hierarchy delimiter to the server's Personal | |||
| Namespace(s), Other Users' Namespace(s), and Shared | Namespace(s), Other Users' Namespace(s), and Shared | |||
| Namespace(s) that the server wishes to expose. The | Namespace(s) that the server wishes to expose. The | |||
| response will contain a NIL for any namespace class | response will contain a NIL for any namespace class | |||
| that is not available. The namespace-response-extensions ABNF non terminal | that is not available. The namespace-response-extensions ABNF non-terminal | |||
| is defined for extensibility and MAY be included in the NAMESPACE response. | is defined for extensibility and <bcp14>MAY</bcp14> be included in the NAME | |||
| SPACE response. | ||||
| <!--No longer the best practice (see BCP 178): | </t> | |||
| namespace-response-extensions which are not on the IETF | <t>Example 1:</t> | |||
| standards track, MUST be prefixed with an "X-". | <t>In this example, a server supports a single Personal Namespace. No | |||
| --> | leading | |||
| </t> | prefix is used on personal mailboxes, and "/" is the hierarchy | |||
| <t>Example 1:</t> | ||||
| <t>In this example a server supports a single personal namespace. No leading | ||||
| prefix is used on personal mailboxes and "/" is the hierarchy | ||||
| delimiter.</t> | delimiter.</t> | |||
| <sourcecode type=""> | ||||
| <figure><artwork> | C: A001 NAMESPACE | |||
| C: A001 NAMESPACE | S: * NAMESPACE (("" "/")) NIL NIL | |||
| S: * NAMESPACE (("" "/")) NIL NIL | S: A001 OK NAMESPACE command completed | |||
| S: A001 OK NAMESPACE command completed | </sourcecode> | |||
| </artwork></figure> | <t>Example 2:</t> | |||
| <t>A user logged on anonymously to a server. No personal mailboxes | ||||
| <t>Example 2:</t> | are associated with the anonymous user, and the user does not have | |||
| <t>A user logged on anonymously to a server. No personal mailboxes | ||||
| are associated with the anonymous user and the user does not have | ||||
| access to the Other Users' Namespace. No prefix is required to | access to the Other Users' Namespace. No prefix is required to | |||
| access shared mailboxes and the hierarchy delimiter is "."</t> | access shared mailboxes, and the hierarchy delimiter is "."</t> | |||
| <sourcecode type=""> | ||||
| <figure><artwork> | C: A001 NAMESPACE | |||
| C: A001 NAMESPACE | S: * NAMESPACE NIL NIL (("" ".")) | |||
| S: * NAMESPACE NIL NIL (("" ".")) | S: A001 OK NAMESPACE command completed | |||
| S: A001 OK NAMESPACE command completed | </sourcecode> | |||
| </artwork></figure> | <t>Example 3:</t> | |||
| <t>A server that contains a Personal Namespace and a single Shared | ||||
| <t>Example 3:</t> | ||||
| <t>A server that contains a Personal Namespace and a single Shared | ||||
| Namespace.</t> | Namespace.</t> | |||
| <sourcecode type=""> | ||||
| <figure><artwork> | C: A001 NAMESPACE | |||
| C: A001 NAMESPACE | S: * NAMESPACE (("" "/")) NIL (("Public Folders/" "/")) | |||
| S: * NAMESPACE (("" "/")) NIL (("Public Folders/" "/")) | S: A001 OK NAMESPACE command completed | |||
| S: A001 OK NAMESPACE command completed | </sourcecode> | |||
| </artwork></figure> | <t>Example 4:</t> | |||
| <t>A server that contains a Personal Namespace, Other Users' | ||||
| <t>Example 4:</t> | Namespace, and multiple Shared Namespaces. Note that the hierarchy | |||
| <t>A server that contains a Personal Namespace, Other Users' | ||||
| Namespace and multiple Shared Namespaces. Note that the hierarchy | ||||
| delimiter used within each namespace can be different.</t> | delimiter used within each namespace can be different.</t> | |||
| <sourcecode type=""> | ||||
| <figure><artwork> | C: A001 NAMESPACE | |||
| C: A001 NAMESPACE | S: * NAMESPACE (("" "/")) (("~" "/")) (("#shared/" "/") | |||
| S: * NAMESPACE (("" "/")) (("~" "/")) (("#shared/" "/") | ("#public/" "/")("#ftp/" "/")("#news." ".")) | |||
| ("#public/" "/")("#ftp/" "/")("#news." ".")) | S: A001 OK NAMESPACE command completed | |||
| S: A001 OK NAMESPACE command completed | </sourcecode> | |||
| </artwork></figure> | <t> | |||
| <t> | ||||
| The prefix string allows a client to do things such as automatically | The prefix string allows a client to do things such as automatically | |||
| creating personal mailboxes or LISTing all available mailboxes within | create personal mailboxes or LIST all available mailboxes within | |||
| a namespace. | a namespace. | |||
| </t> | </t> | |||
| <t>Example 5:</t> | ||||
| <t>Example 5:</t> | <t>A server that supports only the Personal Namespace, with a | |||
| <t>A server that supports only the Personal Namespace, with a | ||||
| leading prefix of INBOX to personal mailboxes and a hierarchy | leading prefix of INBOX to personal mailboxes and a hierarchy | |||
| delimiter of "."</t> | delimiter of ".".</t> | |||
| <figure><artwork><![CDATA[ | ||||
| C: A001 NAMESPACE | ||||
| S: * NAMESPACE (("INBOX." ".")) NIL NIL | ||||
| S: A001 OK NAMESPACE command completed | ||||
| < Automatically create a mailbox to store sent items.> | <sourcecode type=""> | |||
| C: A001 NAMESPACE | ||||
| S: * NAMESPACE (("INBOX." ".")) NIL NIL | ||||
| S: A001 OK NAMESPACE command completed | ||||
| </sourcecode> | ||||
| C: A002 CREATE "INBOX.Sent Mail" | <t> | |||
| S: A002 OK CREATE command completed | Automatically create a mailbox to store sent items. | |||
| ]]></artwork></figure> | </t> | |||
| <t> | <sourcecode type=""> | |||
| Although typically a server will support only a single Personal | C: A002 CREATE "INBOX.Sent Mail" | |||
| S: A002 OK CREATE command completed | ||||
| </sourcecode> | ||||
| <t> | ||||
| Although a server will typically support only a single Personal | ||||
| Namespace, and a single Other User's Namespace, circumstances exist | Namespace, and a single Other User's Namespace, circumstances exist | |||
| where there MAY be multiples of these, and a client MUST be prepared | where there <bcp14>MAY</bcp14> be multiples of these, and a client <bcp14>MUS T</bcp14> be prepared | |||
| for them. If a client is configured such that it is required to | for them. If a client is configured such that it is required to | |||
| create a certain mailbox, there can be circumstances where it is | create a certain mailbox, there can be circumstances where it is | |||
| unclear which Personal Namespaces it should create the mailbox in. | unclear which Personal Namespaces it should create the mailbox in. | |||
| In these situations a client SHOULD let the user select which | In these situations, a client <bcp14>SHOULD</bcp14> let the user select which | |||
| namespaces to create the mailbox in or just use the first personal namespace. | namespaces to create the mailbox in, or just use the first Personal Namespace | |||
| </t> | . | |||
| </t> | ||||
| <t>Example 6:</t> | <t>Example 6:</t> | |||
| <t>In this example, a server supports two Personal Namespaces. In | ||||
| <t>In this example, a server supports two Personal Namespaces. In | ||||
| addition to the regular Personal Namespace, the user has an | addition to the regular Personal Namespace, the user has an | |||
| additional personal namespace to allow access to mailboxes in an | additional Personal Namespace that allows access to mailboxes in an | |||
| MH format mailstore.</t> | MH format mailstore.</t> | |||
| <t>The client is configured to save a copy of all mail sent by the | ||||
| <t>The client is configured to save a copy of all mail sent by the | user into a mailbox with the \Sent attribute (see <xref target="list-res | |||
| user into a mailbox with the \Sent attribute (see <xref target='list-res | p" format="default"/>). | |||
| p'/>). | ||||
| Furthermore, after a message is deleted from a mailbox, the client is co nfigured | Furthermore, after a message is deleted from a mailbox, the client is co nfigured | |||
| to move that message to a mailbox with the \Trash attribute. | to move that message to a mailbox with the \Trash attribute. | |||
| The server signals with the \NonExistent mailbox attribute <!--in LIST r | The server signals with the \NonExistent mailbox attribute | |||
| esponses--> | that the corresponding mailboxes don't exist yet and that it is possible | |||
| that the corresponding mailboxes don't exist yet, and that it is possibl | to create them. Once created, they could be used for \Sent or | |||
| e | \Trash purposes, and the server will no longer include | |||
| to create them. Once created, they could be used for the \Sent or | ||||
| \Trash purposes and the server will no longer include | ||||
| the \NonExistent mailbox attribute for them. | the \NonExistent mailbox attribute for them. | |||
| </t> | </t> | |||
| <t>Note that this example demonstrates how some extension parameters c | ||||
| <t>Note that this example demonstrates how some extension parameters can | an | |||
| be passed to further describe the #mh namespace. See the fictitious "X-PAR AM" | be passed to further describe the #mh namespace. See the fictitious "X-PAR AM" | |||
| extension parameter.</t> | extension parameter.</t> | |||
| <figure><artwork><![CDATA[ | ||||
| C: A001 NAMESPACE | ||||
| S: * NAMESPACE (("" "/")("#mh/" "/" "X-PARAM" | ||||
| ("FLAG1" "FLAG2"))) NIL NIL | ||||
| S: A001 OK NAMESPACE command completed | ||||
| C: A002 LIST (SPECIAL-USE) "" "*" | <sourcecode type=""> | |||
| S: * LIST (\NonExistent \Archive) "/" Archives | C: A001 NAMESPACE | |||
| S: * LIST (\NonExistent \Drafts) "/" Drafts | S: * NAMESPACE (("" "/")("#mh/" "/" "X-PARAM" | |||
| S: * LIST (\NonExistent \Junk) "/" Junk | ("FLAG1" "FLAG2"))) NIL NIL | |||
| S: * LIST (\NonExistent \Sent) "/" "Sent Mail" | S: A001 OK NAMESPACE command completed | |||
| S: * LIST (\NonExistent \Trash) "/" "Deleted Items" | ||||
| S: A002 OK LIST Completed | ||||
| C: A003 LIST (SPECIAL-USE) "#mh/" "*" | C: A002 LIST (SPECIAL-USE) "" "*" | |||
| S: * LIST (\NonExistent \Archive) "/" "#mh/Archives" | S: * LIST (\NonExistent \Archive) "/" Archives | |||
| S: * LIST (\NonExistent \Drafts) "/" "#mh/Drafts" | S: * LIST (\NonExistent \Drafts) "/" Drafts | |||
| S: * LIST (\NonExistent \Junk) "/" "#mh/Junk" | S: * LIST (\NonExistent \Junk) "/" Junk | |||
| S: * LIST (\NonExistent \Sent) "/" "#mh/Sent Mail" | S: * LIST (\NonExistent \Sent) "/" "Sent Mail" | |||
| S: * LIST (\NonExistent \Trash) "/" "#mh/Deleted Items" | S: * LIST (\NonExistent \Trash) "/" "Deleted Items" | |||
| S: A003 OK LIST Completed | S: A002 OK LIST Completed | |||
| < It is desired to keep only one copy of sent mail. | C: A003 LIST (SPECIAL-USE) "#mh/" "*" | |||
| It is unclear which Personal Namespace the client | S: * LIST (\NonExistent \Archive) "/" "#mh/Archives" | |||
| should use to create the 'Sent Mail' mailbox. | S: * LIST (\NonExistent \Drafts) "/" "#mh/Drafts" | |||
| The user is prompted to select a namespace and only | S: * LIST (\NonExistent \Junk) "/" "#mh/Junk" | |||
| one 'Sent Mail' mailbox is created. > | S: * LIST (\NonExistent \Sent) "/" "#mh/Sent Mail" | |||
| S: * LIST (\NonExistent \Trash) "/" "#mh/Deleted Items" | ||||
| S: A003 OK LIST Completed | ||||
| </sourcecode> | ||||
| C: A004 CREATE "Sent Mail" | <t> | |||
| S: A004 OK CREATE command completed | It is desired to keep only one copy of sent mail. | |||
| It is unclear which Personal Namespace the client | ||||
| should use to create the 'Sent Mail' mailbox. | ||||
| The user is prompted to select a namespace, and only | ||||
| one 'Sent Mail' mailbox is created.</t> | ||||
| < The client is designed so that it keeps two | <sourcecode type=""> | |||
| 'Deleted Items' mailboxes, one for each namespace. > | C: A004 CREATE "Sent Mail" | |||
| S: A004 OK CREATE command completed | ||||
| </sourcecode> | ||||
| C: A005 CREATE "Delete Items" | <t> The client is designed so that it keeps two | |||
| S: A005 OK CREATE command completed | 'Deleted Items' mailboxes, one for each namespace.</t> | |||
| C: A006 CREATE "#mh/Deleted Items" | <sourcecode type=""> | |||
| S: A006 OK CREATE command completed | C: A005 CREATE "Delete Items" | |||
| ]]></artwork></figure> | S: A005 OK CREATE command completed | |||
| <t>The next level of hierarchy following the Other Users' Namespace | C: A006 CREATE "#mh/Deleted Items" | |||
| prefix SHOULD consist of <username>, where <username> is | S: A006 OK CREATE command completed | |||
| a <!--canonical-->user name as per the LOGIN or AUTHENTICATE command. | </sourcecode> | |||
| </t> | ||||
| <t> | <t>The next level of hierarchy following the Other Users' Namespace | |||
| prefix <bcp14>SHOULD</bcp14> consist of <username>, where <username& | ||||
| gt; is | ||||
| a user name as per the LOGIN or AUTHENTICATE command. | ||||
| </t> | ||||
| <t> | ||||
| A client can construct a LIST command by appending a "%" to the Other | A client can construct a LIST command by appending a "%" to the Other | |||
| Users' Namespace prefix to discover the Personal Namespaces of other | Users' Namespace prefix to discover the Personal Namespaces of other | |||
| users that are available to the currently authenticated user. | users that are available to the currently authenticated user. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | In response to such a LIST command, a server <bcp14>SHOULD NOT</bcp14> return | |||
| In response to such a LIST command, a server SHOULD NOT return user | user | |||
| names that have not granted access to their personal mailboxes to the | names that have not granted access to their personal mailboxes to the | |||
| user in question. | user in question. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | A server <bcp14>MAY</bcp14> return a LIST response containing only the names | |||
| A server MAY return a LIST response containing only the names of | of | |||
| users that have explicitly granted access to the user in question. | users that have explicitly granted access to the user in question. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Alternatively, a server <bcp14>MAY</bcp14> return NO to such a LIST command, | |||
| Alternatively, a server MAY return NO to such a LIST command, | ||||
| requiring that a user name be included with the Other Users' | requiring that a user name be included with the Other Users' | |||
| Namespace prefix before listing any other user's mailboxes. | Namespace prefix before listing any other user's mailboxes. | |||
| </t> | </t> | |||
| <t>Example 7:</t> | ||||
| <t>Example 7:</t> | <t>A server that supports providing a list of other user's | |||
| <t>A server that supports providing a list of other user's | ||||
| mailboxes that are accessible to the currently logged on user.</t> | mailboxes that are accessible to the currently logged on user.</t> | |||
| <sourcecode type=""> | ||||
| C: A001 NAMESPACE | ||||
| S: * NAMESPACE (("" "/")) (("Other Users/" "/")) NIL | ||||
| S: A001 OK NAMESPACE command completed | ||||
| <figure><artwork><![CDATA[ | C: A002 LIST "" "Other Users/%" | |||
| C: A001 NAMESPACE | S: * LIST () "/" "Other Users/Mike" | |||
| S: * NAMESPACE (("" "/")) (("Other Users/" "/")) NIL | S: * LIST () "/" "Other Users/Karen" | |||
| S: A001 OK NAMESPACE command completed | S: * LIST () "/" "Other Users/Matthew" | |||
| S: * LIST () "/" "Other Users/Tesa" | ||||
| C: A002 LIST "" "Other Users/%" | S: A002 OK LIST command completed | |||
| S: * LIST () "/" "Other Users/Mike" | </sourcecode> | |||
| S: * LIST () "/" "Other Users/Karen" | <t>Example 8:</t> | |||
| S: * LIST () "/" "Other Users/Matthew" | <t>A server that does not support providing a list of other user's | |||
| S: * LIST () "/" "Other Users/Tesa" | ||||
| S: A002 OK LIST command completed | ||||
| ]]></artwork></figure> | ||||
| <t>Example 8:</t> | ||||
| <t>A server that does not support providing a list of other user's | ||||
| mailboxes that are accessible to the currently logged on user. | mailboxes that are accessible to the currently logged on user. | |||
| The mailboxes are listable if the client includes the name of the | The mailboxes are listable if the client includes the name of the | |||
| other user with the Other Users' Namespace prefix.</t> | other user with the Other Users' Namespace prefix.</t> | |||
| <figure><artwork><![CDATA[ | <sourcecode type=""> | |||
| C: A001 NAMESPACE | C: A001 NAMESPACE | |||
| S: * NAMESPACE (("" "/")) (("#Users/" "/")) NIL | S: * NAMESPACE (("" "/")) (("#Users/" "/")) NIL | |||
| S: A001 OK NAMESPACE command completed | S: A001 OK NAMESPACE command completed | |||
| </sourcecode> | ||||
| < In this example, the currently logged on user has access to | <t> | |||
| the Personal Namespace of user Mike, but the server chose to | In this example, the currently logged on user has access to | |||
| suppress this information in the LIST response. However, | the Personal Namespace of user Mike, but the server chose to | |||
| by appending the user name Mike (received through user input) | suppress this information in the LIST response. However, | |||
| to the Other Users' Namespace prefix, the client is able | by appending the user name Mike (received through user input) | |||
| to get a listing of the personal mailboxes of user Mike. > | to the Other Users' Namespace prefix, the client is able | |||
| to get a listing of the personal mailboxes of user Mike. | ||||
| C: A002 LIST "" "#Users/%" | </t> | |||
| S: A002 NO The requested item could not be found. | <sourcecode type=""> | |||
| C: A002 LIST "" "#Users/%" | ||||
| C: A003 LIST "" "#Users/Mike/%" | S: A002 NO The requested item could not be found. | |||
| S: * LIST () "/" "#Users/Mike/INBOX" | ||||
| S: * LIST () "/" "#Users/Mike/Foo" | ||||
| S: A003 OK LIST command completed. | ||||
| ]]></artwork></figure> | ||||
| <t>A prefix string might not contain a hierarchy delimiter, because | ||||
| in some cases it is not needed as part of the prefix. | ||||
| </t> | ||||
| <t>Example 9:</t> | ||||
| <t>A server that allows access to the Other Users' Namespace by | C: A003 LIST "" "#Users/Mike/%" | |||
| S: * LIST () "/" "#Users/Mike/INBOX" | ||||
| S: * LIST () "/" "#Users/Mike/Foo" | ||||
| S: A003 OK LIST command completed. | ||||
| </sourcecode> | ||||
| <t>A prefix string might not contain a hierarchy delimiter, because | ||||
| in some cases, it is not needed as part of the prefix. | ||||
| </t> | ||||
| <t>Example 9:</t> | ||||
| <t>A server that allows access to the Other Users' Namespace by | ||||
| prefixing the others' mailboxes with a '~' followed by <username>, | prefixing the others' mailboxes with a '~' followed by <username>, | |||
| where <username> is a user name as per the LOGIN or | where <username> is a user name as per the LOGIN or | |||
| AUTHENTICATE command.</t> | AUTHENTICATE command.</t> | |||
| <figure><artwork><![CDATA[ | <sourcecode type=""> | |||
| C: A001 NAMESPACE | C: A001 NAMESPACE | |||
| S: * NAMESPACE (("" "/")) (("~" "/")) NIL | S: * NAMESPACE (("" "/")) (("~" "/")) NIL | |||
| S: A001 OK NAMESPACE command completed | S: A001 OK NAMESPACE command completed | |||
| </sourcecode> | ||||
| < List the mailboxes for user mark > | ||||
| C: A002 LIST "" "~mark/%" | ||||
| S: * LIST () "/" "~mark/INBOX" | ||||
| S: * LIST () "/" "~mark/foo" | ||||
| S: A002 OK LIST command completed | ||||
| ]]></artwork></figure> | ||||
| </section> | ||||
| <section title='STATUS Command'> | ||||
| <iref item='STATUS (command)'/> | ||||
| <t> | ||||
| <list style='hanging' hangIndent='12'> | ||||
| <t hangText='Arguments:'>mailbox name<vspace/> | ||||
| status data item names</t> | ||||
| <t hangText='Responses:'>REQUIRED untagged responses: STATUS</t> | ||||
| <t hangText='Result:'>OK - status completed<vspace/> | <t>List the mailboxes for user mark | |||
| NO - status failure: no status for that name<vspace/> | </t> | |||
| BAD - command unknown or arguments invalid</t> | <sourcecode type=""> | |||
| </list> | C: A002 LIST "" "~mark/%" | |||
| </t> | S: * LIST () "/" "~mark/INBOX" | |||
| S: * LIST () "/" "~mark/foo" | ||||
| S: A002 OK LIST command completed | ||||
| </sourcecode> | ||||
| </section> | ||||
| <t> | <section anchor="status-command" numbered="true" toc="default"> | |||
| <name>STATUS Command</name> | ||||
| <iref item="STATUS (command)" subitem="" primary="false"/> | ||||
| <dl newline="false" spacing="normal" indent="14"> | ||||
| <dt>Arguments:</dt> | ||||
| <dd> | ||||
| <t>mailbox name</t> | ||||
| <t>status data item names</t> | ||||
| </dd> | ||||
| <dt>Responses:</dt> | ||||
| <dd> | ||||
| <dl spacing="compact"> | ||||
| <dt><bcp14>REQUIRED</bcp14> untagged responses:</dt><dd>STATUS</dd> | ||||
| </dl> | ||||
| </dd> | ||||
| <dt>Result:</dt> | ||||
| <dd> | ||||
| <dl spacing="compact"> | ||||
| <dt>OK -</dt><dd>status completed</dd> | ||||
| <dt>NO -</dt><dd>status failure: no status for that name</dd> | ||||
| <dt>BAD -</dt><dd>command unknown or arguments invalid</dd> | ||||
| </dl> | ||||
| </dd> | ||||
| </dl> | ||||
| <t> | ||||
| The STATUS command requests the status of the indicated mailbox. | The STATUS command requests the status of the indicated mailbox. | |||
| It does not change the currently selected mailbox, nor does it | It does not change the currently selected mailbox, nor does it | |||
| affect the state of any messages in the queried mailbox. | affect the state of any messages in the queried mailbox. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The STATUS command provides an alternative to opening a second | The STATUS command provides an alternative to opening a second | |||
| IMAP4rev2 connection and doing an EXAMINE command on a mailbox to | IMAP4rev2 connection and doing an EXAMINE command on a mailbox to | |||
| query that mailbox's status without deselecting the current | query that mailbox's status without deselecting the current | |||
| mailbox in the first IMAP4rev2 connection. | mailbox in the first IMAP4rev2 connection. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| Unlike the LIST command, the STATUS command is not guaranteed to | Unlike the LIST command, the STATUS command is not guaranteed to | |||
| be fast in its response. Under certain circumstances, it can be | be fast in its response. Under certain circumstances, it can be | |||
| quite slow. In some implementations, the server is obliged to | quite slow. In some implementations, the server is obliged to | |||
| open the mailbox read-only internally to obtain certain status | open the mailbox as "read-only" internally to obtain certain status | |||
| information. Also unlike the LIST command, the STATUS command | information. Also unlike the LIST command, the STATUS command | |||
| does not accept wildcards. | does not accept wildcards. | |||
| </t> | ||||
| <list> | <t indent="3"> | |||
| <t> | ||||
| Note: The STATUS command is intended to access the | Note: The STATUS command is intended to access the | |||
| status of mailboxes other than the currently selected | status of mailboxes other than the currently selected | |||
| mailbox. Because the STATUS command can cause the | mailbox. Because the STATUS command can cause the | |||
| mailbox to be opened internally, and because this | mailbox to be opened internally, and because this | |||
| information is available by other means on the selected | information is available by other means on the selected | |||
| mailbox, the STATUS command SHOULD NOT be used on the | mailbox, the STATUS command <bcp14>SHOULD NOT</bcp14> be used on the | |||
| currently selected mailbox. | currently selected mailbox. | |||
| However, servers MUST be able to execute STATUS | However, servers <bcp14>MUST</bcp14> be able to execute the STATUS | |||
| command on the selected mailbox. | command on the selected mailbox. | |||
| <!--////Alexey: Should this be moved to the LIST return options secti | (This might also implicitly happen when the STATUS return option is u | |||
| on?--> | sed | |||
| (This might | in a LIST command.) | |||
| also implicitly happen when STATUS return option is used | ||||
| in a LIST command). | ||||
| </t> | </t> | |||
| <t indent="3"> | ||||
| <t> | The STATUS command <bcp14>MUST NOT</bcp14> be used as a "check for ne | |||
| <!--Bron suggests to say "clients can't expect for this to work" inst | w | |||
| ead--> | messages in the selected mailbox" operation (refer to Sections | |||
| The STATUS command MUST NOT be used as a "check for new | <xref target="server-responses" format="counter"/> and | |||
| messages in the selected mailbox" operation (refer to | <xref target="exists" format="counter"/> for more information about | |||
| <xref target='server-responses'/> and <xref target='exists'/> for mor | ||||
| e information about | ||||
| the proper method for new message checking). | the proper method for new message checking). | |||
| </t> | </t> | |||
| <t indent="3"> | ||||
| <t> | ||||
| STATUS SIZE (see below) can take a significant amount of time, | STATUS SIZE (see below) can take a significant amount of time, | |||
| depending upon server implementation. Clients should use | depending upon server implementation. Clients should use | |||
| STATUS SIZE cautiously. | STATUS SIZE cautiously. | |||
| </t> | </t> | |||
| </list> | <t> | |||
| </t> | ||||
| <t> | ||||
| The currently defined status data items that can be requested are: | The currently defined status data items that can be requested are: | |||
| </t> | ||||
| <list style='hanging'> | <dl newline="true" spacing="normal"> | |||
| <t hangText='MESSAGES'> | <dt>MESSAGES</dt> | |||
| <iref item='MESSAGES (status item)'/> | <dd> | |||
| The number of messages in the mailbox.</t> | <iref item="MESSAGES (status item)" subitem="" primary="false"/> | |||
| The number of messages in the mailbox.</dd> | ||||
| <t hangText='UIDNEXT'> | <dt>UIDNEXT</dt> | |||
| <iref item='UIDNEXT (status item)'/> | <dd> | |||
| <iref item="UIDNEXT (status item)" subitem="" primary="false"/> | ||||
| The next unique identifier value of the mailbox. Refer to | The next unique identifier value of the mailbox. Refer to | |||
| <xref target='uid-def'/> for more information.</t> | <xref target="uid-def" format="default"/> for more information.</dd> | |||
| <dt>UIDVALIDITY</dt> | ||||
| <t hangText='UIDVALIDITY'> | <dd> | |||
| <iref item='UIDVALIDITY (status item)'/> | <iref item="UIDVALIDITY (status item)" subitem="" primary="false"/ | |||
| > | ||||
| The unique identifier validity value of the mailbox. Refer to | The unique identifier validity value of the mailbox. Refer to | |||
| <xref target='uid-def'/> for more information.</t> | <xref target="uid-def" format="default"/> for more information.</dd> | |||
| <dt>UNSEEN</dt> | ||||
| <t hangText='UNSEEN'> | <dd> | |||
| <iref item='UNSEEN (status item)'/> | <iref item="UNSEEN (status item)" subitem="" primary="false"/> | |||
| The number of messages which do not have the \Seen flag set.</t> | The number of messages that do not have the \Seen flag set.</dd> | |||
| <dt>DELETED</dt> | ||||
| <t hangText='DELETED'> | <dd> | |||
| <iref item='DELETED (status item)'/> | <iref item="DELETED (status item)" subitem="" primary="false"/> | |||
| The number of messages which have the \Deleted flag set.</t> | The number of messages that have the \Deleted flag set.</dd> | |||
| <dt>SIZE</dt> | ||||
| <t hangText='SIZE'> | <dd> | |||
| <iref item='SIZE (status item)'/> | <iref item="SIZE (status item)" subitem="" primary="false"/> | |||
| The total size of the mailbox in octets. This is not strictly | The total size of the mailbox in octets. This is not strictly | |||
| required to be an exact value, but it MUST be equal to or greater | required to be an exact value, but it <bcp14>MUST</bcp14> be equal to or greater | |||
| than the sum of the values of the RFC822.SIZE FETCH message data | than the sum of the values of the RFC822.SIZE FETCH message data | |||
| items (see <xref target='fetch-command'/>) of all messages in the mailbox | items (see <xref target="fetch-command" format="default"/>) of all messag | |||
| . | es in the mailbox. | |||
| <!--///Alexey: Do we want this text in the base spec? | ||||
| When the "QUOTA" capability <xref target='QUOTA'/> is also supported, thi | ||||
| s value SHOULD be equal | ||||
| to the storage usage value used to enforce the "STORAGE" resource | ||||
| limit for this mailbox. This way, the client can directly infer | ||||
| the quota usage. | ||||
| --> | ||||
| </t> | ||||
| </list> | ||||
| </t> | ||||
| <figure><artwork> | ||||
| Example: C: A042 STATUS blurdybloop (UIDNEXT MESSAGES) | ||||
| S: * STATUS blurdybloop (MESSAGES 231 UIDNEXT 44292) | ||||
| S: A042 OK STATUS completed | ||||
| </artwork></figure> | ||||
| </section> | ||||
| <section title='APPEND Command'> | ||||
| <iref item='APPEND (command)'/> | ||||
| <t> | </dd> | |||
| <list style='hanging' hangIndent='12'> | </dl> | |||
| <t hangText='Arguments:'>mailbox name<vspace/> | <t> | |||
| OPTIONAL flag parenthesized list<vspace/> | Example: | |||
| OPTIONAL date/time string<vspace/> | </t> | |||
| <sourcecode type=""> | ||||
| C: A042 STATUS blurdybloop (UIDNEXT MESSAGES) | ||||
| S: * STATUS blurdybloop (MESSAGES 231 UIDNEXT 44292) | ||||
| S: A042 OK STATUS completed | ||||
| </sourcecode> | ||||
| </section> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>APPEND Command</name> | ||||
| <iref item="APPEND (command)" subitem="" primary="false"/> | ||||
| <dl newline="false" spacing="normal" indent="14"> | ||||
| <dt>Arguments:</dt> | ||||
| <dd> | ||||
| <t>mailbox name</t> | ||||
| <t> | ||||
| <bcp14>OPTIONAL</bcp14> flag parenthesized list</t> | ||||
| <t> | ||||
| <bcp14>OPTIONAL</bcp14> date/time string</t> | ||||
| <t> | ||||
| message literal</t> | message literal</t> | |||
| </dd> | ||||
| <t hangText='Responses:'>OPTIONAL untagged response: LIST</t> | <dt>Responses:</dt> | |||
| <dd> | ||||
| <t hangText='Result:'>OK - append completed<vspace/> | <dl spacing="compact"> | |||
| NO - append error: can't append to that mailbox, error<vspace/> | <dt><bcp14>OPTIONAL</bcp14> untagged response:</dt><dd>LIST</dd> | |||
| in flags or date/time or message text<vspace/> | </dl> | |||
| BAD - command unknown or arguments invalid</t> | </dd> | |||
| </list> | <dt>Result:</dt> | |||
| </t> | <dd> | |||
| <dl spacing="compact"> | ||||
| <t> | <dt>OK -</dt><dd>append completed</dd> | |||
| <dt>NO -</dt><dd>append error: can't append to that mailbox, error | ||||
| in flags or date/time or message text</dd> | ||||
| <dt>BAD -</dt><dd>command unknown or arguments invalid</dd> | ||||
| </dl> | ||||
| </dd> | ||||
| </dl> | ||||
| <t> | ||||
| The APPEND command appends the literal argument as a new message | The APPEND command appends the literal argument as a new message | |||
| to the end of the specified destination mailbox. This argument | to the end of the specified destination mailbox. This argument | |||
| SHOULD be in the format of an <xref target='RFC-5322'/> or <xref | <bcp14>SHOULD</bcp14> be in the format of an <xref target="RFC5322" format | |||
| target='I18N-HDRS'/> message. 8-bit | ="default"/> or <xref target="RFC6532" format="default"/> message. 8-bit | |||
| characters are permitted in the message. A server implementation | characters are permitted in the message. A server implementation | |||
| that is unable to preserve 8-bit data properly MUST be able to | that is unable to preserve 8-bit data properly <bcp14>MUST</bcp14> be able | |||
| reversibly convert 8-bit APPEND data to 7-bit using a <xref target='MIME-I | to | |||
| MB'/> | reversibly convert 8-bit APPEND data to 7 bits using a <xref target="RFC20 | |||
| 45" format="default"/> | ||||
| content transfer encoding. | content transfer encoding. | |||
| <list><t> | </t> | |||
| Note: There may be exceptions, e.g., draft messages, in | <t indent="3"> | |||
| which required <xref target='RFC-5322'/> header fields are omitted in | Note: There may be exceptions, such as draft messages, in | |||
| which required <xref target="RFC5322" format="default"/> header field | ||||
| s are omitted in | ||||
| the message literal argument to APPEND. The full | the message literal argument to APPEND. The full | |||
| implications of doing so must be understood and | implications of doing so must be understood and | |||
| carefully weighed. | carefully weighed. | |||
| </t></list> | </t> | |||
| </t> | ||||
| <t> | <t> | |||
| If a flag parenthesized list is specified, the flags SHOULD be set | If a flag parenthesized list is specified, the flags <bcp14>SHOULD</bcp14> | |||
| be set | ||||
| in the resulting message; otherwise, the flag list of the | in the resulting message; otherwise, the flag list of the | |||
| resulting message is set to empty by default. | resulting message is set to "empty" by default. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | If a date-time is specified, the internal date <bcp14>SHOULD</bcp14> be se | |||
| If a date-time is specified, the internal date SHOULD be set in | t in | |||
| the resulting message; otherwise, the internal date of the | the resulting message; otherwise, the internal date of the | |||
| resulting message is set to the current date and time by default. | resulting message is set to the current date and time by default. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | If the append is unsuccessful for any reason, the mailbox <bcp14>MUST</bcp | |||
| If the append is unsuccessful for any reason, the mailbox MUST be | 14> be | |||
| restored to its state before the APPEND attempt (other than possibly | restored to its state before the APPEND attempt (other than possibly | |||
| keeping the changed mailbox's UIDNEXT value); no partial | keeping the changed mailbox's UIDNEXT value); no partial | |||
| appending is permitted. | appending is permitted. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | If the destination mailbox does not exist, a server <bcp14>MUST</bcp14> re | |||
| If the destination mailbox does not exist, a server MUST return an | turn an | |||
| error, and MUST NOT automatically create the mailbox. Unless it | error and <bcp14>MUST NOT</bcp14> automatically create the mailbox. Unles | |||
| is certain that the destination mailbox can not be created, the | s it | |||
| server MUST send the response code "[TRYCREATE]" as the prefix of | is certain that the destination mailbox cannot be created, the | |||
| server <bcp14>MUST</bcp14> send the response code "[TRYCREATE]" as the pre | ||||
| fix of | ||||
| the text of the tagged NO response. This gives a hint to the | the text of the tagged NO response. This gives a hint to the | |||
| client that it can attempt a CREATE command and retry the APPEND | client that it can attempt a CREATE command and retry the APPEND | |||
| if the CREATE is successful. | if the CREATE is successful. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| On successful completion of an APPEND, the server returns | On successful completion of an APPEND, the server returns | |||
| an APPENDUID response code (see <xref target='server-status-responses'/>), | an APPENDUID response code (see <xref target="server-status-responses" form | |||
| unless specified otherwise below. | at="default"/>), | |||
| </t> | unless otherwise specified below. | |||
| </t> | ||||
| <t> | <t> | |||
| In the case of a mailbox that has permissions set so that the client | In the case of a mailbox that has permissions set so that the client | |||
| can APPEND to the mailbox, but not SELECT or EXAMINE it, the | can APPEND to the mailbox, but not SELECT or EXAMINE it, the | |||
| server MUST NOT send an APPENDUID response code as it | server <bcp14>MUST NOT</bcp14> send an APPENDUID response code as it | |||
| would disclose information about the mailbox. | would disclose information about the mailbox. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| In the case of a mailbox that has UIDNOTSTICKY status | In the case of a mailbox that has UIDNOTSTICKY status | |||
| (see <xref target='server-status-responses'/>), | (see <xref target="server-status-responses" format="default"/>), | |||
| the server MAY omit the APPENDUID response code as | the server <bcp14>MAY</bcp14> omit the APPENDUID response code as | |||
| it is not meaningful. | it is not meaningful. | |||
| </t> | </t> | |||
| <!-- | ||||
| <t> | ||||
| If the server does not return the APPENDUID response | ||||
| codes, the client can discover this information by selecting the | ||||
| destination mailbox. The location of messages placed in the | ||||
| destination mailbox by APPEND can be determined by using | ||||
| FETCH and/or SEARCH commands (e.g., for Message-ID or some unique | ||||
| marker placed in the message in an APPEND). | ||||
| </t> | ||||
| <t> | <t> | |||
| If the mailbox is currently selected, the normal new message | If the mailbox is currently selected, normal new message | |||
| actions SHOULD occur. Specifically, the server SHOULD notify the | actions <bcp14>SHOULD</bcp14> occur. Specifically, the server <bcp14>SHOU | |||
| LD</bcp14> notify the | ||||
| client immediately via an untagged EXISTS response. If the server | client immediately via an untagged EXISTS response. If the server | |||
| does not do so, the client MAY issue a NOOP command after one or more APPE | does not do so, the client <bcp14>MAY</bcp14> issue a NOOP command after o | |||
| ND commands. | ne or more APPEND commands. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| If the server decides to convert (normalize) the mailbox name, | If the server decides to convert (normalize) the mailbox name, | |||
| it SHOULD return an untagged LIST with OLDNAME extended data item, | it <bcp14>SHOULD</bcp14> return an untagged LIST with an OLDNAME extended data item, | |||
| with the OLDNAME value being the supplied mailbox name and the | with the OLDNAME value being the supplied mailbox name and the | |||
| name parameter being the normalized mailbox name. | name parameter being the normalized mailbox name. | |||
| (See <xref target='oldname'/> for more details.) | (See <xref target="oldname" format="default"/> for more details.) | |||
| </t> | </t> | |||
| <figure><artwork><![CDATA[ | ||||
| Example: C: A003 APPEND saved-messages (\Seen) {326} | ||||
| S: + Ready for literal data | ||||
| C: Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST) | ||||
| C: From: Fred Foobar <foobar@Blurdybloop.example> | ||||
| C: Subject: afternoon meeting | ||||
| C: To: mooch@owatagu.siam.edu.example | ||||
| C: Message-Id: <B27397-0100000@Blurdybloop.example> | ||||
| C: MIME-Version: 1.0 | ||||
| C: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII | ||||
| C: | ||||
| C: Hello Joe, do you think we can meet at 3:30 tomorrow? | ||||
| C: | ||||
| S: A003 OK APPEND completed | ||||
| ]]></artwork></figure> | ||||
| <figure><artwork><![CDATA[ | ||||
| Example: C: A003 APPEND saved-messages (\Seen) {297+} | ||||
| C: Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST) | ||||
| C: From: Fred Foobar <foobar@example.com> | ||||
| C: Subject: afternoon meeting | ||||
| C: To: mooch@example.com | ||||
| C: Message-Id: <B27397-0100000@example.com> | ||||
| C: MIME-Version: 1.0 | ||||
| C: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII | ||||
| C: | ||||
| C: Hello Joe, do you think we can meet at 3:30 tomorrow? | ||||
| C: | ||||
| S: A003 OK [APPENDUID 38505 3955] APPEND completed | ||||
| C: A004 COPY 2:4 meeting | ||||
| S: A004 OK [COPYUID 38505 304,319:320 3956:3958] Done | ||||
| C: A005 UID COPY 305:310 meeting | ||||
| S: A005 OK No matching messages, so nothing copied | ||||
| C: A006 COPY 2 funny | ||||
| S: A006 OK Done | ||||
| C: A007 SELECT funny | ||||
| S: * 1 EXISTS | ||||
| S: * OK [UIDVALIDITY 3857529045] Validity session-only | ||||
| S: * OK [UIDNEXT 2] Predicted next UID | ||||
| S: * NO [UIDNOTSTICKY] Non-persistent UIDs | ||||
| S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) | ||||
| S: * OK [PERMANENTFLAGS (\Deleted \Seen)] Limited | ||||
| S: * LIST () "." funny | ||||
| S: A007 OK [READ-WRITE] SELECT completed | ||||
| ]]></artwork></figure> | ||||
| <t> | <t> | |||
| Example: | ||||
| </t> | ||||
| <sourcecode type=""> | ||||
| C: A003 APPEND saved-messages (\Seen) {326} | ||||
| S: + Ready for literal data | ||||
| C: Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST) | ||||
| C: From: Fred Foobar <foobar@Blurdybloop.example> | ||||
| C: Subject: afternoon meeting | ||||
| C: To: mooch@owatagu.siam.edu.example | ||||
| C: Message-Id: <B27397-0100000@Blurdybloop.example> | ||||
| C: MIME-Version: 1.0 | ||||
| C: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII | ||||
| C: | ||||
| C: Hello Joe, do you think we can meet at 3:30 tomorrow? | ||||
| C: | ||||
| S: A003 OK APPEND completed | ||||
| </sourcecode> | ||||
| <t> | ||||
| Example: | ||||
| </t> | ||||
| <sourcecode type=""> | ||||
| C: A003 APPEND saved-messages (\Seen) {297+} | ||||
| C: Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST) | ||||
| C: From: Fred Foobar <foobar@example.com> | ||||
| C: Subject: afternoon meeting | ||||
| C: To: mooch@example.com | ||||
| C: Message-Id: <B27397-0100000@example.com> | ||||
| C: MIME-Version: 1.0 | ||||
| C: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII | ||||
| C: | ||||
| C: Hello Joe, do you think we can meet at 3:30 tomorrow? | ||||
| C: | ||||
| S: A003 OK [APPENDUID 38505 3955] APPEND completed | ||||
| C: A004 COPY 2:4 meeting | ||||
| S: A004 OK [COPYUID 38505 304,319:320 3956:3958] Done | ||||
| C: A005 UID COPY 305:310 meeting | ||||
| S: A005 OK No matching messages, so nothing copied | ||||
| C: A006 COPY 2 funny | ||||
| S: A006 OK Done | ||||
| C: A007 SELECT funny | ||||
| S: * 1 EXISTS | ||||
| S: * OK [UIDVALIDITY 3857529045] Validity session-only | ||||
| S: * OK [UIDNEXT 2] Predicted next UID | ||||
| S: * NO [UIDNOTSTICKY] Non-persistent UIDs | ||||
| S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) | ||||
| S: * OK [PERMANENTFLAGS (\Deleted \Seen)] Limited | ||||
| S: * LIST () "." funny | ||||
| S: A007 OK [READ-WRITE] SELECT completed | ||||
| </sourcecode> | ||||
| <t> | ||||
| In this example, A003 and A004 demonstrate successful appending and | In this example, A003 and A004 demonstrate successful appending and | |||
| copying to a mailbox that returns the UIDs assigned to the messages. | copying to a mailbox that returns the UIDs assigned to the messages. | |||
| A005 is an example in which no messages were copied; this is because | A005 is an example in which no messages were copied; this is because | |||
| in A003, we see that message 2 had UID 304, and message 3 had UID | in A003, we see that message 2 had UID 304, and message 3 had UID | |||
| 319; therefore, UIDs 305 through 310 do not exist (refer to <xref target='uid -def'/> | 319; therefore, UIDs 305 through 310 do not exist (refer to <xref target="uid -def" format="default"/> | |||
| for further explanation). A006 is an example of a | for further explanation). A006 is an example of a | |||
| message being copied that did not return a COPYUID; and, as expected, | message being copied that did not return a COPYUID; and, as expected, | |||
| A007 shows that the mail store containing that mailbox does not | A007 shows that the mail store containing that mailbox does not | |||
| support persistent UIDs. | support persistent UIDs. | |||
| </t> | </t> | |||
| <aside><t> | ||||
| <t> | ||||
| <list> | ||||
| <t> | ||||
| Note: The APPEND command is not used for message delivery, | Note: The APPEND command is not used for message delivery, | |||
| because it does not provide a mechanism to transfer <xref target='SMTP'/ | because it does not provide a mechanism to transfer <xref target="RFC532 | |||
| > | 1" format="default"/> | |||
| envelope information. | envelope information.</t> | |||
| </t> | </aside> | |||
| </list> | </section> | |||
| </t> | <section anchor="idle" numbered="true" toc="default"> | |||
| <name>IDLE Command</name> | ||||
| </section> | <iref item="IDLE (command)" subitem="" primary="false"/> | |||
| <dl newline="false" spacing="normal" indent="14"> | ||||
| <section title='IDLE Command' anchor="idle"> | <dt>Arguments:</dt> | |||
| <iref item='IDLE (command)'/> | <dd>none</dd> | |||
| <dt>Responses:</dt> | ||||
| <t> | <dd>continuation data will be requested; the client sends | |||
| <list style='hanging' hangIndent='12'> | the continuation data "DONE" to end the command</dd> | |||
| <t hangText='Arguments:'>none</t> | <dt>Result:</dt> | |||
| <dd> | ||||
| <t hangText='Responses:'>continuation data will be requested; the client send | <dl spacing="compact"> | |||
| s | <dt>OK -</dt><dd>IDLE completed after client sent "DONE"</dd> | |||
| the continuation data "DONE" to end the command</t> | <dt>NO -</dt><dd>failure: the server will not allow the IDLE | |||
| command at this time</dd> | ||||
| <t hangText='Result:'>OK - IDLE completed after client sent "DONE"<vspace/> | <dt>BAD -</dt><dd>command unknown or arguments invalid</dd> | |||
| NO - failure: the server will not allow the IDLE | </dl> | |||
| command at this time<vspace/> | </dd> | |||
| BAD - command unknown or arguments invalid</t> | </dl> | |||
| </list> | <t> | |||
| </t> | Without the IDLE command, a client would need to poll the server for change | |||
| s | ||||
| <t> | to the selected mailbox (new mail, deletions, and flag changes). | |||
| Without the IDLE command a client would need to poll the server for changes | ||||
| to the selected mailbox (new mail, deletions, flag changes). | ||||
| It's often more desirable to have the server transmit updates to | It's often more desirable to have the server transmit updates to | |||
| the client in real time. This allows a user to see new mail immediately. | the client in real time. This allows a user to see new mail immediately. | |||
| The IDLE command allows a client to tell the server that it's ready to acce pt | The IDLE command allows a client to tell the server that it's ready to acce pt | |||
| such real-time updates. | such real-time updates. | |||
| </t> | </t> | |||
| <!-- | ||||
| The IDLE command may be used with any IMAP4 server implementation | ||||
| that returns "IDLE" as one of the supported capabilities to the | ||||
| CAPABILITY command. If the server does not advertise the IDLE | ||||
| capability, the client MUST NOT use the IDLE command and must poll | ||||
| for mailbox updates. In particular, the client MUST continue to be | ||||
| able to accept unsolicited untagged responses to ANY command, as | ||||
| specified in the base IMAP specification. | ||||
| <t> | <t> | |||
| The IDLE command is sent from the client to the server when the | The IDLE command is sent from the client to the server when the | |||
| client is ready to accept unsolicited update messages. The | client is ready to accept unsolicited update messages. The | |||
| server requests a response to the IDLE command using the continuation | server requests a response to the IDLE command using the continuation | |||
| ("+") response. The IDLE command remains active until the client | ("+") response. The IDLE command remains active until the client | |||
| responds to the continuation, and as long as an IDLE command is | responds to the continuation, and as long as an IDLE command is | |||
| active, the server is now free to send untagged EXISTS, EXPUNGE, FETCH, and | active, the server is now free to send untagged EXISTS, EXPUNGE, FETCH, and | |||
| other responses at any time. If the server chooses to send unsolicited FETC H | other responses at any time. If the server chooses to send unsolicited FETC H | |||
| responses, they MUST include UID FETCH item. | responses, they <bcp14>MUST</bcp14> include a UID FETCH item. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The IDLE command is terminated by the receipt of a "DONE" | The IDLE command is terminated by the receipt of a "DONE" | |||
| continuation from the client; such response satisfies the server's | continuation from the client; such response satisfies the server's | |||
| continuation request. At that point, the server MAY send any | continuation request. At that point, the server <bcp14>MAY</bcp14> send an | |||
| remaining queued untagged responses and then MUST immediately send | y | |||
| remaining queued untagged responses and then <bcp14>MUST</bcp14> immediatel | ||||
| y send | ||||
| the tagged response to the IDLE command and prepare to process other | the tagged response to the IDLE command and prepare to process other | |||
| commands. As for other commands, the processing of any new | commands. As for other commands, the processing of any new | |||
| command may cause the sending of unsolicited untagged responses, | command may cause the sending of unsolicited untagged responses, | |||
| subject to the ambiguity limitations. The client MUST NOT send a | subject to the ambiguity limitations. The client <bcp14>MUST NOT</bcp14> s end a | |||
| command while the server is waiting for the DONE, since the server | command while the server is waiting for the DONE, since the server | |||
| will not be able to distinguish a command from a continuation. | will not be able to distinguish a command from a continuation. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | The server <bcp14>MAY</bcp14> consider a client inactive if it has an IDLE | |||
| The server MAY consider a client inactive if it has an IDLE command | command | |||
| running, and if such a server has an inactivity timeout it MAY log | running, and if such a server has an inactivity timeout, it <bcp14>MAY</bcp | |||
| 14> log | ||||
| the client off implicitly at the end of its timeout period. Because | the client off implicitly at the end of its timeout period. Because | |||
| of that, clients using IDLE are advised to terminate the IDLE and | of that, clients using IDLE are advised to terminate IDLE and | |||
| re-issue it at least every 29 minutes to avoid being logged off. | reissue it at least every 29 minutes to avoid being logged off. | |||
| This still allows a client to receive immediate mailbox updates even | This still allows a client to receive immediate mailbox updates even | |||
| though it need only "poll" at half hour intervals. | though it need only "poll" at half hour intervals. | |||
| </t> | </t> | |||
| <t> | ||||
| <!--///Alexey: Clarify which responses should be expected/MUST be implemented | Example: | |||
| --> | </t> | |||
| <sourcecode type=""> | ||||
| <figure><artwork> | C: A001 SELECT INBOX | |||
| Example: C: A001 SELECT INBOX | S: * FLAGS (\Deleted \Seen \Flagged) | |||
| S: * FLAGS (\Deleted \Seen \Flagged) | S: * OK [PERMANENTFLAGS (\Deleted \Seen \Flagged)] Limited | |||
| S: * OK [PERMANENTFLAGS (\Deleted \Seen \Flagged)] Limited | S: * 3 EXISTS | |||
| S: * 3 EXISTS | S: * OK [UIDVALIDITY 1] | |||
| S: * OK [UIDVALIDITY 1] | S: * OK [UIDNEXT 1] | |||
| S: * OK [UIDNEXT 1] | S: * LIST () "/" INBOX | |||
| S: * LIST () "/" INBOX | S: A001 OK [READ-WRITE] SELECT completed | |||
| S: A001 OK [READ-WRITE] SELECT completed | C: A002 IDLE | |||
| C: A002 IDLE | S: + idling | |||
| S: + idling | ...time passes; new mail arrives... | |||
| ...time passes; new mail arrives... | S: * 4 EXISTS | |||
| S: * 4 EXISTS | C: DONE | |||
| C: DONE | S: A002 OK IDLE terminated | |||
| S: A002 OK IDLE terminated | ...another client expunges message 2 now... | |||
| ...another client expunges message 2 now... | C: A003 FETCH 4 ALL | |||
| C: A003 FETCH 4 ALL | S: * 4 FETCH (...) | |||
| S: * 4 FETCH (...) | S: A003 OK FETCH completed | |||
| S: A003 OK FETCH completed | C: A004 IDLE | |||
| C: A004 IDLE | S: * 2 EXPUNGE | |||
| S: * 2 EXPUNGE | S: * 3 EXISTS | |||
| S: * 3 EXISTS | S: + idling | |||
| S: + idling | ...time passes; another client expunges message 3... | |||
| ...time passes; another client expunges message 3... | S: * 3 EXPUNGE | |||
| S: * 3 EXPUNGE | S: * 2 EXISTS | |||
| S: * 2 EXISTS | ...time passes; new mail arrives... | |||
| ...time passes; new mail arrives... | S: * 3 EXISTS | |||
| S: * 3 EXISTS | C: DONE | |||
| C: DONE | S: A004 OK IDLE terminated | |||
| S: A004 OK IDLE terminated | C: A005 FETCH 3 ALL | |||
| C: A005 FETCH 3 ALL | S: * 3 FETCH (...) | |||
| S: * 3 FETCH (...) | S: A005 OK FETCH completed | |||
| S: A005 OK FETCH completed | C: A006 IDLE | |||
| C: A006 IDLE | </sourcecode> | |||
| </artwork></figure> | </section> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| </section> | <name>Client Commands - Selected State</name> | |||
| <t> | ||||
| <section title='Client Commands - Selected State'> | ||||
| <t> | ||||
| In the selected state, commands that manipulate messages in a mailbox | In the selected state, commands that manipulate messages in a mailbox | |||
| are permitted. | are permitted. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| In addition to the universal commands (CAPABILITY, NOOP, and LOGOUT), | In addition to the universal commands (CAPABILITY, NOOP, and LOGOUT), | |||
| and the authenticated state commands (SELECT, EXAMINE, NAMESPACE, CREATE, | and the authenticated state commands (SELECT, EXAMINE, NAMESPACE, CREATE, | |||
| DELETE, RENAME, SUBSCRIBE, UNSUBSCRIBE, LIST, STATUS, and | DELETE, RENAME, SUBSCRIBE, UNSUBSCRIBE, LIST, STATUS, and | |||
| APPEND), the following commands are valid in the selected state: | APPEND), the following commands are valid in the selected state: | |||
| CLOSE, UNSELECT, EXPUNGE, SEARCH, FETCH, STORE, COPY, MOVE, and UID. | CLOSE, UNSELECT, EXPUNGE, SEARCH, FETCH, STORE, COPY, MOVE, and UID. | |||
| </t> | </t> | |||
| <section numbered="true" toc="default"> | ||||
| <section title='CLOSE Command'> | <name>CLOSE Command</name> | |||
| <iref item='CLOSE (command)'/> | <iref item="CLOSE (command)" subitem="" primary="false"/> | |||
| <dl newline="false" spacing="normal" indent="14"> | ||||
| <t> | <dt>Arguments:</dt> | |||
| <list style='hanging' hangIndent='12'> | <dd>none</dd> | |||
| <t hangText='Arguments:'>none</t> | <dt>Responses:</dt> | |||
| <dd>no specific responses for this command</dd> | ||||
| <t hangText='Responses:'>no specific responses for this command</t> | <dt>Result:</dt> | |||
| <dd> | ||||
| <t hangText='Result:'>OK - close completed, now in authenticated state<vspace | <dl spacing="compact"> | |||
| /> | <dt>OK -</dt><dd>close completed, now in authenticated state</dd> | |||
| BAD - command unknown or arguments invalid</t> | <dt>BAD -</dt><dd>command unknown or arguments invalid</dd> | |||
| </list> | </dl> | |||
| </t> | </dd> | |||
| </dl> | ||||
| <t> | <t> | |||
| The CLOSE command permanently removes all messages that have the | The CLOSE command permanently removes all messages that have the | |||
| \Deleted flag set from the currently selected mailbox, and returns | \Deleted flag set from the currently selected mailbox, and it returns | |||
| to the authenticated state from the selected state. No untagged | to the authenticated state from the selected state. No untagged | |||
| EXPUNGE responses are sent. | EXPUNGE responses are sent. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| No messages are removed, and no error is given, if the mailbox is | No messages are removed, and no error is given, if the mailbox is | |||
| selected by an EXAMINE command or is otherwise selected read-only. | selected by an EXAMINE command or is otherwise selected as read-only. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| Even if a mailbox is selected, a SELECT, EXAMINE, or LOGOUT | Even if a mailbox is selected, a SELECT, EXAMINE, or LOGOUT | |||
| command MAY be issued without previously issuing a CLOSE command. | command <bcp14>MAY</bcp14> be issued without previously issuing a CLOSE co mmand. | |||
| The SELECT, EXAMINE, and LOGOUT commands implicitly close the | The SELECT, EXAMINE, and LOGOUT commands implicitly close the | |||
| currently selected mailbox without doing an expunge. However, | currently selected mailbox without doing an expunge. However, | |||
| when many messages are deleted, a CLOSE-LOGOUT or CLOSE-SELECT | when many messages are deleted, a CLOSE-LOGOUT or CLOSE-SELECT | |||
| sequence is considerably faster than an EXPUNGE-LOGOUT or | sequence is considerably faster than an EXPUNGE-LOGOUT or | |||
| EXPUNGE-SELECT because no untagged EXPUNGE responses (which the | EXPUNGE-SELECT because no untagged EXPUNGE responses (which the | |||
| client would probably ignore) are sent. | client would probably ignore) are sent. | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | Example: | |||
| Example: C: A341 CLOSE | </t> | |||
| S: A341 OK CLOSE completed | <sourcecode type=""> | |||
| </artwork></figure> | C: A341 CLOSE | |||
| S: A341 OK CLOSE completed | ||||
| </section> | </sourcecode> | |||
| </section> | ||||
| <section title='UNSELECT Command'> | <section numbered="true" toc="default"> | |||
| <iref item='UNSELECT (command)'/> | <name>UNSELECT Command</name> | |||
| <iref item="UNSELECT (command)" subitem="" primary="false"/> | ||||
| <t> | <dl newline="false" spacing="normal" indent="14"> | |||
| <list style='hanging' hangIndent='12'> | <dt>Arguments:</dt> | |||
| <t hangText='Arguments:'>none</t> | <dd>none</dd> | |||
| <dt>Responses:</dt> | ||||
| <t hangText='Responses:'>no specific responses for this command</t> | <dd>no specific responses for this command</dd> | |||
| <dt>Result:</dt> | ||||
| <t hangText='Result:'> | <dd> | |||
| OK - unselect completed, now in authenticated state<vspace/> | <dl spacing="compact"> | |||
| BAD - no mailbox selected, or argument supplied but | <dt>OK -</dt><dd>unselect completed, now in authenticated state</d | |||
| none permitted | d> | |||
| </t> | <dt>BAD -</dt><dd>no mailbox selected, or argument supplied but | |||
| </list> | none permitted</dd> | |||
| </t> | </dl> | |||
| </dd> | ||||
| <t> | </dl> | |||
| The UNSELECT command frees session's resources associated with the | <t> | |||
| The UNSELECT command frees a session's resources associated with the | ||||
| selected mailbox and returns the server to the authenticated | selected mailbox and returns the server to the authenticated | |||
| state. This command performs the same actions as CLOSE, except | state. This command performs the same actions as CLOSE, except | |||
| that no messages are permanently removed from the currently | that no messages are permanently removed from the currently | |||
| selected mailbox. | selected mailbox. | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | Example: | |||
| Example: C: A342 UNSELECT | </t> | |||
| S: A342 OK Unselect completed | <sourcecode type=""> | |||
| </artwork></figure> | C: A342 UNSELECT | |||
| S: A342 OK Unselect completed | ||||
| </section> | </sourcecode> | |||
| </section> | ||||
| <section title='EXPUNGE Command'> | <section numbered="true" toc="default"> | |||
| <iref item='EXPUNGE (command)'/> | <name>EXPUNGE Command</name> | |||
| <iref item="EXPUNGE (command)" subitem="" primary="false"/> | ||||
| <t> | <dl newline="false" spacing="normal" indent="14"> | |||
| <list style='hanging' hangIndent='12'> | <dt>Arguments:</dt> | |||
| <t hangText='Arguments:'>none</t> | <dd>none</dd> | |||
| <dt>Responses:</dt> | ||||
| <t hangText='Responses:'>untagged responses: EXPUNGE</t> | <dd> | |||
| <dl spacing="compact"> | ||||
| <t hangText='Result:'>OK - expunge completed<vspace/> | <dt>untagged responses:</dt><dd>EXPUNGE</dd> | |||
| NO - expunge failure: can't expunge (e.g., permission<vspace/> | </dl> | |||
| denied)<vspace/> | </dd> | |||
| BAD - command unknown or arguments invalid</t> | <dt>Result:</dt> | |||
| </list> | <dd> | |||
| </t> | <dl spacing="compact"> | |||
| <dt>OK -</dt><dd>expunge completed</dd> | ||||
| <t> | <dt>NO -</dt><dd>expunge failure: can't expunge (e.g., permission | |||
| denied)</dd> | ||||
| <dt>BAD -</dt><dd>command unknown or arguments invalid</dd> | ||||
| </dl> | ||||
| </dd> | ||||
| </dl> | ||||
| <t> | ||||
| The EXPUNGE command permanently removes all messages that have the | The EXPUNGE command permanently removes all messages that have the | |||
| \Deleted flag set from the currently selected mailbox. Before | \Deleted flag set from the currently selected mailbox. Before | |||
| returning an OK to the client, an untagged EXPUNGE response is | returning an OK to the client, an untagged EXPUNGE response is | |||
| sent for each message that is removed. | sent for each message that is removed. | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | Example: | |||
| Example: C: A202 EXPUNGE | </t> | |||
| S: * 3 EXPUNGE | <sourcecode type=""> | |||
| S: * 3 EXPUNGE | C: A202 EXPUNGE | |||
| S: * 5 EXPUNGE | S: * 3 EXPUNGE | |||
| S: * 8 EXPUNGE | S: * 3 EXPUNGE | |||
| S: A202 OK EXPUNGE completed | S: * 5 EXPUNGE | |||
| </artwork></figure> | S: * 8 EXPUNGE | |||
| S: A202 OK EXPUNGE completed | ||||
| <t> | </sourcecode> | |||
| <t> | ||||
| Note: In this example, messages 3, 4, 7, and 11 had the | Note: In this example, messages 3, 4, 7, and 11 had the | |||
| \Deleted flag set. See the description of the EXPUNGE | \Deleted flag set. See the description of the EXPUNGE | |||
| response (<xref target='expunge-response'/>) for further explanation. | response (<xref target="expunge-response" format="default"/>) for furthe | |||
| </t> | r explanation. | |||
| </t> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title='SEARCH Command'> | <name>SEARCH Command</name> | |||
| <iref item='SEARCH (command)'/> | <iref item="SEARCH (command)" subitem="" primary="false"/> | |||
| <dl newline="false" spacing="normal" indent="14"> | ||||
| <t> | <dt>Arguments:</dt> | |||
| <list style='hanging' hangIndent='12'> | <dd> | |||
| <t hangText='Arguments:'>OPTIONAL result specifier<vspace/> | <t><bcp14>OPTIONAL</bcp14> result specifier</t> | |||
| OPTIONAL <xref target='CHARSET'/> specification<vspace/> | <t> | |||
| <bcp14>OPTIONAL</bcp14> <xref target="RFC2978" format="default"/> | ||||
| specification</t> | ||||
| <t> | ||||
| searching criteria (one or more)</t> | searching criteria (one or more)</t> | |||
| </dd> | ||||
| <t hangText='Responses:'>OPTIONAL untagged response: ESEARCH</t> | <dt>Responses:</dt> | |||
| <dd> | ||||
| <t hangText='Result:'>OK - search completed<vspace/> | <dl spacing="compact"> | |||
| NO - search error: can't search that <xref target='CHARSET'/> or< | <dt><bcp14>OPTIONAL</bcp14> untagged response:</dt><dd>ESEARCH</dd> | |||
| vspace/> | </dl> | |||
| criteria<vspace/> | </dd> | |||
| BAD - command unknown or arguments invalid</t> | <dt>Result:</dt> | |||
| </list> | <dd> | |||
| </t> | <dl spacing="compact"> | |||
| <dt>OK -</dt><dd>search completed</dd> | ||||
| <t> | <dt>NO -</dt><dd>search error: can't search that <xref target="RFC | |||
| 2978" format="default"/> or criteria</dd> | ||||
| <dt>BAD -</dt><dd>command unknown or arguments invalid</dd> | ||||
| </dl> | ||||
| </dd> | ||||
| </dl> | ||||
| <t> | ||||
| The SEARCH command searches the mailbox for messages that match | The SEARCH command searches the mailbox for messages that match | |||
| the given searching criteria. | the given searching criteria. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The SEARCH command may contain result options. Result options control | The SEARCH command may contain result options. Result options control | |||
| what kind of information is returned about messages matching the search cri teria in an untagged ESEARCH response. | what kind of information is returned about messages matching the search cri teria in an untagged ESEARCH response. | |||
| If no result option is specified or empty list of options is specified "()" , ALL is assumed (see below). | If no result option is specified or empty list of options is specified as " ()", ALL is assumed (see below). | |||
| The order of individual options is arbitrary. Individual options | The order of individual options is arbitrary. Individual options | |||
| may contain parameters enclosed in parentheses. | may contain parameters enclosed in parentheses. | |||
| (However, if an option has a mandatory parameter, which can always be | (However, if an option has a mandatory parameter, which can always be | |||
| represented as a number or a sequence-set, the option parameter does | represented as a number or a sequence-set, the option parameter does | |||
| not need the enclosing parentheses. See the Formal Syntax (<xref target='I | not need the enclosing parentheses. See "Formal Syntax" (<xref target="IMA | |||
| MAP-ABNF'/>) | P-ABNF" format="default"/>) | |||
| for more details). If an option has | for more details.) If an option has | |||
| parameters, they consist of atoms and/or strings and/or lists in a | parameters, they consist of atoms and/or strings and/or lists in a | |||
| specific order. Any options not defined by extensions that the | specific order. Any options not defined by extensions that the | |||
| server supports MUST be rejected with a BAD response. | server supports <bcp14>MUST</bcp14> be rejected with a BAD response. | |||
| </t> | </t> | |||
| <t>Note that IMAP4rev1 used SEARCH responses <xref target="RFC3501" fo | ||||
| <t>Note that IMAP4rev1 used SEARCH responses <xref target='RFC3501'/> instead | rmat="default"/> instead of ESEARCH responses. | |||
| of ESEARCH responses. | Clients that support only IMAP4rev2 <bcp14>MUST</bcp14> ignore SEARCH | |||
| <!--///Alexey: in theory IMAP4rev2-only client would never see SEARCH respons | responses.</t> | |||
| es, | <t> | |||
| but if they forget to ENABLE IMAP4rev2, they might still get them from du | ||||
| al IMAP4rev1/IMAP4rev2 servers.--> | ||||
| IMAP4rev2-only clients MUST ignore SEARCH responses.</t> | ||||
| <t> | ||||
| This document specifies the following result options: | This document specifies the following result options: | |||
| </t> | ||||
| <list style='hanging'> | <dl newline="true" spacing="normal"> | |||
| <t hangText='MIN'> | <dt>MIN</dt> | |||
| <iref item='MIN (search result option)'/> | <dd><t><iref item="MIN (search result option)" subitem="" primary="f | |||
| alse"/> | ||||
| <list> | ||||
| <t> | ||||
| Return the lowest message number/UID that satisfies the SEARCH | Return the lowest message number/UID that satisfies the SEARCH | |||
| criteria. | criteria. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | If the SEARCH results in no matches, the server <bcp14>MUST NOT</b | |||
| If the SEARCH results in no matches, the server MUST NOT | cp14> | |||
| include the MIN result option in the ESEARCH response; however, | include the MIN result option in the ESEARCH response; however, | |||
| it still MUST send the ESEARCH response. | it still <bcp14>MUST</bcp14> send the ESEARCH response. | |||
| </t> | </t></dd> | |||
| </list> | <dt>MAX</dt> | |||
| </t> | <dd> | |||
| <t><iref item="MAX (search result option)" subitem="" primary="fal | ||||
| <t hangText='MAX'> | se"/> | |||
| <iref item='MAX (search result option)'/> | ||||
| <list> | ||||
| <t> | ||||
| Return the highest message number/UID that satisfies the SEARCH | Return the highest message number/UID that satisfies the SEARCH | |||
| criteria. | criteria.</t> | |||
| </t> | <t> | |||
| If the SEARCH results in no matches, the server <bcp14>MUST NOT</b | ||||
| <t> | cp14> | |||
| If the SEARCH results in no matches, the server MUST NOT | ||||
| include the MAX result option in the ESEARCH response; however, | include the MAX result option in the ESEARCH response; however, | |||
| it still MUST send the ESEARCH response. | it still <bcp14>MUST</bcp14> send the ESEARCH response.</t> | |||
| </t> | </dd> | |||
| </list> | <dt>ALL</dt> | |||
| </t> | <dd><t><iref item="ALL (search result option)" subitem="" primary="f | |||
| alse"/> | ||||
| <t hangText='ALL'> | ||||
| <iref item='ALL (search result option)'/> | ||||
| <list> | ||||
| <t> | ||||
| Return all message numbers/UIDs that satisfy the SEARCH | Return all message numbers/UIDs that satisfy the SEARCH | |||
| criteria using the sequence-set syntax. Note, the client | criteria using the sequence-set syntax. Note that the client | |||
| MUST NOT assume that messages/UIDs will be listed in any | <bcp14>MUST NOT</bcp14> assume that messages/UIDs will be listed in | |||
| particular order. | any | |||
| </t> | particular order.</t> | |||
| <t> | ||||
| <t> | If the SEARCH results in no matches, the server <bcp14>MUST NOT</bcp14 | |||
| If the SEARCH results in no matches, the server MUST NOT | > | |||
| include the ALL result option in the ESEARCH response; however, | include the ALL result option in the ESEARCH response; however, | |||
| it still MUST send the ESEARCH response. | it still <bcp14>MUST</bcp14> send the ESEARCH response.</t> | |||
| </t> | </dd> | |||
| </list> | ||||
| </t> | ||||
| <t hangText='COUNT'> | <dt>COUNT</dt> | |||
| <iref item='COUNT (search result option)'/> | <dd> | |||
| <iref item="COUNT (search result option)" subitem="" primary="fals | ||||
| e"/> | ||||
| Return the number of messages that satisfy the SEARCH criteria. | Return the number of messages that satisfy the SEARCH criteria. | |||
| This result option MUST always be included in the ESEARCH | This result option <bcp14>MUST</bcp14> always be included in the ESE ARCH | |||
| response. | response. | |||
| </t> | </dd> | |||
| <dt>SAVE</dt> | ||||
| <t hangText='SAVE'> | <dd> | |||
| <iref item='SAVE (search result option)'/> | <t><iref item="SAVE (search result option)" subitem="" primary="fa | |||
| <list> | lse"/> | |||
| <t> | ||||
| This option tells the server to remember the result | This option tells the server to remember the result | |||
| of the SEARCH or UID SEARCH command (as well as any command based on | of the SEARCH or UID SEARCH command (as well as any command based on | |||
| SEARCH, e.g., SORT and THREAD <xref target="RFC5256"/>>) and store it in an internal | SEARCH, e.g., SORT and THREAD <xref target="RFC5256" format="default"/ >) and store it in an internal | |||
| variable that we will reference as the "search result variable". The | variable that we will reference as the "search result variable". The | |||
| client can use the "$" marker to reference the content of this | client can use the "$" marker to reference the content of this | |||
| internal variable. The "$" marker can be used instead of message | internal variable. The "$" marker can be used instead of message | |||
| sequence or UID sequence in order to indicate that the server should | sequence or UID sequence in order to indicate that the server should | |||
| substitute it with the list of messages from the search result | substitute it with the list of messages from the search result | |||
| variable. Thus, the client can use the result of the latest | variable. Thus, the client can use the result of the latest | |||
| remembered SEARCH command as a parameter to another command. | remembered SEARCH command as a parameter to another command. | |||
| See <xref target="search-save"/> for details on how | See <xref target="search-save" format="default"/> for details on how | |||
| the value of the search result variable is determined, | the value of the search result variable is determined, | |||
| how it is affected by other commands executed, and how | how it is affected by other commands executed, and how | |||
| SAVE return option interacts with other return options. | the SAVE return option interacts with other return options. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| In absence of any other SEARCH result option, the SAVE result option | In absence of any other SEARCH result option, the SAVE result option | |||
| also suppresses any ESEARCH response that would have been otherwise | also suppresses any ESEARCH response that would have been otherwise | |||
| returned by the SEARCH command. | returned by the SEARCH command.</t> | |||
| </t> | </dd> | |||
| </dl> | ||||
| </list> | <t> | |||
| </t> | ||||
| </list> | ||||
| </t> | ||||
| <t> | ||||
| Note: future extensions to this document can allow servers to | Note: future extensions to this document can allow servers to | |||
| return multiple ESEARCH responses for a single extended SEARCH | return multiple ESEARCH responses for a single extended SEARCH | |||
| command. However all options specified above MUST result in a single ESEARCH response if used by themselves or in combination. | command. However, all options specified above <bcp14>MUST</bcp14> result in a single ESEARCH response if used by themselves or in combination. | |||
| This guarantee simplifies processing in IMAP4rev2 clients. | This guarantee simplifies processing in IMAP4rev2 clients. | |||
| Future SEARCH extensions that relax this restriction will have to describe ho w results from | Future SEARCH extensions that relax this restriction will have to describe ho w results from | |||
| multiple ESEARCH responses are to be combined. | multiple ESEARCH responses are to be combined. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| Searching criteria consist of one | Searching criteria consist of one | |||
| or more search keys. | or more search keys. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| When multiple keys are specified, the result is the intersection | When multiple keys are specified, the result is the intersection | |||
| (AND function) of all the messages that match those keys. For | (AND function) of all the messages that match those keys. For | |||
| example, the criteria DELETED FROM "SMITH" SINCE 1-Feb-1994 refers | example, the criteria DELETED FROM "SMITH" SINCE 1-Feb-1994 refers | |||
| to all deleted messages from Smith with INTERNALDATE greater than | to all deleted messages from Smith with INTERNALDATE greater than | |||
| February 1, 1994. A search key can also be a parenthesized | February 1, 1994. A search key can also be a parenthesized | |||
| list of one or more search keys (e.g., for use with the OR and NOT | list of one or more search keys (e.g., for use with the OR and NOT | |||
| keys). | keys). | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Server implementations <bcp14>MAY</bcp14> exclude <xref target="RFC2045" f | |||
| Server implementations MAY exclude <xref target='MIME-IMB'/> body parts wi | ormat="default"/> body parts with | |||
| th | ||||
| terminal content media types other than TEXT and MESSAGE from | terminal content media types other than TEXT and MESSAGE from | |||
| consideration in SEARCH matching. | consideration in SEARCH matching. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | The <bcp14>OPTIONAL</bcp14> <xref target="RFC2978" format="default"/> spec | |||
| The OPTIONAL <xref target='CHARSET'/> specification consists of the word | ification consists of the word | |||
| "CHARSET" followed by a registered <xref target='CHARSET'/> <xref target=' | "CHARSET" followed by the name of a character set from the registry <xref | |||
| CHARSET-REG'/>. It indicates the | target="CHARSET-REG" format="default"/>. It indicates the | |||
| <xref target='CHARSET'/> of the strings that appear in the search criteria | <xref target="RFC2978" format="default"/> of the strings that appear in th | |||
| . | e search criteria. | |||
| <xref target='MIME-IMB'/> content transfer encodings, and <xref target='MI | <xref target="RFC2045" format="default"/> content transfer encodings and < | |||
| ME-HDRS'/> strings in | xref target="RFC2047" format="default"/> strings in | |||
| <xref target='RFC-5322'/>/<xref target='MIME-IMB'/> headers, MUST be decod | <xref target="RFC5322" format="default"/>/<xref target="RFC2045" format="d | |||
| ed before comparing | efault"/> headers <bcp14>MUST</bcp14> be decoded before comparing | |||
| text. Servers MUST support US-ASCII and UTF-8 charsets; other <xref targe | text. Servers <bcp14>MUST</bcp14> support US-ASCII and UTF-8 charsets; ot | |||
| t='CHARSET'/>s MAY be supported. | her CHARSETs <bcp14>MAY</bcp14> be supported. | |||
| Clients SHOULD use UTF-8. Note that if "CHARSET" is not provided IMAP4rev2 | Clients <bcp14>SHOULD</bcp14> use UTF-8. Note that if CHARSET is not provi | |||
| servers MUST assume UTF-8, | ded, IMAP4rev2 servers <bcp14>MUST</bcp14> assume UTF-8, | |||
| so selecting CHARSET UTF-8 is redundant. It is permitted for improved comp atibility with existing IMAP4rev1 clients. | so selecting CHARSET UTF-8 is redundant. It is permitted for improved comp atibility with existing IMAP4rev1 clients. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | If the server does not support the specified <xref target="RFC2978" format | |||
| If the server does not support the specified <xref target='CHARSET'/>, it | ="default"/>, it <bcp14>MUST</bcp14> | |||
| MUST | return a tagged NO response (not a BAD). This response <bcp14>SHOULD</bcp | |||
| return a tagged NO response (not a BAD). This response SHOULD | 14> | |||
| contain the BADCHARSET response code, which MAY list the | contain the BADCHARSET response code, which <bcp14>MAY</bcp14> list the CH | |||
| <xref target='CHARSET'/>s supported by the server. | ARSETs | |||
| </t> | supported by the server. | |||
| </t> | ||||
| <t> | <t> | |||
| In all search keys that use strings and unless specified otherwise, | In all search keys that use strings, and unless otherwise specified, | |||
| a message matches the key if | a message matches the key if | |||
| the string is a substring of the associated text. The matching SHOULD be | the string is a substring of the associated text. The matching <bcp14>SHO | |||
| case-insensitive for characters within ASCII range. Consider using <xref t | ULD</bcp14> be | |||
| arget="IMAP-I18N"/> | case insensitive for characters within the ASCII range. Consider using <xr | |||
| for language-sensitive case-insensitive | ef target="RFC5255" format="default"/> | |||
| for language-sensitive, case-insensitive | ||||
| searching. Note that the empty string is a substring; this | searching. Note that the empty string is a substring; this | |||
| is useful when doing a HEADER search in order to test for a header field | is useful when performing a HEADER search in order to test for a header fi eld | |||
| presence in the message. | presence in the message. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | The defined search keys are as follows. Refer to "Formal | |||
| The defined search keys are as follows. Refer to the Formal | Syntax" (<xref target="IMAP-ABNF"/>) for the precise syntactic definitions | |||
| Syntax section for the precise syntactic definitions of the | of the | |||
| arguments. | arguments. | |||
| </t> | ||||
| <list style='hanging'> | <dl newline="true" spacing="normal"> | |||
| <t hangText='<sequence set>'> | <dt><sequence set></dt> | |||
| <!-- iref item='<sequence set> (search key)'/ --> | <dd> | |||
| Messages with message sequence numbers corresponding to the | Messages with message sequence numbers corresponding to the | |||
| specified message sequence number set.</t> | specified message sequence number set.</dd> | |||
| <dt>ALL</dt> | ||||
| <t hangText='ALL'> | <dd> | |||
| <iref item='ALL (search key)'/> | <iref item="ALL (search key)" subitem="" primary="false"/> | |||
| All messages in the mailbox; the default initial key for | All messages in the mailbox; the default initial key for | |||
| ANDing.</t> | ANDing.</dd> | |||
| <dt>ANSWERED</dt> | ||||
| <t hangText='ANSWERED'> | <dd> | |||
| <iref item='ANSWERED (search key)'/> | <iref item="ANSWERED (search key)" subitem="" primary="false"/> | |||
| Messages with the \Answered flag set.</t> | Messages with the \Answered flag set.</dd> | |||
| <dt>BCC <string></dt> | ||||
| <t hangText='BCC <string>'> | <dd> | |||
| <iref item='BCC <string> (search key)'/> | <iref item="BCC <string> (search key)" subitem="" primary="f | |||
| <!--///Alexey: Does this mean the email address, the display name or eit | alse"/> | |||
| her? | ||||
| M-Box is matching against RFC 5322 representation.--> | ||||
| Messages that contain the specified string in the envelope | Messages that contain the specified string in the envelope | |||
| structure's BCC field.</t> | structure's Blind Carbon Copy (BCC) field.</dd> | |||
| <dt>BEFORE <date></dt> | ||||
| <t hangText='BEFORE <date>'> | <dd> | |||
| <iref item='BEFORE <date> (search key)'/> | <iref item="BEFORE <date> (search key)" subitem="" primary=" | |||
| false"/> | ||||
| Messages whose internal date (disregarding time and timezone) | Messages whose internal date (disregarding time and timezone) | |||
| is earlier than the specified date.</t> | is earlier than the specified date.</dd> | |||
| <dt>BODY <string></dt> | ||||
| <t hangText='BODY <string>'> | <dd> | |||
| <iref item='BODY <string> (search key)'/> | <iref item="BODY <string> (search key)" subitem="" primary=" | |||
| false"/> | ||||
| Messages that contain the specified string in the body of the | Messages that contain the specified string in the body of the | |||
| message. Unlike TEXT (see below), this doesn't match any header fields. | message. Unlike TEXT (see below), this doesn't match any header fields. | |||
| Servers are allowed to implement flexible matching for this search key, | Servers are allowed to implement flexible matching for this search key, | |||
| for example matching "swim" to both "swam" and "swum" in English langua | for example, by matching "swim" to both "swam" and "swum" in English la | |||
| ge text | nguage text | |||
| or only doing full word matching (where "swim" will not match "swimming | or only performing full word matching (where "swim" will not match "swi | |||
| "). | mming"). | |||
| </t> | </dd> | |||
| <dt>CC <string></dt> | ||||
| <t hangText='CC <string>'> | <dd> | |||
| <iref item='CC <string> (search key)'/> | <iref item="CC <string> (search key)" subitem="" primary="fa | |||
| lse"/> | ||||
| Messages that contain the specified string in the envelope | Messages that contain the specified string in the envelope | |||
| structure's CC field.</t> | structure's CC field.</dd> | |||
| <dt>DELETED</dt> | ||||
| <t hangText='DELETED'> | <dd> | |||
| <iref item='DELETED (search key)'/> | <iref item="DELETED (search key)" subitem="" primary="false"/> | |||
| Messages with the \Deleted flag set.</t> | Messages with the \Deleted flag set.</dd> | |||
| <dt>DRAFT</dt> | ||||
| <t hangText='DRAFT'> | <dd> | |||
| <iref item='DRAFT (search key)'/> | <iref item="DRAFT (search key)" subitem="" primary="false"/> | |||
| Messages with the \Draft flag set.</t> | Messages with the \Draft flag set.</dd> | |||
| <dt>FLAGGED</dt> | ||||
| <t hangText='FLAGGED'> | <dd> | |||
| <iref item='FLAGGED (search key)'/> | <iref item="FLAGGED (search key)" subitem="" primary="false"/> | |||
| Messages with the \Flagged flag set.</t> | Messages with the \Flagged flag set.</dd> | |||
| <dt>FROM <string></dt> | ||||
| <t hangText='FROM <string>'> | <dd> | |||
| <iref item='FROM <string> (search key)'/> | <iref item="FROM <string> (search key)" subitem="" primary=" | |||
| false"/> | ||||
| Messages that contain the specified string in the envelope | Messages that contain the specified string in the envelope | |||
| structure's FROM field.</t> | structure's FROM field.</dd> | |||
| <dt>HEADER <field-name> <string></dt> | ||||
| <t hangText='HEADER <field-name> <string>'> | <dd> | |||
| <iref item='HEADER <field-name> <string> (search key)'/> | <iref item="HEADER <field-name> <string> (search key)" | |||
| subitem="" primary="false"/> | ||||
| Messages that have a header field with the specified field-name (as | Messages that have a header field with the specified field-name (as | |||
| defined in <xref target='RFC-5322'/>) and that contains the specified s tring | defined in <xref target="RFC5322" format="default"/>) and that contain the specified string | |||
| in the text of the header field (what comes after the colon). If the | in the text of the header field (what comes after the colon). If the | |||
| string to search is zero-length, this matches all messages that | string to search is zero-length, this matches all messages that | |||
| have a header field with the specified field-name regardless of | have a header field with the specified field-name regardless of | |||
| the contents. Servers should use substring search for this SEARCH item, | the contents. Servers should use a substring search for this SEARCH ite m, | |||
| as clients can use it for automatic processing not initiated by end use rs. | as clients can use it for automatic processing not initiated by end use rs. | |||
| For example this can be used for searching for Message-ID or Content-Ty | For example, this can be used when searching for Message-ID or Content- | |||
| pe header field | Type header field | |||
| values that need to be exact, or for searches in header fields that the | values that need to be exact or for searches in header fields that the | |||
| IMAP server | IMAP server | |||
| might not know anything about.</t> | might not know anything about.</dd> | |||
| <dt>KEYWORD <flag></dt> | ||||
| <t hangText='KEYWORD <flag>'> | <dd> | |||
| <iref item='KEYWORD <flag> (search key)'/> | <iref item="KEYWORD <flag> (search key)" subitem="" primary= | |||
| Messages with the specified keyword flag set.</t> | "false"/> | |||
| Messages with the specified keyword flag set.</dd> | ||||
| <t hangText='LARGER <n>'> | <dt>LARGER <n></dt> | |||
| <iref item='LARGER <n> (search key)'/> | <dd> | |||
| Messages with an <xref target='RFC-5322'/> size larger than the specifi | <iref item="LARGER <n> (search key)" subitem="" primary="fal | |||
| ed | se"/> | |||
| number of octets.</t> | Messages with an RFC822.SIZE larger than the specified | |||
| number of octets.</dd> | ||||
| <t hangText='NOT <search-key>'> | <dt>NOT <search-key></dt> | |||
| <iref item='NOT <search-key> (search key)'/> | <dd> | |||
| Messages that do not match the specified search key.</t> | <iref item="NOT <search-key> (search key)" subitem="" primar | |||
| y="false"/> | ||||
| <t hangText='ON <date>'> | Messages that do not match the specified search key.</dd> | |||
| <iref item='ON <date> (search key)'/> | <dt>ON <date></dt> | |||
| <dd> | ||||
| <iref item="ON <date> (search key)" subitem="" primary="fals | ||||
| e"/> | ||||
| Messages whose internal date (disregarding time and timezone) | Messages whose internal date (disregarding time and timezone) | |||
| is within the specified date.</t> | is within the specified date.</dd> | |||
| <dt>OR <search-key1> <search-key2></dt> | ||||
| <t hangText='OR <search-key1> <search-key2>'> | <dd> | |||
| <iref item='OR <search-key1> <search-key2> (search key)'/> | <iref item="OR <search-key1> <search-key2> (search key | |||
| Messages that match either search key.</t> | )" subitem="" primary="false"/> | |||
| Messages that match either search key.</dd> | ||||
| <t hangText='SEEN'> | <dt>SEEN</dt> | |||
| <iref item='SEEN (search key)'/> | <dd> | |||
| Messages that have the \Seen flag set.</t> | <iref item="SEEN (search key)" subitem="" primary="false"/> | |||
| Messages that have the \Seen flag set.</dd> | ||||
| <t hangText='SENTBEFORE <date>'> | <dt>SENTBEFORE <date></dt> | |||
| <iref item='SENTBEFORE <date> (search key)'/> | <dd> | |||
| Messages whose <xref target='RFC-5322'/> Date: header field (disregardi | <iref item="SENTBEFORE <date> (search key)" subitem="" prima | |||
| ng time and | ry="false"/> | |||
| timezone) is earlier than the specified date.</t> | Messages whose <xref target="RFC5322" format="default"/> Date: header f | |||
| ield (disregarding time and | ||||
| <t hangText='SENTON <date>'> | timezone) is earlier than the specified date.</dd> | |||
| <iref item='SENTON <date> (search key)'/> | <dt>SENTON <date></dt> | |||
| Messages whose <xref target='RFC-5322'/> Date: header field (disregardi | <dd> | |||
| ng time and | <iref item="SENTON <date> (search key)" subitem="" primary=" | |||
| timezone) is within the specified date.</t> | false"/> | |||
| Messages whose <xref target="RFC5322" format="default"/> Date: header f | ||||
| <t hangText='SENTSINCE <date>'> | ield (disregarding time and | |||
| <iref item='SENTSINCE <date> (search key)'/> | timezone) is within the specified date.</dd> | |||
| Messages whose <xref target='RFC-5322'/> Date: header field (disregardi | <dt>SENTSINCE <date></dt> | |||
| ng time and | <dd> | |||
| timezone) is within or later than the specified date.</t> | <iref item="SENTSINCE <date> (search key)" subitem="" primar | |||
| y="false"/> | ||||
| <t hangText='SINCE <date>'> | Messages whose <xref target="RFC5322" format="default"/> Date: header f | |||
| <iref item='SINCE <date> (search key)'/> | ield (disregarding time and | |||
| timezone) is within or later than the specified date.</dd> | ||||
| <dt>SINCE <date></dt> | ||||
| <dd> | ||||
| <iref item="SINCE <date> (search key)" subitem="" primary="f | ||||
| alse"/> | ||||
| Messages whose internal date (disregarding time and timezone) | Messages whose internal date (disregarding time and timezone) | |||
| is within or later than the specified date.</t> | is within or later than the specified date.</dd> | |||
| <dt>SMALLER <n></dt> | ||||
| <t hangText='SMALLER <n>'> | <dd> | |||
| <iref item='SMALLER <n> (search key)'/> | <iref item="SMALLER <n> (search key)" subitem="" primary="fa | |||
| Messages with an <xref target='RFC-5322'/> size smaller than the specif | lse"/> | |||
| ied | Messages with an RFC822.SIZE smaller than the specified | |||
| number of octets.</t> | number of octets.</dd> | |||
| <dt>SUBJECT <string></dt> | ||||
| <t hangText='SUBJECT <string>'> | <dd> | |||
| <iref item='SUBJECT <string> (search key)'/> | <iref item="SUBJECT <string> (search key)" subitem="" primar | |||
| y="false"/> | ||||
| Messages that contain the specified string in the envelope | Messages that contain the specified string in the envelope | |||
| structure's SUBJECT field.</t> | structure's SUBJECT field.</dd> | |||
| <dt>TEXT <string></dt> | ||||
| <t hangText='TEXT <string>'> | <dd> | |||
| <iref item='TEXT <string> (search key)'/> | <iref item="TEXT <string> (search key)" subitem="" primary=" | |||
| false"/> | ||||
| Messages that contain the specified string in the header (including MIM E header fields) or | Messages that contain the specified string in the header (including MIM E header fields) or | |||
| body of the message. | body of the message. | |||
| Servers are allowed to implement flexible matching for this search key, | Servers are allowed to implement flexible matching for this search key, | |||
| for example matching "swim" to both "swam" and "swum" in English langua | for example, matching "swim" to both "swam" and "swum" in English langu | |||
| ge text | age text | |||
| or only doing full word matching (where "swim" will not match "swimming | or only performing full-word matching (where "swim" will not match "swi | |||
| "). | mming"). | |||
| </t> | </dd> | |||
| <dt>TO <string></dt> | ||||
| <t hangText='TO <string>'> | <dd> | |||
| <iref item='TO <string> (search key)'/> | <iref item="TO <string> (search key)" subitem="" primary="fa | |||
| lse"/> | ||||
| Messages that contain the specified string in the envelope | Messages that contain the specified string in the envelope | |||
| structure's TO field.</t> | structure's TO field.</dd> | |||
| <dt>UID <sequence set></dt> | ||||
| <t hangText='UID <sequence set>'> | <dd> | |||
| <iref item='UID <sequence set> (search key)'/> | <iref item="UID <sequence set> (search key)" subitem="" prim | |||
| ary="false"/> | ||||
| Messages with unique identifiers corresponding to the specified | Messages with unique identifiers corresponding to the specified | |||
| unique identifier set. Sequence set ranges are permitted.</t> | unique identifier set. Sequence-set ranges are permitted.</dd> | |||
| <dt>UNANSWERED</dt> | ||||
| <t hangText='UNANSWERED'> | <dd> | |||
| <iref item='UNANSWERED (search key)'/> | <iref item="UNANSWERED (search key)" subitem="" primary="false"/> | |||
| Messages that do not have the \Answered flag set.</t> | Messages that do not have the \Answered flag set.</dd> | |||
| <dt>UNDELETED</dt> | ||||
| <t hangText='UNDELETED'> | <dd> | |||
| <iref item='UNDELETED (search key)'/> | <iref item="UNDELETED (search key)" subitem="" primary="false"/> | |||
| Messages that do not have the \Deleted flag set.</t> | Messages that do not have the \Deleted flag set.</dd> | |||
| <dt>UNDRAFT</dt> | ||||
| <t hangText='UNDRAFT'> | <dd> | |||
| <iref item='UNDRAFT (search key)'/> | <iref item="UNDRAFT (search key)" subitem="" primary="false"/> | |||
| Messages that do not have the \Draft flag set.</t> | Messages that do not have the \Draft flag set.</dd> | |||
| <dt>UNFLAGGED</dt> | ||||
| <t hangText='UNFLAGGED'> | <dd> | |||
| <iref item='UNFLAGGED (search key)'/> | <iref item="UNFLAGGED (search key)" subitem="" primary="false"/> | |||
| Messages that do not have the \Flagged flag set.</t> | Messages that do not have the \Flagged flag set.</dd> | |||
| <dt>UNKEYWORD <flag></dt> | ||||
| <t hangText='UNKEYWORD <flag>'> | <dd> | |||
| <iref item='UNKEYWORD <flag> (search key)'/> | <iref item="UNKEYWORD <flag> (search key)" subitem="" primar | |||
| Messages that do not have the specified keyword flag set.</t> | y="false"/> | |||
| Messages that do not have the specified keyword flag set.</dd> | ||||
| <t hangText='UNSEEN'> | <dt>UNSEEN</dt> | |||
| <iref item='UNSEEN (search key)'/> | <dd> | |||
| Messages that do not have the \Seen flag set.</t> | <iref item="UNSEEN (search key)" subitem="" primary="false"/> | |||
| </list> | Messages that do not have the \Seen flag set.</dd> | |||
| </t> | </dl> | |||
| <t> | ||||
| <figure><artwork> | Example: </t> | |||
| Example: C: A282 SEARCH RETURN (MIN COUNT) FLAGGED | <sourcecode type=""> | |||
| SINCE 1-Feb-1994 NOT FROM "Smith" | C: A282 SEARCH RETURN (MIN COUNT) FLAGGED | |||
| S: * ESEARCH (TAG "A282") MIN 2 COUNT 3 | SINCE 1-Feb-1994 NOT FROM "Smith" | |||
| S: A282 OK SEARCH completed | S: * ESEARCH (TAG "A282") MIN 2 COUNT 3 | |||
| S: A282 OK SEARCH completed | ||||
| Example: C: A283 SEARCH RETURN () FLAGGED | </sourcecode> | |||
| SINCE 1-Feb-1994 NOT FROM "Smith" | <t> | |||
| S: * ESEARCH (TAG "A283") ALL 2,10:11 | Example: </t> | |||
| S: A283 OK SEARCH completed | <sourcecode type=""> | |||
| C: A283 SEARCH RETURN () FLAGGED | ||||
| Example: C: A284 SEARCH TEXT "string not in mailbox" | SINCE 1-Feb-1994 NOT FROM "Smith" | |||
| S: * ESEARCH (TAG "A284") | S: * ESEARCH (TAG "A283") ALL 2,10:11 | |||
| S: A284 OK SEARCH completed | S: A283 OK SEARCH completed | |||
| C: A285 SEARCH CHARSET UTF-8 TEXT {6} | </sourcecode> | |||
| S: + Ready for literal text | ||||
| C: XXXXXX | ||||
| S: * ESEARCH (TAG "A285") ALL 43 | ||||
| S: A285 OK SEARCH completed | ||||
| </artwork></figure> | ||||
| <t><!--RFC Editor: please amend the following note to match current state | ||||
| of XMLv3 and RFC Editor's policy. Happy to add an UTF-8 example above, | ||||
| if you think it is helpful.--> | ||||
| Note: Since this document is restricted to 7-bit ASCII | ||||
| text, it is not possible to show actual UTF-8 data. The | ||||
| "XXXXXX" is a placeholder for what would be 6 octets of | ||||
| 8-bit data in an actual transaction. | ||||
| </t> | ||||
| <t> | <t> | |||
| Example:</t> | ||||
| <sourcecode type=""> | ||||
| C: A284 SEARCH TEXT "string not in mailbox" | ||||
| S: * ESEARCH (TAG "A284") | ||||
| S: A284 OK SEARCH completed | ||||
| C: A285 SEARCH CHARSET UTF-8 TEXT {12} | ||||
| S: + Ready for literal text | ||||
| C: отпуск | ||||
| S: * ESEARCH (TAG "A285") ALL 43 | ||||
| S: A285 OK SEARCH completed | ||||
| </sourcecode> | ||||
| <t> | ||||
| </t> | ||||
| <t> | ||||
| The following example demonstrates finding the first unseen message | The following example demonstrates finding the first unseen message | |||
| in the mailbox: | in the mailbox: | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | Example: </t> | |||
| Example: C: A284 SEARCH RETURN (MIN) UNSEEN | <sourcecode type=""> | |||
| S: * ESEARCH (TAG "A284") MIN 4 | C: A284 SEARCH RETURN (MIN) UNSEEN | |||
| S: A284 OK SEARCH completed | S: * ESEARCH (TAG "A284") MIN 4 | |||
| </artwork></figure> | S: A284 OK SEARCH completed | |||
| </sourcecode> | ||||
| <t> | <t> | |||
| The following example demonstrates that if the ESEARCH UID indicator | The following example demonstrates that if the ESEARCH UID indicator | |||
| is present, all data in the ESEARCH response is referring to UIDs; | is present, all data in the ESEARCH response is referring to UIDs; | |||
| for example, the MIN result specifier will be followed by a UID. | for example, the MIN result specifier will be followed by a UID. | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | Example: </t> | |||
| Example: C: A285 UID SEARCH RETURN (MIN MAX) 1:5000 | <sourcecode type=""> | |||
| S: * ESEARCH (TAG "A285") UID MIN 7 MAX 3800 | C: A285 UID SEARCH RETURN (MIN MAX) 1:5000 | |||
| S: A285 OK SEARCH completed | S: * ESEARCH (TAG "A285") UID MIN 7 MAX 3800 | |||
| </artwork></figure> | S: A285 OK SEARCH completed | |||
| </sourcecode> | ||||
| <t> | <t> | |||
| The following example demonstrates returning the number of deleted | The following example demonstrates returning the number of deleted | |||
| messages: | messages: | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | Example: </t> | |||
| Example: C: A286 SEARCH RETURN (COUNT) DELETED | <sourcecode type=""> | |||
| S: * ESEARCH (TAG "A286") COUNT 15 | C: A286 SEARCH RETURN (COUNT) DELETED | |||
| S: A286 OK SEARCH completed | S: * ESEARCH (TAG "A286") COUNT 15 | |||
| </artwork></figure> | S: A286 OK SEARCH completed | |||
| </sourcecode> | ||||
| <section title='SAVE result option and SEARCH result variable' anchor="s | <section anchor="search-save" numbered="true" toc="default"> | |||
| earch-save"> | <name>SAVE Result Option and SEARCH Result Variable</name> | |||
| <t> | ||||
| <t> | ||||
| Upon successful completion of a SELECT or an EXAMINE command (after | Upon successful completion of a SELECT or an EXAMINE command (after | |||
| the tagged OK response), the current search result variable is reset | the tagged OK response), the current search result variable is reset | |||
| to the empty sequence. | to the empty sequence. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| A successful SEARCH command with the SAVE result option sets the | A successful SEARCH command with the SAVE result option sets the | |||
| value of the search result variable to the list of messages found in | value of the search result variable to the list of messages found in | |||
| the SEARCH command. For example, if no messages were found, the | the SEARCH command. For example, if no messages were found, the | |||
| search result variable will contain the empty sequence. | search result variable will contain the empty sequence. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Any of the following SEARCH commands <bcp14>MUST NOT</bcp14> change the searc | |||
| Any of the following SEARCH commands MUST NOT change the search | h | |||
| result variable: | result variable: | |||
| <list> | </t> | |||
| <t> | <ul empty="true" spacing="normal"> | |||
| <li> | ||||
| a SEARCH command that caused the server to return the BAD tagged | a SEARCH command that caused the server to return the BAD tagged | |||
| response, | response, | |||
| </t> | </li> | |||
| <li> | ||||
| <t> | ||||
| a SEARCH command with no SAVE result option that caused the | a SEARCH command with no SAVE result option that caused the | |||
| server to return NO tagged response, | server to return NO tagged response, and | |||
| </t> | </li> | |||
| <li> | ||||
| <t> | ||||
| a successful SEARCH command with no SAVE result option. | a successful SEARCH command with no SAVE result option. | |||
| </t> | </li> | |||
| </list> | </ul> | |||
| <t> | ||||
| </t> | ||||
| <t> | ||||
| A SEARCH command with the SAVE result option that caused the server | A SEARCH command with the SAVE result option that caused the server | |||
| to return the NO tagged response sets the value of the search result | to return the NO tagged response sets the value of the search result | |||
| variable to the empty sequence. | variable to the empty sequence. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| When a message listed in the search result variable is EXPUNGEd, it | When a message listed in the search result variable is EXPUNGEd, it | |||
| is automatically removed from the list. Implementors are reminded | is automatically removed from the list. Implementors are reminded | |||
| that if the server stores the list as a list of message numbers, it | that if the server stores the list as a list of message numbers, it | |||
| MUST automatically adjust them when notifying the client about | <bcp14>MUST</bcp14> automatically adjust them when notifying the client about | |||
| expunged messages, as described in <xref target='expunge-response'/>. | expunged messages, as described in <xref target="expunge-response" format="de | |||
| </t> | fault"/>. | |||
| </t> | ||||
| <t> | <t> | |||
| If the server decides to send a new UIDVALIDITY value while the | If the server decides to send a new UIDVALIDITY value while the | |||
| mailbox is opened, this causes resetting of the search variable to | mailbox is opened, it causes the resetting of the search variable to | |||
| the empty sequence. | the empty sequence. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| Note that even if the "$" marker contains the empty sequence of messages, | Note that even if the "$" marker contains the empty sequence of messages, | |||
| it must be treated by all commands accepting message sets as | it must be treated by all commands accepting message sets as | |||
| parameters as a valid, but non-matching list of messages. For | parameters as a valid, but non-matching, list of messages. For | |||
| example, the "FETCH $" command would return a tagged OK response and | example, the "FETCH $" command would return a tagged OK response and | |||
| no FETCH responses. See also the Example 5 in <xref target='search-save-exam | no FETCH responses. See also Example 5 in <xref target="search-save-examples | |||
| ples'/>. | " format="default"/>. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The SAVE result option doesn't change whether the server would return | The SAVE result option doesn't change whether the server would return | |||
| items corresponding to MIN, MAX, ALL, or COUNT result options. | items corresponding to MIN, MAX, ALL, or COUNT result options. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| When the SAVE result option is combined with the MIN or MAX | When the SAVE result option is combined with the MIN or MAX | |||
| result option, and both ALL and COUNT result options are | result option, and both ALL and COUNT result options are | |||
| absent, the corresponding MIN/MAX is returned (if the search result | absent, the corresponding MIN/MAX is returned (if the search result | |||
| is not empty), but the "$" marker would contain a single message as | is not empty), but the "$" marker would contain a single message as | |||
| returned in the MIN/MAX return item. | returned in the MIN/MAX return item. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| If the SAVE result option is combined with both MIN and MAX result | If the SAVE result option is combined with both MIN and MAX result | |||
| options, and both ALL and COUNT result options are absent, | options, and both ALL and COUNT result options are absent, | |||
| the "$" marker would contain zero, one or two messages as returned in the | the "$" marker would contain zero messages, one message, or two messages as r eturned in the | |||
| MIN/MAX return items. | MIN/MAX return items. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| If the SAVE result option is combined with the ALL and/or COUNT | If the SAVE result option is combined with the ALL and/or COUNT | |||
| result option(s), the "$" marker would always contain all messages | result option(s), the "$" marker would always contain all messages | |||
| found by the SEARCH or UID SEARCH command. | found by the SEARCH or UID SEARCH command. | |||
| </t> | </t> | |||
| <t> | ||||
| <texttable> | ||||
| <preamble> | ||||
| The following table summarizes the additional requirement on ESEARCH | The following table summarizes the additional requirement on ESEARCH | |||
| server implementations described in this section. | server implementations described in this section. | |||
| </preamble> | </t> | |||
| <table align="center"> | ||||
| <ttcol align='center'>Combination of Result option</ttcol> | <thead> | |||
| <ttcol align='center'>"$" marker value</ttcol> | <tr> | |||
| <th align="center">Combination of Result Option</th> | ||||
| <c>SAVE MIN</c> | <th align="center">"$" Marker Value</th> | |||
| <c>MIN</c> | </tr> | |||
| </thead> | ||||
| <c>SAVE MAX</c> | <tbody> | |||
| <c>MAX</c> | <tr> | |||
| <td align="center">SAVE MIN</td> | ||||
| <c>SAVE MIN MAX</c> | <td align="center">MIN</td> | |||
| <c>MIN & MAX</c> | </tr> | |||
| <tr> | ||||
| <c>SAVE * [m]</c> | <td align="center">SAVE MAX</td> | |||
| <c>all found messages</c> | <td align="center">MAX</td> | |||
| </tr> | ||||
| <postamble> | <tr> | |||
| <td align="center">SAVE MIN MAX</td> | ||||
| <td align="center">MIN & MAX</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">SAVE * [m]</td> | ||||
| <td align="center">all found messages</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| <t> | ||||
| where '*' means "ALL" and/or "COUNT", and | where '*' means "ALL" and/or "COUNT", and | |||
| '[m]' means optional "MIN" and/or "MAX" | '[m]' means optional "MIN" and/or "MAX" | |||
| </postamble> | </t> | |||
| <t> | ||||
| </texttable> | ||||
| <t> | ||||
| Implementation note: server implementors should note that "$" can | Implementation note: server implementors should note that "$" can | |||
| reference IMAP message sequences or UID sequences, depending on the | reference IMAP message sequences or UID sequences, depending on the | |||
| context where it is used. For example, the "$" marker can be set as | context where it is used. For example, the "$" marker can be set as | |||
| a result of a SEARCH (SAVE) command and used as a parameter to a UID | a result of a SEARCH (SAVE) command and used as a parameter to a UID | |||
| FETCH command (which accepts a UID sequence, not a message sequence), | FETCH command (which accepts a UID sequence, not a message sequence), | |||
| or the "$" marker can be set as a result of a UID SEARCH (SAVE) | or the "$" marker can be set as a result of a UID SEARCH (SAVE) | |||
| command and used as a parameter to a FETCH command (which accepts a | command and used as a parameter to a FETCH command (which accepts a | |||
| message sequence, not a UID sequence). Server implementations need | message sequence, not a UID sequence). Server implementations need | |||
| to automatically map the "$" marker value to message numbers or UIDs, | to automatically map the "$" marker value to message numbers or UIDs, | |||
| depending on context where the "$" marker is used. | depending on the context where the "$" marker is used. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section anchor="search-save-pipelining" numbered="true" toc="default" | |||
| > | ||||
| <section title='Multiple Commands in Progress' anchor='search-save-pipel | <name>Multiple Commands in Progress</name> | |||
| ining'> | <t> | |||
| <t> | ||||
| Use of a SEARCH RETURN (SAVE) command followed by a command using the | Use of a SEARCH RETURN (SAVE) command followed by a command using the | |||
| "$" marker creates direct dependency between the two commands. As | "$" marker creates direct dependency between the two commands. As | |||
| directed by <xref target='pipelining'/>, a server MUST execute the two | directed by <xref target="pipelining" format="default"/>, a server <bcp14>MUS T</bcp14> execute the two | |||
| commands in the order they were received. | commands in the order they were received. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | A client <bcp14>MAY</bcp14> pipeline a SEARCH RETURN (SAVE) command with one | |||
| A client MAY pipeline a SEARCH RETURN (SAVE) command with one or more command | or more commands | |||
| using the "$" marker, as long as this doesn't create an ambiguity, | using the "$" marker, as long as this doesn't create an ambiguity, | |||
| as described in <xref target='pipelining'/>. Examples 7-9 in | as described in <xref target="pipelining" format="default"/>. Examples 7-9 in | |||
| <xref target='search-save-examples'/> explain this in more details. | <xref target="search-save-examples" format="default"/> explain this in more d | |||
| </t> | etails. | |||
| </t> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title='Refusing to Save Search Results'> | <name>Refusing to Save Search Results</name> | |||
| <t> | ||||
| <t> | In some cases, the server <bcp14>MAY</bcp14> refuse to save a SEARCH (SAVE) r | |||
| In some cases, the server MAY refuse to save a SEARCH (SAVE) result, | esult, | |||
| for example, if an internal limit on the number of saved results is | for example, if an internal limit on the number of saved results is | |||
| reached. | reached. | |||
| In this case, the server MUST return a tagged NO response containing | In this case, the server <bcp14>MUST</bcp14> return a tagged NO response cont aining | |||
| the NOTSAVED response code and set the search result variable to the | the NOTSAVED response code and set the search result variable to the | |||
| empty sequence, as described in <xref target="search-save"/>. | empty sequence, as described in <xref target="search-save" format="default"/> | |||
| </t> | . | |||
| </t> | ||||
| </section> | </section> | |||
| <section anchor="search-save-examples" numbered="true" toc="default"> | ||||
| <section title='Examples showing use of SAVE result option' anchor='sear | <name>Examples Showing Use of the SAVE Result Option</name> | |||
| ch-save-examples'> | ||||
| <!--RFC Editor: I am happy if you decide to extract comments from examples an | ||||
| d delete this sentence. | ||||
| Murray commented that most comments can be extracted. | ||||
| Don't bother if you think this is lots of work.--> | ||||
| <t>Only in this section: explanatory comments in examples that start with // are not part of | <t>Only in this section: explanatory comments in examples that start with // are not part of | |||
| the protocol. | the protocol. | |||
| </t> | </t> | |||
| <ol spacing="normal" type="1"><li> | ||||
| <t> | <t> | |||
| 1) The following example demonstrates how the client can use the | The following example demonstrates how the client can use the | |||
| result of a SEARCH command to FETCH headers of interesting | result of a SEARCH command to FETCH headers of interesting | |||
| messages: | messages: | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | Example 1: | |||
| Example 1: | </t> | |||
| C: A282 SEARCH RETURN (SAVE) FLAGGED SINCE 1-Feb-1994 | <sourcecode type=""> | |||
| NOT FROM "Smith" | C: A282 SEARCH RETURN (SAVE) FLAGGED SINCE 1-Feb-1994 | |||
| S: A282 OK SEARCH completed, result saved | NOT FROM "Smith" | |||
| C: A283 FETCH $ (UID INTERNALDATE FLAGS BODY.PEEK[HEADER]) | S: A282 OK SEARCH completed, result saved | |||
| S: * 2 FETCH (UID 14 ... | C: A283 FETCH $ (UID INTERNALDATE FLAGS BODY.PEEK[HEADER]) | |||
| S: * 84 FETCH (UID 100 ... | S: * 2 FETCH (UID 14 ... | |||
| S: * 882 FETCH (UID 1115 ... | S: * 84 FETCH (UID 100 ... | |||
| S: A283 OK completed | S: * 882 FETCH (UID 1115 ... | |||
| </artwork></figure> | S: A283 OK completed | |||
| </sourcecode> | ||||
| <t> | <t> | |||
| The client can also pipeline the two commands: | The client can also pipeline the two commands: | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | Example 2: | |||
| Example 2: | </t> | |||
| C: A282 SEARCH RETURN (SAVE) FLAGGED SINCE 1-Feb-1994 | <sourcecode type=""> | |||
| NOT FROM "Smith" | C: A282 SEARCH RETURN (SAVE) FLAGGED SINCE 1-Feb-1994 | |||
| C: A283 FETCH $ (UID INTERNALDATE FLAGS BODY.PEEK[HEADER]) | NOT FROM "Smith" | |||
| S: A282 OK SEARCH completed | C: A283 FETCH $ (UID INTERNALDATE FLAGS BODY.PEEK[HEADER]) | |||
| S: * 2 FETCH (UID 14 ... | S: A282 OK SEARCH completed | |||
| S: * 84 FETCH (UID 100 ... | S: * 2 FETCH (UID 14 ... | |||
| S: * 882 FETCH (UID 1115 ... | S: * 84 FETCH (UID 100 ... | |||
| S: A283 OK completed | S: * 882 FETCH (UID 1115 ... | |||
| </artwork></figure> | S: A283 OK completed | |||
| </sourcecode></li> | ||||
| <t> | <li><t> | |||
| 2) The following example demonstrates that the result of one SEARCH | The following example demonstrates that the result of one SEARCH | |||
| command can be used as input to another SEARCH command: | command can be used as input to another SEARCH command: | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | Example 3: | |||
| Example 3: | </t> | |||
| C: A300 SEARCH RETURN (SAVE) SINCE 1-Jan-2004 | <sourcecode type=""> | |||
| NOT FROM "Smith" | C: A300 SEARCH RETURN (SAVE) SINCE 1-Jan-2004 | |||
| S: A300 OK SEARCH completed | NOT FROM "Smith" | |||
| C: A301 UID SEARCH UID $ SMALLER 4096 | S: A300 OK SEARCH completed | |||
| S: * ESEARCH (TAG "A301") UID ALL 17,900,901 | C: A301 UID SEARCH UID $ SMALLER 4096 | |||
| S: A301 OK completed | S: * ESEARCH (TAG "A301") UID ALL 17,900,901 | |||
| </artwork></figure> | S: A301 OK completed | |||
| </sourcecode> | ||||
| <t> | ||||
| Note that the second command in Example 3 can be replaced with:</t> | ||||
| <t> | <sourcecode type=""> | |||
| Note that the second command in Example 3 can be replaced with:<vspace/> | C: A301 UID SEARCH $ SMALLER 4096 | |||
| C: A301 UID SEARCH $ SMALLER 4096<vspace/> | </sourcecode> | |||
| <t> | ||||
| and the result of the command would be the same. | and the result of the command would be the same. | |||
| </t> | </t></li> | |||
| <li> <t> | ||||
| <t> | The following example shows that the "$" | |||
| 3) The following example shows that the "$" | ||||
| marker can be combined with other message numbers using the OR | marker can be combined with other message numbers using the OR | |||
| SEARCH criterion. | SEARCH criterion. | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | Example 4: | |||
| Example 4: | </t> | |||
| C: P282 SEARCH RETURN (SAVE) SINCE 1-Feb-1994 | <sourcecode type=""> | |||
| NOT FROM "Smith" | C: P282 SEARCH RETURN (SAVE) SINCE 1-Feb-1994 | |||
| S: P282 OK SEARCH completed | NOT FROM "Smith" | |||
| C: P283 SEARCH CHARSET UTF-8 (OR $ 1,3000:3021) TEXT {8+} | S: P282 OK SEARCH completed | |||
| C: YYYYYYYY | C: P283 SEARCH CHARSET UTF-8 (OR $ 1,3000:3021) TEXT {8+} | |||
| S: * ESEARCH (TAG "P283") ALL 882,1102,3003,3005:3006 | C: мать | |||
| S: P283 OK completed | S: * ESEARCH (TAG "P283") ALL 882,1102,3003,3005:3006 | |||
| </artwork></figure> | S: P283 OK completed | |||
| </sourcecode> | ||||
| <t> | </li> | |||
| Note: Since this document format is restricted to 7-bit ASCII text, | <li><t> | |||
| it is not possible to show actual UTF-8 data. The "YYYYYYYY" is a | The following example demonstrates that a failed SEARCH sets the | |||
| placeholder for what would be 8 octets of 8-bit data in an actual | ||||
| transaction. | ||||
| </t> | ||||
| <t> | ||||
| 4) The following example demonstrates that a failed SEARCH sets the | ||||
| search result variable to the empty list. The server doesn't implement | search result variable to the empty list. The server doesn't implement | |||
| the KOI8-R charset. | the KOI8-R charset. | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | Example 5: | |||
| Example 5: | </t> | |||
| C: B282 SEARCH RETURN (SAVE) SINCE 1-Feb-1994 | <sourcecode type=""> | |||
| NOT FROM "Smith" | C: B282 SEARCH RETURN (SAVE) SINCE 1-Feb-1994 | |||
| S: B282 OK SEARCH completed | NOT FROM "Smith" | |||
| C: B283 SEARCH RETURN (SAVE) CHARSET KOI8-R | S: B282 OK SEARCH completed | |||
| (OR $ 1,3000:3021) TEXT {4} | C: B283 SEARCH RETURN (SAVE) CHARSET KOI8-R | |||
| C: XXXX | (OR $ 1,3000:3021) TEXT {4} | |||
| S: B283 NO [BADCHARSET UTF-8] KOI8-R is not supported | C: XXXX | |||
| //After this command the saved result variable contains | S: B283 NO [BADCHARSET UTF-8] KOI8-R is not supported | |||
| //no messages. A client that wants to reissue the B283 | //After this command, the saved result variable contains | |||
| //SEARCH command with another CHARSET would have to reissue | //no messages. A client that wants to reissue the B283 | |||
| //the B282 command as well. One possible workaround for | //SEARCH command with another CHARSET would have to reissue | |||
| //this is to include the desired CHARSET parameter | //the B282 command as well. One possible workaround for | |||
| //in the earliest SEARCH RETURN (SAVE) command in a | //this is to include the desired CHARSET parameter | |||
| //sequence of related SEARCH commands, to cause | //in the earliest SEARCH RETURN (SAVE) command in a | |||
| //the earliest SEARCH in the sequence to fail. | //sequence of related SEARCH commands, to cause | |||
| //A better approach might be to always use CHARSET UTF-8 | //the earliest SEARCH in the sequence to fail. | |||
| //instead. | //A better approach might be to always use CHARSET UTF-8 | |||
| </artwork></figure> | //instead. | |||
| </sourcecode> | ||||
| <t> | <t> | |||
| Note: Since this document format is restricted to 7-bit ASCII text, | Note: Since this document format is restricted to 7-bit ASCII text, | |||
| it is not possible to show actual KOI8-R data. The "XXXX" is a | it is not possible to show actual KOI8-R data. The "XXXX" is a | |||
| placeholder for what would be 4 octets of 8-bit data in an actual | placeholder for what would be 4 octets of 8-bit data in an actual | |||
| transaction. | transaction. | |||
| </t> | </t></li> | |||
| <li><t> | ||||
| <t> | The following example demonstrates that it is not an error to use | |||
| 5) The following example demonstrates that it is not an error to use | ||||
| the "$" marker when it contains no messages. | the "$" marker when it contains no messages. | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | Example 6: | |||
| Example 6: | </t> | |||
| C: E282 SEARCH RETURN (SAVE) SINCE 28-Oct-2006 | <sourcecode type=""> | |||
| NOT FROM "Eric" | C: E282 SEARCH RETURN (SAVE) SINCE 28-Oct-2006 | |||
| C: E283 COPY $ "Other Messages" | NOT FROM "Eric" | |||
| //The "$" contains no messages | C: E283 COPY $ "Other Messages" | |||
| S: E282 OK SEARCH completed | //The "$" contains no messages | |||
| S: E283 OK COPY completed, nothing copied | S: E282 OK SEARCH completed | |||
| </artwork></figure> | S: E283 OK COPY completed, nothing copied | |||
| </sourcecode> | ||||
| <figure><artwork> | <t> | |||
| Example 7: | Example 7: | |||
| C: F282 SEARCH RETURN (SAVE) KEYWORD $Junk | </t> | |||
| C: F283 COPY $ "Junk" | <sourcecode type=""> | |||
| C: F284 STORE $ +FLAGS.Silent (\Deleted) | C: F282 SEARCH RETURN (SAVE) KEYWORD $Junk | |||
| S: F282 OK SEARCH completed | C: F283 COPY $ "Junk" | |||
| S: F283 OK COPY completed | C: F284 STORE $ +FLAGS.Silent (\Deleted) | |||
| S: F284 OK STORE completed | S: F282 OK SEARCH completed | |||
| </artwork></figure> | S: F283 OK COPY completed | |||
| S: F284 OK STORE completed | ||||
| <figure><artwork> | </sourcecode> | |||
| Example 8: | <t> | |||
| C: G282 SEARCH RETURN (SAVE) KEYWORD $Junk | Example 8: | |||
| C: G283 SEARCH RETURN (ALL) SINCE 28-Oct-2006 | </t> | |||
| FROM "Eric" | <sourcecode type=""> | |||
| // The server can execute the two SEARCH commands | C: G282 SEARCH RETURN (SAVE) KEYWORD $Junk | |||
| // in any order, as they don't have any dependency. | C: G283 SEARCH RETURN (ALL) SINCE 28-Oct-2006 | |||
| // For example, it may return: | FROM "Eric" | |||
| S: * ESEARCH (TAG "G283") ALL 3:15,27,29:103 | // The server can execute the two SEARCH commands | |||
| S: G283 OK SEARCH completed | // in any order, as they don't have any dependency. | |||
| S: G282 OK SEARCH completed | // For example, it may return: | |||
| </artwork></figure> | S: * ESEARCH (TAG "G283") ALL 3:15,27,29:103 | |||
| S: G283 OK SEARCH completed | ||||
| <t> | S: G282 OK SEARCH completed | |||
| </sourcecode> | ||||
| <t> | ||||
| The following example demonstrates that the result of the second | The following example demonstrates that the result of the second | |||
| SEARCH RETURN (SAVE) always overrides the result of the first. | SEARCH RETURN (SAVE) always overrides the result of the first. | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | Example 9: | |||
| Example 9: | </t> | |||
| C: H282 SEARCH RETURN (SAVE) KEYWORD $Junk | <sourcecode type=""> | |||
| C: H283 SEARCH RETURN (SAVE) SINCE 28-Oct-2006 | C: H282 SEARCH RETURN (SAVE) KEYWORD $Junk | |||
| FROM "Eric" | C: H283 SEARCH RETURN (SAVE) SINCE 28-Oct-2006 | |||
| S: H282 OK SEARCH completed | FROM "Eric" | |||
| S: H283 OK SEARCH completed | S: H282 OK SEARCH completed | |||
| // At this point "$" would contain results of H283 | S: H283 OK SEARCH completed | |||
| </artwork></figure> | // At this point "$" would contain results of H283 | |||
| </sourcecode> | ||||
| <t> | <t> | |||
| The following example demonstrates behavioral difference for | The following example demonstrates behavioral difference for | |||
| different combinations of ESEARCH result options. | different combinations of ESEARCH result options. | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | Example 10: | |||
| Example 10: | </t> | |||
| C: C282 SEARCH RETURN (ALL) SINCE 12-Feb-2006 | <sourcecode type=""> | |||
| NOT FROM "Smith" | C: C282 SEARCH RETURN (ALL) SINCE 12-Feb-2006 | |||
| S: * ESEARCH (TAG "C283") ALL 2,10:15,21 | NOT FROM "Smith" | |||
| //$ value hasn't changed | S: * ESEARCH (TAG "C283") ALL 2,10:15,21 | |||
| S: C282 OK SEARCH completed | //$ value hasn't changed | |||
| S: C282 OK SEARCH completed | ||||
| C: C283 SEARCH RETURN (ALL SAVE) SINCE 12-Feb-2006 | ||||
| NOT FROM "Smith" | ||||
| S: * ESEARCH (TAG "C283") ALL 2,10:15,21 | ||||
| //$ value is 2,10:15,21 | ||||
| S: C283 OK SEARCH completed | ||||
| C: C284 SEARCH RETURN (SAVE MIN) SINCE 12-Feb-2006 | C: C283 SEARCH RETURN (ALL SAVE) SINCE 12-Feb-2006 | |||
| NOT FROM "Smith" | NOT FROM "Smith" | |||
| S: * ESEARCH (TAG "C284") MIN 2 | S: * ESEARCH (TAG "C283") ALL 2,10:15,21 | |||
| //$ value is 2 | //$ value is 2,10:15,21 | |||
| S: C284 OK SEARCH completed | S: C283 OK SEARCH completed | |||
| C: C285 SEARCH RETURN (MAX SAVE MIN) SINCE | C: C284 SEARCH RETURN (SAVE MIN) SINCE 12-Feb-2006 | |||
| 12-Feb-2006 NOT FROM "Smith" | NOT FROM "Smith" | |||
| S: * ESEARCH (TAG "C285") MIN 2 MAX 21 | S: * ESEARCH (TAG "C284") MIN 2 | |||
| //$ value is 2,21 | //$ value is 2 | |||
| S: C285 OK SEARCH completed | S: C284 OK SEARCH completed | |||
| C: C286 SEARCH RETURN (MAX SAVE MIN COUNT) | C: C285 SEARCH RETURN (MAX SAVE MIN) SINCE | |||
| SINCE 12-Feb-2006 NOT FROM "Smith" | 12-Feb-2006 NOT FROM "Smith" | |||
| S: * ESEARCH (TAG "C286") MIN 2 MAX 21 COUNT 8 | S: * ESEARCH (TAG "C285") MIN 2 MAX 21 | |||
| //$ value is 2,10:15,21 | //$ value is 2,21 | |||
| S: C286 OK SEARCH completed | S: C285 OK SEARCH completed | |||
| C: C286 SEARCH RETURN (ALL SAVE MIN) SINCE | C: C286 SEARCH RETURN (MAX SAVE MIN COUNT) | |||
| 12-Feb-2006 NOT FROM "Smith" | SINCE 12-Feb-2006 NOT FROM "Smith" | |||
| S: * ESEARCH (TAG "C286") MIN 2 ALL 2,10:15,21 | S: * ESEARCH (TAG "C286") MIN 2 MAX 21 COUNT 8 | |||
| //$ value is 2,10:15,21 | //$ value is 2,10:15,21 | |||
| S: C286 OK SEARCH completed | S: C286 OK SEARCH completed | |||
| </artwork></figure> | ||||
| C: C286 SEARCH RETURN (ALL SAVE MIN) SINCE | ||||
| 12-Feb-2006 NOT FROM "Smith" | ||||
| S: * ESEARCH (TAG "C286") MIN 2 ALL 2,10:15,21 | ||||
| //$ value is 2,10:15,21 | ||||
| S: C286 OK SEARCH completed | ||||
| </sourcecode> | ||||
| </li></ol> | ||||
| </section> | ||||
| </section> | </section> | |||
| <section anchor="fetch-command" numbered="true" toc="default"> | ||||
| </section> | <name>FETCH Command</name> | |||
| <iref item="FETCH (command)" subitem="" primary="false"/> | ||||
| <section title='FETCH Command' anchor='fetch-command'> | <dl newline="false" spacing="normal" indent="14"> | |||
| <iref item='FETCH (command)'/> | <dt>Arguments:</dt> | |||
| <dd> | ||||
| <t> | <t>sequence set</t> | |||
| <list style='hanging' hangIndent='12'> | <t> | |||
| <t hangText='Arguments:'>sequence set<vspace/> | ||||
| message data item names or macro</t> | message data item names or macro</t> | |||
| </dd> | ||||
| <t hangText='Responses:'>untagged responses: FETCH</t> | <dt>Responses:</dt> | |||
| <dd> | ||||
| <t hangText='Result:'>OK - fetch completed<vspace/> | <dl spacing="compact"> | |||
| NO - fetch error: can't fetch that data<vspace/> | <dt>untagged responses:</dt><dd>FETCH</dd> | |||
| BAD - command unknown or arguments invalid</t> | </dl> | |||
| </list> | </dd> | |||
| </t> | <dt>Result:</dt> | |||
| <dd> | ||||
| <t> | <dl spacing="compact"> | |||
| <dt>OK -</dt><dd>fetch completed</dd> | ||||
| <dt>NO -</dt><dd>fetch error: can't fetch that data</dd> | ||||
| <dt>BAD -</dt><dd>command unknown or arguments invalid</dd> | ||||
| </dl> | ||||
| </dd> | ||||
| </dl> | ||||
| <t> | ||||
| The FETCH command retrieves data associated with a message in the | The FETCH command retrieves data associated with a message in the | |||
| mailbox. The data items to be fetched can be either a single atom | mailbox. The data items to be fetched can be either a single atom | |||
| or a parenthesized list. | or a parenthesized list. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Most data items, identified in the formal syntax (<xref target="IMAP-ABNF" | |||
| Most data items, identified in the formal syntax (<xref target='IMAP-ABNF' | format="default"/>) under the | |||
| />) under the | msg-att-static rule, are static and <bcp14>MUST NOT</bcp14> change for any | |||
| msg-att-static rule, are static and MUST NOT change for any | ||||
| particular message. Other data items, identified in the formal | particular message. Other data items, identified in the formal | |||
| syntax under the msg-att-dynamic rule, MAY change, either as a | syntax under the msg-att-dynamic rule, <bcp14>MAY</bcp14> change either as a | |||
| result of a STORE command or due to external events. | result of a STORE command or due to external events. | |||
| <list> | </t> | |||
| <t> | <ul empty="true" spacing="normal"> | |||
| <li> | ||||
| For example, if a client receives an ENVELOPE for a | For example, if a client receives an ENVELOPE for a | |||
| message when it already knows the envelope, it can | message when it already knows the envelope, it can | |||
| safely ignore the newly transmitted envelope. | safely ignore the newly transmitted envelope. | |||
| </t> | </li> | |||
| </list> | </ul> | |||
| </t> | <t> | |||
| There are three macros that specify commonly used sets of data | ||||
| <t> | items and can be used instead of data items. A macro must be | |||
| There are three macros which specify commonly-used sets of data | used by itself and not in conjunction with other macros or data | |||
| items, and can be used instead of data items. A macro must be | ||||
| used by itself, and not in conjunction with other macros or data | ||||
| items. | items. | |||
| <list style='hanging'> | </t> | |||
| <t hangText='ALL'> | <dl newline="true" spacing="normal"> | |||
| <iref item='ALL (fetch item)'/> | <dt>ALL</dt> | |||
| Macro equivalent to: (FLAGS INTERNALDATE RFC822.SIZE ENVELOPE)</t> | <dd> | |||
| <iref item="ALL (fetch item)" subitem="" primary="false"/> | ||||
| <t hangText='FAST'> | Macro equivalent to: (FLAGS INTERNALDATE RFC822.SIZE ENVELOPE)</dd> | |||
| <iref item='FAST (fetch item)'/> | <dt>FAST</dt> | |||
| Macro equivalent to: (FLAGS INTERNALDATE RFC822.SIZE)</t> | <dd> | |||
| <iref item="FAST (fetch item)" subitem="" primary="false"/> | ||||
| <t hangText='FULL'> | Macro equivalent to: (FLAGS INTERNALDATE RFC822.SIZE)</dd> | |||
| <iref item='FULL (fetch item)'/> | <dt>FULL</dt> | |||
| <dd> | ||||
| <iref item="FULL (fetch item)" subitem="" primary="false"/> | ||||
| Macro equivalent to: (FLAGS INTERNALDATE RFC822.SIZE ENVELOPE | Macro equivalent to: (FLAGS INTERNALDATE RFC822.SIZE ENVELOPE | |||
| BODY)</t> | BODY)</dd> | |||
| </list> | </dl> | |||
| </t> | <t>Several data items reference "section" or "section-binary". | |||
| See <xref target="fetch-section" format="default"/> for their detailed def | ||||
| <t>Several data items reference "section" or "section-binary". | inition.</t> | |||
| See <xref target="fetch-section"/> for their detailed definition.</t> | <t> | |||
| <t> | ||||
| The currently defined data items that can be fetched are: | The currently defined data items that can be fetched are: | |||
| <list style='hanging'> | ||||
| <t hangText='BINARY[<section-binary>]<<partial>>'> | ||||
| <iref item='BINARY[<section-binary>]<<partial>> (fetch item)'/> | ||||
| <list> | ||||
| <t> | ||||
| Requests that the specified section be transmitted after | ||||
| performing Content-Transfer-Encoding-related decoding. | ||||
| </t> | </t> | |||
| <dl newline="true" spacing="normal"> | ||||
| <t> | <dt>BINARY[<section-binary>]<<partial>></dt> | |||
| <dd> | ||||
| <t><iref item="BINARY[<section-binary>]<<partial>&g | ||||
| t; (fetch item)" subitem="" primary="false"/> | ||||
| Requests that the specified section be transmitted after | ||||
| performing decoding of the section's Content-Transfer-Encoding.</t> | ||||
| <t> | ||||
| The <partial> argument, if present, requests that a subset of | The <partial> argument, if present, requests that a subset of | |||
| the data be returned. The semantics of a partial FETCH BINARY | the data be returned. The semantics of a partial FETCH BINARY | |||
| command are the same as for a partial FETCH BODY command, with | command are the same as for a partial FETCH BODY command, with | |||
| the exception that the <partial> arguments refer to the DECODED | the exception that the <partial> arguments refer to the DECODED | |||
| section data. | section data. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| <!--///Should this be allowed for message/global?--> | Note that this data item can only be requested for leaf body parts: th | |||
| Note that this data item can only be requested for leaf | ose that have media types other than multipart/*, message/rfc822, or message/glo | |||
| (i.e. non multipart/*, non message/rfc822 and non message/global) body | bal.</t> | |||
| parts. | </dd> | |||
| </t> | <dt>BINARY.PEEK[<section-binary>]<<partial>></dt> | |||
| <dd> | ||||
| </list> | <iref item="BINARY.PEEK[<section-binary>]<<partial> | |||
| </t> | > (fetch item)" subitem="" primary="false"/> | |||
| An alternate form of BINARY[<section-binary>] that does not impli | ||||
| <t hangText='BINARY.PEEK[<section-binary>]<<partial>>'> | citly | |||
| <iref item='BINARY.PEEK[<section-binary>]<<partial>> (fetch item) | set the \Seen flag.</dd> | |||
| '/> | <dt>BINARY.SIZE[<section-binary>]</dt> | |||
| An alternate form of BINARY[<section-binary>] that does not implicit | <dd> | |||
| ly | <t><iref item="BINARY.SIZE[<section-binary>] (fetch item)" s | |||
| set the \Seen flag.</t> | ubitem="" primary="false"/> | |||
| <t hangText='BINARY.SIZE[<section-binary>]'> | ||||
| <iref item='BINARY.SIZE[<section-binary>] (fetch item)'/> | ||||
| <list> | ||||
| <t> | ||||
| Requests the decoded size of the section (i.e., the size to | Requests the decoded size of the section (i.e., the size to | |||
| expect in response to the corresponding FETCH BINARY request). | expect in response to the corresponding FETCH BINARY request). | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| Note: client authors are cautioned that this might be an | Note: client authors are cautioned that this might be an | |||
| expensive operation for some server implementations. | expensive operation for some server implementations. | |||
| Needlessly issuing this request could result in degraded | Needlessly issuing this request could result in degraded | |||
| performance due to servers having to calculate the value every | performance due to servers having to calculate the value every | |||
| time the request is issued. | time the request is issued.</t> | |||
| </t> | ||||
| <t> | <t> | |||
| <!--///Should this be allowed for message/global?--> | Note that this data item can only be requested for leaf body parts: th | |||
| Note that this data item can only be requested for leaf | ose that have media types other than multipart/*, message/rfc822, or message/glo | |||
| (i.e. non multipart/*, non message/rfc822 and non message/global) body | bal.</t> | |||
| parts. | </dd> | |||
| </t> | <dt>BODY</dt> | |||
| <dd> | ||||
| </list> | <iref item="BODY (fetch item)" subitem="" primary="false"/> | |||
| </t> | Non-extensible form of BODYSTRUCTURE.</dd> | |||
| <dt>BODY[<section>]<<partial>></dt> | ||||
| <t hangText='BODY'> | <dd> | |||
| <iref item='BODY (fetch item)'/> | <t><iref item="BODY[<section>]<<partial>> (fetch | |||
| Non-extensible form of BODYSTRUCTURE.</t> | item)" subitem="" primary="false"/> | |||
| The text of a particular body section. If BODY[] is specified | ||||
| <t hangText='BODY[<section>]<<partial>>'> | (the section specification is omitted), the FETCH is requesting | |||
| <iref item='BODY[<section>]<<partial>> (fetch item)'/> | the <xref target="RFC5322" format="default"/> expression of the entire mess | |||
| <list> | age. | |||
| <t> | ||||
| The text of a particular body section. | ||||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| It is possible to fetch a substring of the designated text. | It is possible to fetch a substring of the designated text. | |||
| This is done by appending an open angle bracket ("<"), the | This is done by appending an open angle bracket ("<"), the | |||
| octet position of the first desired octet, a period, the | octet position of the first desired octet, a period, the | |||
| maximum number of octets desired, and a close angle bracket | maximum number of octets desired, and a close angle bracket | |||
| (">") to the part specifier. If the starting octet is beyond | (">") to the part specifier. If the starting octet is beyond | |||
| the end of the text, an empty string is returned. | the end of the text, an empty string is returned. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| Any partial fetch that attempts to read beyond the end of the | Any partial fetch that attempts to read beyond the end of the | |||
| text is truncated as appropriate. A partial fetch that starts | text is truncated as appropriate. A partial fetch that starts | |||
| at octet 0 is returned as a partial fetch, even if this | at octet 0 is returned as a partial fetch, even if this | |||
| truncation happened. | truncation happened. | |||
| </t> | ||||
| <list> | <t indent="3"> | |||
| <t> | Note: This means that BODY[]<0.2048> of a 1500-octet message | |||
| Note: This means that BODY[]<0.2048> of a 1500-octet message | will return BODY[]<0> with a literal of size 1500, not | |||
| will return BODY[]<0> with a literal of size 1500, not | ||||
| BODY[]. | BODY[]. | |||
| </t> | </t> | |||
| <t indent="3"> | ||||
| <t> | ||||
| Note: A substring fetch of a HEADER.FIELDS or | Note: A substring fetch of a HEADER.FIELDS or | |||
| HEADER.FIELDS.NOT part specifier is calculated after | HEADER.FIELDS.NOT part specifier is calculated after | |||
| subsetting the header. | subsetting the header. | |||
| </t> | </t> | |||
| </list> | ||||
| <t> | ||||
| The \Seen flag is implicitly set; if this causes the flags to | The \Seen flag is implicitly set; if this causes the flags to | |||
| change, they SHOULD be included as part of the FETCH responses.</t> | change, they <bcp14>SHOULD</bcp14> be included as part of the FETCH res | |||
| </list> | ponses. | |||
| </t> | </t> | |||
| </dd> | ||||
| <t hangText='BODY.PEEK[<section>]<<partial>>'> | <dt>BODY.PEEK[<section>]<<partial>></dt> | |||
| <iref item='BODY.PEEK[<section>]<<partial>> (fetch item)'/> | <dd> | |||
| An alternate form of BODY[<section>] that does not implicitly | <iref item="BODY.PEEK[<section>]<<partial>> (fet | |||
| set the \Seen flag.</t> | ch item)" subitem="" primary="false"/> | |||
| An alternate form of BODY[<section>] that does not implicitly | ||||
| <t hangText='BODYSTRUCTURE'> | set the \Seen flag.</dd> | |||
| <iref item='BODYSTRUCTURE (fetch item)'/> | <dt>BODYSTRUCTURE</dt> | |||
| The <xref target='MIME-IMB'/> body structure of the message. This is c | <dd> | |||
| omputed | <iref item="BODYSTRUCTURE (fetch item)" subitem="" primary="false" | |||
| by the server by parsing the <xref target='MIME-IMB'/> header fields in | /> | |||
| the | The <xref target="RFC2045" format="default"/> body structure of the mes | |||
| <xref target='RFC-5322'/> header and <xref target='MIME-IMB'/> headers. | sage. This is computed | |||
| See <xref target='fetch-response'/> for more details.</t> | by the server by parsing the <xref target="RFC2045" format="default"/> | |||
| header fields in the | ||||
| <t hangText='ENVELOPE'> | <xref target="RFC5322" format="default"/> header and <xref target="RFC2 | |||
| <iref item='ENVELOPE (fetch item)'/> | 045" format="default"/> headers. | |||
| See <xref target="fetch-response" format="default"/> for more details.< | ||||
| /dd> | ||||
| <dt>ENVELOPE</dt> | ||||
| <dd> | ||||
| <iref item="ENVELOPE (fetch item)" subitem="" primary="false"/> | ||||
| The envelope structure of the message. This is computed by the | The envelope structure of the message. This is computed by the | |||
| server by parsing the <xref target='RFC-5322'/> header into the compone nt | server by parsing the <xref target="RFC5322" format="default"/> header into the component | |||
| parts, defaulting various fields as necessary. | parts, defaulting various fields as necessary. | |||
| See <xref target='fetch-response'/> for more details.</t> | See <xref target="fetch-response" format="default"/> for more details.< | |||
| /dd> | ||||
| <t hangText='FLAGS'> | <dt>FLAGS</dt> | |||
| <iref item='FLAGS (fetch item)'/> | <dd> | |||
| The flags that are set for this message.</t> | <iref item="FLAGS (fetch item)" subitem="" primary="false"/> | |||
| The flags that are set for this message.</dd> | ||||
| <t hangText='INTERNALDATE'> | <dt>INTERNALDATE</dt> | |||
| <iref item='INTERNALDATE (fetch item)'/> | <dd> | |||
| The internal date of the message.</t> | <iref item="INTERNALDATE ( | |||
| fetch item)" subitem="" primary="false"/> | ||||
| <t hangText='RFC822.SIZE'> | The internal date of the message.</dd> | |||
| <iref item='RFC822.SIZE (fetch item)'/> | <dt>RFC822.SIZE</dt> | |||
| The <xref target='RFC-5322'/> size of the message.</t> | <dd> | |||
| <iref item="RFC822.SIZE (fetch item)" subitem="" primary="false"/> | ||||
| <t hangText='UID'> | The size of the message, as defined in <xref target="RFC822.SIZE_messag | |||
| <iref item='UID (fetch item)'/> | e_attribute" />.</dd> | |||
| The unique identifier for the message.</t> | <dt>UID</dt> | |||
| </list> | <dd> | |||
| </t> | <iref item="UID (fetch item)" subitem="" primary="false"/> | |||
| The unique identifier for the message.</dd> | ||||
| <figure><artwork> | </dl> | |||
| Example: C: A654 FETCH 2:4 (FLAGS BODY[HEADER.FIELDS (DATE FROM)]) | <t> | |||
| S: * 2 FETCH .... | Example: | |||
| S: * 3 FETCH .... | </t> | |||
| S: * 4 FETCH .... | <sourcecode type=""> | |||
| S: A654 OK FETCH completed | C: A654 FETCH 2:4 (FLAGS BODY[HEADER.FIELDS (DATE FROM)]) | |||
| </artwork></figure> | S: * 2 FETCH .... | |||
| S: * 3 FETCH .... | ||||
| <section title='FETCH section specification' anchor='fetch-section'> | S: * 4 FETCH .... | |||
| S: A654 OK FETCH completed | ||||
| <t>Several FETCH data items reference "section" or "section-binary". | </sourcecode> | |||
| <section anchor="fetch-section" numbered="true" toc="default"> | ||||
| <name>FETCH Section Specification</name> | ||||
| <t>Several FETCH data items reference "section" or "section-binary". | ||||
| The section specification is a set of zero or more part specifiers | The section specification is a set of zero or more part specifiers | |||
| delimited by periods. A part specifier is either a part number | delimited by periods. A part specifier is either a part number | |||
| or one of the following: HEADER, HEADER.FIELDS, | or one of the following: HEADER, HEADER.FIELDS, | |||
| HEADER.FIELDS.NOT, MIME, and TEXT. (Non numeric part specifiers | HEADER.FIELDS.NOT, MIME, and TEXT. (Non-numeric part specifiers | |||
| have to be the last specifier in a section specification.) | have to be the last specifier in a section specification.) | |||
| An empty section specification refers to the entire message, including the | An empty section specification refers to the entire message, including the | |||
| header. | header. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Every message has at least one part number. | |||
| Every message has at least one part number. Non-<xref target='MIME-IMB | ||||
| '/> | ||||
| messages, and non-multipart <xref target='MIME-IMB'/> messages with no | ||||
| encapsulated message, only have a part 1. | ||||
| </t> | ||||
| <t> | Messages that do not use MIME, and MIME messages that are not multipart and have | |||
| no encapsulated message within them, only have a part 1. | ||||
| </t> | ||||
| <t> | ||||
| Multipart messages are assigned consecutive part numbers, as | Multipart messages are assigned consecutive part numbers, as | |||
| they occur in the message. If a particular part is of type | they occur in the message. If a particular part is of type | |||
| message or multipart, its parts MUST be indicated by a period | message or multipart, its parts <bcp14>MUST</bcp14> be indicated by a p eriod | |||
| followed by the part number within that nested multipart part. | followed by the part number within that nested multipart part. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| A part of type MESSAGE/RFC822 or MESSAGE/GLOBAL also has nested part nu mbers, | A part of type MESSAGE/RFC822 or MESSAGE/GLOBAL also has nested part nu mbers, | |||
| referring to parts of the MESSAGE part's body. | referring to parts of the MESSAGE part's body. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | <iref item="HEADER (part specifier)" subitem="" primary="false"/> | |||
| <iref item='HEADER (part specifier)'/> | <iref item="HEADER.FIELDS (part specifier)" subitem="" primary="fa | |||
| <iref item='HEADER.FIELDS (part specifier)'/> | lse"/> | |||
| <iref item='HEADER.FIELDS.NOT (part specifier)'/> | <iref item="HEADER.FIELDS.NOT (part specifier)" subitem="" primary | |||
| <iref item='TEXT (part specifier)'/> | ="false"/> | |||
| <iref item="TEXT (part specifier)" subitem="" primary="false"/> | ||||
| The HEADER, HEADER.FIELDS, HEADER.FIELDS.NOT, and TEXT part | The HEADER, HEADER.FIELDS, HEADER.FIELDS.NOT, and TEXT part | |||
| specifiers can be the sole part specifier or can be prefixed by | specifiers can be the sole part specifier or can be prefixed by | |||
| one or more numeric part specifiers, provided that the numeric | one or more numeric part specifiers, provided that the numeric | |||
| part specifier refers to a part of type MESSAGE/RFC822 or MESSAGE/GLOBA L. The | part specifier refers to a part of type MESSAGE/RFC822 or MESSAGE/GLOBA L. The | |||
| MIME part specifier MUST be prefixed by one or more numeric | MIME part specifier <bcp14>MUST</bcp14> be prefixed by one or more nume ric | |||
| part specifiers. | part specifiers. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The HEADER, HEADER.FIELDS, and HEADER.FIELDS.NOT part | The HEADER, HEADER.FIELDS, and HEADER.FIELDS.NOT part | |||
| specifiers refer to the <xref target='RFC-5322'/> header of the message | specifiers refer to the <xref target="RFC5322" format="default"/> heade | |||
| or of | r of the message or of | |||
| an encapsulated <xref target='MIME-IMT'/> MESSAGE/RFC822 or MESSAGE/GLO | an encapsulated <xref target="RFC2046" format="default"/> MESSAGE/RFC82 | |||
| BAL message. | 2 or MESSAGE/GLOBAL message. | |||
| HEADER.FIELDS and HEADER.FIELDS.NOT are followed by a list of | HEADER.FIELDS and HEADER.FIELDS.NOT are followed by a list of | |||
| field-name (as defined in <xref target='RFC-5322'/>) names, and return a | field-names (as defined in <xref target="RFC5322" format="default"/>) a nd return a | |||
| subset of the header. The subset returned by HEADER.FIELDS | subset of the header. The subset returned by HEADER.FIELDS | |||
| contains only those header fields with a field-name that | contains only those header fields with a field-name that | |||
| matches one of the names in the list; similarly, the subset | matches one of the names in the list; similarly, the subset | |||
| returned by HEADER.FIELDS.NOT contains only the header fields | returned by HEADER.FIELDS.NOT contains only the header fields | |||
| with a non-matching field-name. The field-matching is | with a non-matching field-name. The field-matching is | |||
| ASCII range case-insensitive but otherwise exact. Subsetting does not | ASCII-range case insensitive but is otherwise exact. Subsetting does n | |||
| exclude the <xref target='RFC-5322'/> delimiting blank line between the | ot | |||
| header | exclude the <xref target="RFC5322" format="default"/> delimiting blank | |||
| line between the header | ||||
| and the body; the blank line is included in all header fetches, | and the body; the blank line is included in all header fetches, | |||
| except in the case of a message which has no body and no blank | except in the case of a message that has no body and no blank | |||
| line. | line. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | <iref item="MIME (part specifier)" subitem="" primary="false"/> | |||
| <iref item='MIME (part specifier)'/> | The MIME part specifier refers to the <xref target="RFC2045" format="de | |||
| The MIME part specifier refers to the <xref target='MIME-IMB'/> header | fault"/> header for | |||
| for | ||||
| this part. | this part. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The TEXT part specifier refers to the text body of the message, | The TEXT part specifier refers to the text body of the message, | |||
| omitting the <xref target='RFC-5322'/> header. | omitting the <xref target="RFC5322" format="default"/> header. | |||
| <list><t> | </t> | |||
| <t> | ||||
| Here is an example of a complex message with some of its | Here is an example of a complex message with some of its | |||
| part specifiers: | part specifiers: | |||
| </t></list> | </t> | |||
| <figure><artwork> | ||||
| HEADER ([RFC-5322] header of the message) | ||||
| TEXT ([RFC-5322] text body of the message) MULTIPART/MIXED | ||||
| 1 TEXT/PLAIN | ||||
| 2 APPLICATION/OCTET-STREAM | ||||
| 3 MESSAGE/RFC822 | ||||
| 3.HEADER ([RFC-5322] header of the message) | ||||
| 3.TEXT ([RFC-5322] text body of the message) MULTIPART/MIXED | ||||
| 3.1 TEXT/PLAIN | ||||
| 3.2 APPLICATION/OCTET-STREAM | ||||
| 4 MULTIPART/MIXED | ||||
| 4.1 IMAGE/GIF | ||||
| 4.1.MIME ([MIME-IMB] header for the IMAGE/GIF) | ||||
| 4.2 MESSAGE/RFC822 | ||||
| 4.2.HEADER ([RFC-5322] header of the message) | ||||
| 4.2.TEXT ([RFC-5322] text body of the message) MULTIPART/MIXED | ||||
| 4.2.1 TEXT/PLAIN | ||||
| 4.2.2 MULTIPART/ALTERNATIVE | ||||
| 4.2.2.1 TEXT/PLAIN | ||||
| 4.2.2.2 TEXT/RICHTEXT | ||||
| </artwork></figure> | ||||
| </t> | ||||
| <artwork type="" align="left" alt=""><![CDATA[ | ||||
| HEADER ([RFC5322] header of the message) | ||||
| TEXT ([RFC5322] text body of the message) MULTIPART/MIXED | ||||
| 1 TEXT/PLAIN | ||||
| 2 APPLICATION/OCTET-STREAM | ||||
| 3 MESSAGE/RFC822 | ||||
| 3.HEADER ([RFC5322] header of the message) | ||||
| 3.TEXT ([RFC5322] text body of the message) MULTIPART/MIXED | ||||
| 3.1 TEXT/PLAIN | ||||
| 3.2 APPLICATION/OCTET-STREAM | ||||
| 4 MULTIPART/MIXED | ||||
| 4.1 IMAGE/GIF | ||||
| 4.1.MIME ([MIME-IMB] header for the IMAGE/GIF) | ||||
| 4.2 MESSAGE/RFC822 | ||||
| 4.2.HEADER ([RFC5322] header of the message) | ||||
| 4.2.TEXT ([RFC5322] text body of the message) MULTIPART/MIXED | ||||
| 4.2.1 TEXT/PLAIN | ||||
| 4.2.2 MULTIPART/ALTERNATIVE | ||||
| 4.2.2.1 TEXT/PLAIN | ||||
| 4.2.2.2 TEXT/RICHTEXT | ||||
| ]]></artwork> | ||||
| </section> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| </section> | <name>STORE Command</name> | |||
| <iref item="STORE (command)" subitem="" primary="false"/> | ||||
| <section title='STORE Command'> | <dl newline="false" spacing="normal" indent="14"> | |||
| <iref item='STORE (command)'/> | <dt>Arguments:</dt> | |||
| <dd> | ||||
| <t> | <t>sequence set</t> | |||
| <list style='hanging' hangIndent='12'> | <t> | |||
| <t hangText='Arguments:'>sequence set<vspace/> | message data item name</t> | |||
| message data item name<vspace/> | <t> | |||
| value for message data item</t> | value for message data item</t> | |||
| </dd> | ||||
| <t hangText='Responses:'>untagged responses: FETCH</t> | <dt>Responses:</dt> | |||
| <dd> | ||||
| <t hangText='Result:'>OK - store completed<vspace/> | <dl spacing="compact"> | |||
| NO - store error: can't store that data<vspace/> | <dt>untagged responses:</dt><dd>FETCH</dd> | |||
| BAD - command unknown or arguments invalid</t> | </dl> | |||
| </list> | </dd> | |||
| </t> | <dt>Result:</dt> | |||
| <dd> | ||||
| <t> | <dl spacing="compact"> | |||
| <dt>OK -</dt><dd>store completed</dd> | ||||
| <dt>NO -</dt><dd>store error: can't store that data</dd> | ||||
| <dt>BAD -</dt><dd>command unknown or arguments invalid</dd> | ||||
| </dl> | ||||
| </dd> | ||||
| </dl> | ||||
| <t> | ||||
| The STORE command alters data associated with a message in the | The STORE command alters data associated with a message in the | |||
| mailbox. Normally, STORE will return the updated value of the | mailbox. Normally, STORE will return the updated value of the | |||
| data with an untagged FETCH response. A suffix of ".SILENT" in | data with an untagged FETCH response. A suffix of ".SILENT" in | |||
| the data item name prevents the untagged FETCH, and the server | the data item name prevents the untagged FETCH, and the server | |||
| SHOULD assume that the client has determined the updated value | <bcp14>SHOULD</bcp14> assume that the client has determined the updated va lue | |||
| itself or does not care about the updated value. | itself or does not care about the updated value. | |||
| <list><t> | </t> | |||
| <t indent="3"> | ||||
| Note: Regardless of whether or not the ".SILENT" suffix | Note: Regardless of whether or not the ".SILENT" suffix | |||
| was used, the server SHOULD send an untagged FETCH | was used, the server <bcp14>SHOULD</bcp14> send an untagged FETCH | |||
| response if a change to a message's flags from an | response if a change to a message's flags from an | |||
| external source is observed. The intent is that the | external source is observed. The intent is that the | |||
| status of the flags is determinate without a race | status of the flags is determinate without a race | |||
| condition. | condition. | |||
| </t></list> | </t> | |||
| </t> | <t> | |||
| <t> | ||||
| The currently defined data items that can be stored are: | The currently defined data items that can be stored are: | |||
| <list style='hanging'> | </t> | |||
| <t hangText='FLAGS <flag list>'> | <dl newline="true" spacing="normal"> | |||
| <iref item='FLAGS <flag list> (store command data item)'/> | <dt>FLAGS <flag list></dt> | |||
| <dd> | ||||
| <iref item="FLAGS <flag list> (store command data item)" sub | ||||
| item="" primary="false"/> | ||||
| Replace the flags for the message with the | Replace the flags for the message with the | |||
| argument. The new value of the flags is returned as if a FETCH | argument. The new value of the flags is returned as if a FETCH | |||
| of those flags was done.</t> | of those flags was done.</dd> | |||
| <dt>FLAGS.SILENT <flag list></dt> | ||||
| <t hangText='FLAGS.SILENT <flag list>'> | <dd> | |||
| <iref item='FLAGS.SILENT <flag list> (store command data item)'/> | <iref item="FLAGS.SILENT <flag list> (store command data ite | |||
| Equivalent to FLAGS, but without returning a new value.</t> | m)" subitem="" primary="false"/> | |||
| Equivalent to FLAGS, but without returning a new value.</dd> | ||||
| <t hangText='+FLAGS <flag list>'> | <dt>+FLAGS <flag list></dt> | |||
| <iref item='+FLAGS <flag list>'/> | <dd> | |||
| <iref item="+FLAGS <flag list>" subitem="" primary="false"/> | ||||
| Add the argument to the flags for the message. The new value | Add the argument to the flags for the message. The new value | |||
| of the flags is returned as if a FETCH of those flags was done.</t> | of the flags is returned as if a FETCH of those flags was done.</dd> | |||
| <dt>+FLAGS.SILENT <flag list></dt> | ||||
| <t hangText='+FLAGS.SILENT <flag list>'> | <dd> | |||
| <iref item='+FLAGS.SILENT <flag list>'/> | <iref item="+FLAGS.SILENT <flag list>" subitem="" primary="fals | |||
| Equivalent to +FLAGS, but without returning a new value.</t> | e"/> | |||
| Equivalent to +FLAGS, but without returning a new value.</dd> | ||||
| <t hangText='-FLAGS <flag list>'> | <dt>-FLAGS <flag list></dt> | |||
| <iref item='-FLAGS <flag list>'/> | <dd> | |||
| <iref item="-FLAGS <flag list>" subitem="" primary="false"/> | ||||
| Remove the argument from the flags for the message. The new | Remove the argument from the flags for the message. The new | |||
| value of the flags is returned as if a FETCH of those flags was | value of the flags is returned as if a FETCH of those flags was | |||
| done.</t> | done.</dd> | |||
| <dt>-FLAGS.SILENT <flag list></dt> | ||||
| <t hangText='-FLAGS.SILENT <flag list>'> | <dd> | |||
| <iref item='-FLAGS.SILENT <flag list>'/> | <iref item="-FLAGS.SILENT <flag list>" subitem="" primary="f | |||
| Equivalent to -FLAGS, but without returning a new value.</t> | alse"/> | |||
| </list> | Equivalent to -FLAGS, but without returning a new value.</dd> | |||
| </t> | </dl> | |||
| <t> | ||||
| <figure><artwork> | Example: | |||
| Example: C: A003 STORE 2:4 +FLAGS (\Deleted) | </t> | |||
| S: * 2 FETCH (FLAGS (\Deleted \Seen)) | <sourcecode type=""> | |||
| S: * 3 FETCH (FLAGS (\Deleted)) | C: A003 STORE 2:4 +FLAGS (\Deleted) | |||
| S: * 4 FETCH (FLAGS (\Deleted \Flagged \Seen)) | S: * 2 FETCH (FLAGS (\Deleted \Seen)) | |||
| S: A003 OK STORE completed | S: * 3 FETCH (FLAGS (\Deleted)) | |||
| </artwork></figure> | S: * 4 FETCH (FLAGS (\Deleted \Flagged \Seen)) | |||
| S: A003 OK STORE completed | ||||
| </section> | </sourcecode> | |||
| </section> | ||||
| <section title='COPY Command' anchor='copy-command'> | <section anchor="copy-command" numbered="true" toc="default"> | |||
| <iref item='COPY (command)'/> | <name>COPY Command</name> | |||
| <iref item="COPY (command)" subitem="" primary="false"/> | ||||
| <t> | <dl newline="false" spacing="normal" indent="14"> | |||
| <list style='hanging' hangIndent='12'> | <dt>Arguments:</dt> | |||
| <t hangText='Arguments:'>sequence set<vspace/> | <dd> | |||
| <t>sequence set</t> | ||||
| <t> | ||||
| mailbox name</t> | mailbox name</t> | |||
| </dd> | ||||
| <t hangText='Responses:'>no specific responses for this command</t> | <dt>Responses:</dt> | |||
| <dd>no specific responses for this command</dd> | ||||
| <t hangText='Result:'>OK - copy completed<vspace/> | <dt>Result:</dt> | |||
| NO - copy error: can't copy those messages or to that<vspace/> | <dd> | |||
| name<vspace/> | <dl spacing="compact"> | |||
| BAD - command unknown or arguments invalid</t> | <dt>OK -</dt><dd>copy completed</dd> | |||
| </list> | <dt>NO -</dt><dd>copy error: can't copy those messages or to that | |||
| </t> | name</dd> | |||
| <dt>BAD -</dt><dd>command unknown or arguments invalid</dd> | ||||
| <t> | </dl> | |||
| </dd> | ||||
| </dl> | ||||
| <t> | ||||
| The COPY command copies the specified message(s) to the end of the | The COPY command copies the specified message(s) to the end of the | |||
| specified destination mailbox. The flags and internal date of the | specified destination mailbox. The flags and internal date of the | |||
| message(s) SHOULD be preserved in the copy. | message(s) <bcp14>SHOULD</bcp14> be preserved in the copy. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | If the destination mailbox does not exist, a server <bcp14>MUST</bcp14> re | |||
| If the destination mailbox does not exist, a server MUST return | turn | |||
| an error. It MUST NOT automatically create the mailbox. Unless | an error. It <bcp14>MUST NOT</bcp14> automatically create the mailbox. U | |||
| nless | ||||
| it is certain that the destination mailbox can not be created, the | it is certain that the destination mailbox can not be created, the | |||
| server MUST send the response code "[TRYCREATE]" as the prefix of | server <bcp14>MUST</bcp14> send the response code "[TRYCREATE]" as the pre fix of | |||
| the text of the tagged NO response. This gives a hint to the | the text of the tagged NO response. This gives a hint to the | |||
| client that it can attempt a CREATE command and retry the COPY if | client that it can attempt a CREATE command and retry the COPY if | |||
| the CREATE is successful. | the CREATE is successful. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| If the COPY command is unsuccessful for any reason, server | If the COPY command is unsuccessful for any reason, server | |||
| implementations MUST restore the destination mailbox to its state | implementations <bcp14>MUST</bcp14> restore the destination mailbox to its state | |||
| before the COPY attempt (other than possibly incrementing UIDNEXT), | before the COPY attempt (other than possibly incrementing UIDNEXT), | |||
| i.e. partial copy MUST NOT be done. | i.e., partial copy <bcp14>MUST NOT</bcp14> be done. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| On successful completion of a COPY, the server returns a COPYUID response c ode | On successful completion of a COPY, the server returns a COPYUID response c ode | |||
| (see <xref target='server-status-responses'/>). Two exception to this requi rement | (see <xref target="server-status-responses" format="default"/>). Two except ions to this requirement | |||
| are listed below. | are listed below. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| In the case of a mailbox that has permissions set so that the client | In the case of a mailbox that has permissions set so that the client | |||
| can COPY to the mailbox, but not SELECT or EXAMINE it, the | can COPY to the mailbox, but not SELECT or EXAMINE it, the | |||
| server MUST NOT send an COPYUID response code as it | server <bcp14>MUST NOT</bcp14> send a COPYUID response code as it | |||
| would disclose information about the mailbox. | would disclose information about the mailbox. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| In the case of a mailbox that has UIDNOTSTICKY status | In the case of a mailbox that has UIDNOTSTICKY status | |||
| (see <xref target='server-status-responses'/>), | (see <xref target="server-status-responses" format="default"/>), | |||
| the server MAY omit the COPYUID response code as | the server <bcp14>MAY</bcp14> omit the COPYUID response code as | |||
| it is not meaningful. | it is not meaningful. | |||
| </t> | </t> | |||
| <t> | ||||
| <!-- | Example: | |||
| <t> | </t> | |||
| If the server does not return the COPYUID response | <sourcecode type=""> | |||
| code, the client can discover this information by selecting the | C: A003 COPY 2:4 MEETING | |||
| destination mailbox. The location of messages placed in the | S: A003 OK [COPYUID 38505 304,319:320 3956:3958] COPY completed | |||
| destination mailbox by COPY can be determined by using | </sourcecode> | |||
| FETCH and/or SEARCH commands (e.g., for Message-ID). | </section> | |||
| </t> | <section numbered="true" toc="default"> | |||
| --> | <name>MOVE Command</name> | |||
| <iref item="MOVE (command)" subitem="" primary="false"/> | ||||
| <figure><artwork> | <dl newline="false" spacing="normal" indent="14"> | |||
| Example: C: A003 COPY 2:4 MEETING | <dt>Arguments:</dt> | |||
| S: A003 OK [COPYUID 38505 304,319:320 3956:3958] COPY completed | <dd> | |||
| </artwork></figure> | <t>sequence set</t> | |||
| <t> | ||||
| </section> | ||||
| <section title='MOVE Command'> | ||||
| <iref item='MOVE (command)'/> | ||||
| <t> | ||||
| <list style='hanging' hangIndent='12'> | ||||
| <t hangText='Arguments:'>sequence set<vspace/> | ||||
| mailbox name</t> | mailbox name</t> | |||
| </dd> | ||||
| <t hangText='Responses:'>no specific responses for this command</t> | <dt>Responses:</dt> | |||
| <dd>no specific responses for this command</dd> | ||||
| <t hangText='Result:'>OK - move completed<vspace/> | <dt>Result:</dt> | |||
| NO - move error: can't move those messages or to that<vspace/> | <dd> | |||
| name<vspace/> | <dl spacing="compact"> | |||
| BAD - command unknown or arguments invalid</t> | <dt>OK -</dt><dd>move completed</dd> | |||
| </list> | <dt>NO -</dt><dd>move error: can't move those messages or to that | |||
| </t> | name</dd> | |||
| <dt>BAD -</dt><dd>command unknown or arguments invalid</dd> | ||||
| <t> | </dl> | |||
| </dd> | ||||
| </dl> | ||||
| <t> | ||||
| The MOVE command moves the specified message(s) to the end of the | The MOVE command moves the specified message(s) to the end of the | |||
| specified destination mailbox. The flags and internal date of the | specified destination mailbox. The flags and internal date of the | |||
| message(s) SHOULD be preserved. | message(s) <bcp14>SHOULD</bcp14> be preserved. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| This means that a new message is created in the target mailbox with a | This means that a new message is created in the target mailbox with a | |||
| new UID, the original message is removed from the source mailbox, and | new UID, the original message is removed from the source mailbox, and | |||
| it appears to the client as a single action. This has the same | it appears to the client as a single action. This has the same | |||
| effect for each message as this sequence: | effect for each message as this sequence: | |||
| </t> | ||||
| <list style='numbers'> | <ol spacing="normal" type="1"><li>[UID] COPY</li> | |||
| <li>[UID] STORE +FLAGS.SILENT \DELETED</li> | ||||
| <t>[UID] COPY</t> | <li>UID EXPUNGE</li> | |||
| </ol> | ||||
| <t>[UID] STORE +FLAGS.SILENT \DELETED</t> | <t> | |||
| <t>UID EXPUNGE</t> | ||||
| </list> | ||||
| </t> | ||||
| <t> | ||||
| Although the effect of the MOVE is the same as the preceding steps, | Although the effect of the MOVE is the same as the preceding steps, | |||
| the semantics are not identical: The intermediate states produced by | the semantics are not identical: the intermediate states produced by | |||
| those steps do not occur, and the response codes are different. In | those steps do not occur, and the response codes are different. In | |||
| particular, though the COPY and EXPUNGE response codes will be | particular, though the COPY and EXPUNGE response codes will be | |||
| returned, response codes for a STORE MUST NOT be generated and the | returned, response codes for a STORE <bcp14>MUST NOT</bcp14> be generated, an | |||
| \Deleted flag MUST NOT be set for any message. | d the | |||
| </t> | \Deleted flag <bcp14>MUST NOT</bcp14> be set for any message. | |||
| </t> | ||||
| <t> | <t> | |||
| Unlike the COPY command, MOVE of a set of messages might fail partway | Unlike the COPY command, MOVE of a set of messages might fail partway | |||
| through the set. Regardless of whether the command is successful in | through the set. Regardless of whether the command is successful in | |||
| moving the entire set, each individual message MUST either be moved | moving the entire set, each individual message <bcp14>MUST</bcp14> be either | |||
| or unaffected. The server MUST leave each message in a state where | moved | |||
| or unaffected. The server <bcp14>MUST</bcp14> leave each message in a state | ||||
| where | ||||
| it is in at least one of the source or target mailboxes (no message | it is in at least one of the source or target mailboxes (no message | |||
| can be lost or orphaned). The server SHOULD NOT leave any message in | can be lost or orphaned). The server <bcp14>SHOULD NOT</bcp14> leave any mes sage in | |||
| both mailboxes (it would be bad for a partial failure to result in a | both mailboxes (it would be bad for a partial failure to result in a | |||
| bunch of duplicate messages). This is true even if the server | bunch of duplicate messages). This is true even if the server | |||
| returns a tagged NO response to the command. | returns a tagged NO response to the command. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | If the destination mailbox does not exist, a server <bcp14>MUST</bcp14> retur | |||
| If the destination mailbox does not exist, a server MUST return | n | |||
| an error. It MUST NOT automatically create the mailbox. Unless | an error. It <bcp14>MUST NOT</bcp14> automatically create the mailbox. Unle | |||
| it is certain that the destination mailbox can not be created, the | ss | |||
| server MUST send the response code "[TRYCREATE]" as the prefix of | it is certain that the destination mailbox cannot be created, the | |||
| server <bcp14>MUST</bcp14> send the response code "[TRYCREATE]" as the prefix | ||||
| of | ||||
| the text of the tagged NO response. This gives a hint to the | the text of the tagged NO response. This gives a hint to the | |||
| client that it can attempt a CREATE command and retry the MOVE if | client that it can attempt a CREATE command and retry the MOVE if | |||
| the CREATE is successful. | the CREATE is successful. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| Because of the similarity of MOVE to COPY, extensions that affect | Because of the similarity of MOVE to COPY, extensions that affect | |||
| COPY affect MOVE in the same way. Response codes listed in | COPY affect MOVE in the same way. Response codes listed in | |||
| <xref target='server-status-responses'/>, as well as those defined by | <xref target="server-status-responses" format="default"/>, as well as those d efined by | |||
| extensions, are sent as indicated for COPY. | extensions, are sent as indicated for COPY. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Servers send COPYUID in response to a MOVE or a UID MOVE (see <xref target="u | |||
| Servers send COPYUID in response to a MOVE or a UID MOVE (see <xref target='u | id-commands" format="default"/>) command. | |||
| id-commands'/>) command. | For additional information about COPYUID, see <xref target="server-status-res | |||
| For additional information about COPYUID see <xref target='server-status-resp | ponses" format="default"/>. | |||
| onses'/>. | Note that there are several exceptions listed in <xref target="copy-command" | |||
| Note that there are several exceptions listed in <xref target='copy-command'/ | format="default"/> | |||
| > | ||||
| that allow servers not to return COPYUID. | that allow servers not to return COPYUID. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Servers are also <bcp14>REQUIRED</bcp14> to send the COPYUID | |||
| Servers are also REQUIRED to send the COPYUID | ||||
| response code in an untagged OK before sending EXPUNGE or similar | response code in an untagged OK before sending EXPUNGE or similar | |||
| responses. (Sending COPYUID in the tagged OK, as described in the | responses. (Sending COPYUID in the tagged OK, as described in <xref target=" | |||
| UIDPLUS specification, means that clients first receive an EXPUNGE | copy-command"/>, means that clients first receive an EXPUNGE | |||
| for a message and afterwards COPYUID for the same message. It can be | for a message and afterwards COPYUID for the same message. It can be | |||
| unnecessarily difficult to process that sequence usefully.) | unnecessarily difficult to process that sequence usefully.) | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | An example: | |||
| An example: | </t> | |||
| C: a UID MOVE 42:69 foo | ||||
| S: * OK [COPYUID 432432 42:69 1202:1229] | ||||
| S: * 22 EXPUNGE | ||||
| ...More EXPUNGE responses from the server... | ||||
| S: a OK Done | ||||
| </artwork></figure> | ||||
| <t> | <sourcecode type=""> | |||
| C: a UID MOVE 42:69 foo | ||||
| S: * OK [COPYUID 432432 42:69 1202:1229] | ||||
| S: * 22 EXPUNGE | ||||
| ...More EXPUNGE responses from the server... | ||||
| S: a OK Done | ||||
| </sourcecode> | ||||
| <t> | ||||
| Note that the server may send unrelated EXPUNGE responses as well, if | Note that the server may send unrelated EXPUNGE responses as well, if | |||
| any happen to have been expunged at the same time; this is normal | any happen to have been expunged at the same time; this is normal | |||
| IMAP operation. | IMAP operation. | |||
| </t> | </t> | |||
| <!-- | ||||
| <t> | ||||
| Implementors will need to read [RFC4315] to understand what UID | ||||
| EXPUNGE does, though full implementation of [RFC4315] is not | ||||
| necessary. | ||||
| </t> | ||||
| --> | ||||
| <t> | <t> | |||
| Note that moving a message to the currently selected mailbox (that | Note that moving a message to the currently selected mailbox (that | |||
| is, where the source and target mailboxes are the same) is allowed | is, where the source and target mailboxes are the same) is allowed | |||
| when copying the message to the currently selected mailbox is | when copying the message to the currently selected mailbox is | |||
| allowed. | allowed. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The server may send EXPUNGE responses before the tagged | The server may send EXPUNGE responses before the tagged | |||
| response, so the client cannot safely send more commands with message | response, so the client cannot safely send more commands with message | |||
| sequence number arguments while the server is processing MOVE. | sequence number arguments while the server is processing MOVE. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| MOVE and UID MOVE can be pipelined with other commands, but care | MOVE and UID MOVE can be pipelined with other commands, but care | |||
| has to be taken. Both commands modify sequence numbers and also | has to be taken. Both commands modify sequence numbers and also | |||
| allow unrelated EXPUNGE responses. The renumbering of other messages | allow unrelated EXPUNGE responses. The renumbering of other messages | |||
| in the source mailbox following any EXPUNGE response can be | in the source mailbox following any EXPUNGE response can be | |||
| surprising and makes it unsafe to pipeline any command that relies on | surprising and makes it unsafe to pipeline any command that relies on | |||
| message sequence numbers after a MOVE or UID MOVE. Similarly, MOVE | message sequence numbers after a MOVE or UID MOVE. Similarly, MOVE | |||
| cannot be pipelined with a command that might cause message | cannot be pipelined with a command that might cause message | |||
| renumbering. See <xref target='pipelining'/>, for more information about | renumbering. See <xref target="pipelining" format="default"/> for more infor mation about | |||
| ambiguities as well as handling requirements for both clients and | ambiguities as well as handling requirements for both clients and | |||
| servers. | servers. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section anchor="uid-commands" numbered="true" toc="default"> | |||
| <name>UID Command</name> | ||||
| <section title='UID Command' anchor='uid-commands'> | <iref item="UID (command)" subitem="" primary="false"/> | |||
| <iref item='UID (command)'/> | <dl newline="false" spacing="normal" indent="14"> | |||
| <dt>Arguments:</dt> | ||||
| <t> | <dd> | |||
| <list style='hanging' hangIndent='12'> | <t>command name</t> | |||
| <t hangText='Arguments:'>command name<vspace/> | <t> | |||
| command arguments</t> | command arguments</t> | |||
| </dd> | ||||
| <t hangText='Responses:'>untagged responses: FETCH, ESEARCH, EXPUNGE</t> | <dt>Responses:</dt> | |||
| <dd> | ||||
| <t hangText='Result:'>OK - UID command completed<vspace/> | <dl spacing="compact"> | |||
| NO - UID command error<vspace/> | <dt>untagged responses:</dt><dd>FETCH, ESEARCH, EXPUNGE</dd> | |||
| BAD - command unknown or arguments invalid</t> | </dl> | |||
| </list> | </dd> | |||
| </t> | <dt>Result:</dt> | |||
| <dd> | ||||
| <!--///Alexey: Split into subsections by command?--> | <dl spacing="compact"> | |||
| <dt>OK -</dt><dd>UID command completed</dd> | ||||
| <dt>NO -</dt><dd>UID command error</dd> | ||||
| <dt>BAD -</dt><dd>command unknown or arguments invalid</dd> | ||||
| </dl> | ||||
| </dd> | ||||
| </dl> | ||||
| <t> | <t> | |||
| The UID command has three forms. In the first form, it takes as its | The UID command has three forms. In the first form, it takes as its | |||
| arguments a COPY, MOVE, FETCH, or STORE command with arguments | arguments a COPY, MOVE, FETCH, or STORE command with arguments | |||
| appropriate for the associated command. However, the numbers in | appropriate for the associated command. However, the numbers in | |||
| the sequence set argument are unique identifiers instead of | the sequence-set argument are unique identifiers instead of | |||
| message sequence numbers. Sequence set ranges are permitted, but | message sequence numbers. Sequence-set ranges are permitted, but | |||
| there is no guarantee that unique identifiers will be contiguous. | there is no guarantee that unique identifiers will be contiguous. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| A non-existent unique identifier is ignored without any error | A non-existent unique identifier is ignored without any error | |||
| message generated. Thus, it is possible for a UID FETCH command | message generated. Thus, it is possible for a UID FETCH command | |||
| to return an OK without any data or a UID COPY, UID MOVE or UID STORE to | to return an OK without any data or a UID COPY, UID MOVE, or UID STORE to | |||
| return an OK without performing any operations. | return an OK without performing any operations. | |||
| </t> | </t> | |||
| <t> | ||||
| <!-- | ||||
| 2.1. UID EXPUNGE Command | ||||
| Arguments: sequence set | ||||
| Data: untagged responses: EXPUNGE | ||||
| Result: OK - expunge completed | ||||
| NO - expunge failure (e.g., permission denied) | ||||
| BAD - command unknown or arguments invalid | ||||
| <t> | ||||
| In the second form, the UID command takes an EXPUNGE command with | In the second form, the UID command takes an EXPUNGE command with | |||
| an extra parameter the specified a sequence set of UIDs to operate on. | an extra parameter that specifies a sequence set of UIDs to operate on. | |||
| The UID EXPUNGE command permanently removes all messages that both | The UID EXPUNGE command permanently removes all messages that have both | |||
| have the \Deleted flag set and have a UID that is included in the | the \Deleted flag set and a UID that is included in the | |||
| specified sequence set from the currently selected mailbox. If a | specified sequence set from the currently selected mailbox. If a | |||
| message either does not have the \Deleted flag set or has a UID | message either does not have the \Deleted flag set or has a UID | |||
| that is not included in the specified sequence set, it is not | that is not included in the specified sequence set, it is not | |||
| affected. | affected. | |||
| </t> | ||||
| <list> | ||||
| <t> | <t> | |||
| UID EXPUNGE is particularly useful for disconnected use clients. | UID EXPUNGE is particularly useful for disconnected use clients. | |||
| By using UID EXPUNGE instead of EXPUNGE when resynchronizing with | By using UID EXPUNGE instead of EXPUNGE when resynchronizing with | |||
| the server, the client can ensure that it does not inadvertantly | the server, the client can ensure that it does not inadvertently | |||
| remove any messages that have been marked as \Deleted by other | remove any messages that have been marked as \Deleted by other | |||
| clients between the time that the client was last connected and | clients between the time that the client was last connected and | |||
| the time the client resynchronizes. | the time the client resynchronizes. | |||
| </t> | </t> | |||
| </list> | <t> | |||
| </t> | Example: | |||
| </t> | ||||
| <figure><artwork> | <sourcecode type=""> | |||
| Example: C: A003 UID EXPUNGE 3000:3002 | C: A003 UID EXPUNGE 3000:3002 | |||
| S: * 3 EXPUNGE | S: * 3 EXPUNGE | |||
| S: * 3 EXPUNGE | S: * 3 EXPUNGE | |||
| S: * 3 EXPUNGE | S: * 3 EXPUNGE | |||
| S: A003 OK UID EXPUNGE completed | S: A003 OK UID EXPUNGE completed | |||
| </artwork></figure> | </sourcecode> | |||
| <t> | ||||
| <t> | ||||
| In the third form, the UID command takes a SEARCH command with | In the third form, the UID command takes a SEARCH command with | |||
| SEARCH command arguments. The interpretation of the arguments is | SEARCH command arguments. The interpretation of the arguments is | |||
| the same as with SEARCH; however, the numbers returned in a ESEARCH | the same as with SEARCH; however, the numbers returned in an ESEARCH | |||
| response for a UID SEARCH command are unique identifiers instead | response for a UID SEARCH command are unique identifiers instead | |||
| of message sequence numbers. Also, the corresponding ESEARCH response MUST | of message sequence numbers. Also, the corresponding ESEARCH response <bcp 14>MUST</bcp14> | |||
| include the UID indicator. | include the UID indicator. | |||
| For example, the command UID SEARCH | For example, the command UID SEARCH | |||
| 1:100 UID 443:557 returns the unique identifiers corresponding to | 1:100 UID 443:557 returns the unique identifiers corresponding to | |||
| the intersection of two sequence sets, the message sequence number | the intersection of two sequence sets, the message sequence number | |||
| range 1:100 and the UID range 443:557. | range 1:100, and the UID range 443:557. | |||
| <list> | </t> | |||
| <t> | <t indent="3"> | |||
| Note: in the above example, the UID range 443:557 | Note: in the above example, the UID range 443:557 | |||
| appears. The same comment about a non-existent unique | appears. The same comment about a non-existent unique | |||
| identifier being ignored without any error message also | identifier being ignored without any error message also | |||
| applies here. Hence, even if neither UID 443 or 557 | applies here. Hence, even if neither UID 443 or 557 | |||
| exist, this range is valid and would include an existing | exist, this range is valid and would include an existing | |||
| UID 495. | UID 495. | |||
| </t> | </t> | |||
| <t indent="3"> | ||||
| <t> | ||||
| Also note that a UID range of 559:* always includes the | Also note that a UID range of 559:* always includes the | |||
| UID of the last message in the mailbox, even if 559 is | UID of the last message in the mailbox, even if 559 is | |||
| higher than any assigned UID value. This is because the | higher than any assigned UID value. This is because the | |||
| contents of a range are independent of the order of the | contents of a range are independent of the order of the | |||
| range endpoints. Thus, any UID range with * as one of | range endpoints. Thus, any UID range with * as one of | |||
| the endpoints indicates at least one message (the | the endpoints indicates at least one message (the | |||
| message with the highest numbered UID), unless the | message with the highest numbered UID), unless the | |||
| mailbox is empty. | mailbox is empty. | |||
| </t> | </t> | |||
| </list> | <t> | |||
| </t> | ||||
| <t> | ||||
| The number after the "*" in an untagged FETCH or EXPUNGE response is alway s a | The number after the "*" in an untagged FETCH or EXPUNGE response is alway s a | |||
| message sequence number, not a unique identifier, even for a UID | message sequence number, not a unique identifier, even for a UID | |||
| command response. However, server implementations MUST implicitly | command response. However, server implementations <bcp14>MUST</bcp14> imp licitly | |||
| include the UID message data item as part of any FETCH response | include the UID message data item as part of any FETCH response | |||
| caused by a UID command, regardless of whether a UID was specified | caused by a UID command, regardless of whether a UID was specified | |||
| as a message data item to the FETCH. | as a message data item to the FETCH. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| Note: The rule about including the UID message data item as part | Note: The rule about including the UID message data item as part | |||
| of a FETCH response primarily applies to the UID FETCH and UID | of a FETCH response primarily applies to the UID FETCH and UID | |||
| STORE commands, including a UID FETCH command that does not | STORE commands, including a UID FETCH command that does not | |||
| include UID as a message data item. Although it is unlikely that | include UID as a message data item. Although it is unlikely that | |||
| the other UID commands will cause an untagged FETCH, this rule | the other UID commands will cause an untagged FETCH, this rule | |||
| applies to these commands as well. | applies to these commands as well. | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | Example: | |||
| Example: C: A999 UID FETCH 4827313:4828442 FLAGS | </t> | |||
| S: * 23 FETCH (FLAGS (\Seen) UID 4827313) | <sourcecode type=""> | |||
| S: * 24 FETCH (FLAGS (\Seen) UID 4827943) | C: A999 UID FETCH 4827313:4828442 FLAGS | |||
| S: * 25 FETCH (FLAGS (\Seen) UID 4828442) | S: * 23 FETCH (FLAGS (\Seen) UID 4827313) | |||
| S: A999 OK UID FETCH completed | S: * 24 FETCH (FLAGS (\Seen) UID 4827943) | |||
| </artwork></figure> | S: * 25 FETCH (FLAGS (\Seen) UID 4828442) | |||
| S: A999 OK UID FETCH completed | ||||
| </sourcecode> | ||||
| </section> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| </section> | <name>Client Commands - Experimental/Expansion</name> | |||
| <t> | ||||
| <section title='Client Commands - Experimental/Expansion'> | Each command that is not part of this specification | |||
| <bcp14>MUST</bcp14> have at least one capability name (see <xref target="c | ||||
| <t> | apability-command" format="default"/>) associated with it. | |||
| Each command which is not part of this specification | ||||
| MUST have at least one capability name (see <xref target="capability-comma | ||||
| nd"/>) associated with it. | ||||
| (Multiple commands can be associated with the same capability name.) | (Multiple commands can be associated with the same capability name.) | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Server implementations <bcp14>MUST NOT</bcp14> send any added | |||
| Server implementations MUST NOT send any added (not specified in this spec | untagged responses (not specified in this specification), unless the clien | |||
| ification) | t requested it | |||
| untagged responses, unless the client requested it | ||||
| by issuing the associated experimental command (specified in an extension document) or | by issuing the associated experimental command (specified in an extension document) or | |||
| the ENABLE command (<xref target="enable-command"/>). | the ENABLE command (<xref target="enable-command" format="default"/>). | |||
| </t> | </t> | |||
| <t>The following example demonstrates how a client can check for the pre | ||||
| <t>The following example demonstrates how a client can check for presence of | sence of | |||
| a fictitious XPIG-LATIN capability that adds the XPIG-LATIN command and | a fictitious XPIG-LATIN capability that adds the XPIG-LATIN command and | |||
| the the XPIG-LATIN untagged response. | the XPIG-LATIN untagged response. | |||
| (Note that for an extension the command name and the capability name don't | (Note that for an extension, the command name and the capability name don' | |||
| t | ||||
| have to be the same.)</t> | have to be the same.)</t> | |||
| <t> | ||||
| <figure><artwork> | Example: | |||
| Example: C: a441 CAPABILITY | </t> | |||
| S: * CAPABILITY IMAP4rev2 XPIG-LATIN | <sourcecode type=""> | |||
| S: a441 OK CAPABILITY completed | C: a441 CAPABILITY | |||
| C: A442 XPIG-LATIN | S: * CAPABILITY IMAP4rev2 XPIG-LATIN | |||
| S: * XPIG-LATIN ow-nay eaking-spay ig-pay atin-lay | S: a441 OK CAPABILITY completed | |||
| S: A442 OK XPIG-LATIN ompleted-cay | C: A442 XPIG-LATIN | |||
| </artwork></figure> | S: * XPIG-LATIN ow-nay eaking-spay ig-pay atin-lay | |||
| S: A442 OK XPIG-LATIN ompleted-cay | ||||
| </sourcecode> | ||||
| </section> | ||||
| </section> | </section> | |||
| <section anchor="server-responses" numbered="true" toc="default"> | ||||
| </section> | <name>Server Responses</name> | |||
| <t> | ||||
| <section title='Server Responses' anchor='server-responses'> | ||||
| <t> | ||||
| Server responses are in three forms: status responses, server data, | Server responses are in three forms: status responses, server data, | |||
| and command continuation request. The information contained in a | and command continuation requests. The information contained in a | |||
| server response, identified by "Contents:" in the response | server response, identified by "Contents:" in the response | |||
| descriptions below, is described by function, not by syntax. The | descriptions below, is described by function, not by syntax. The | |||
| precise syntax of server responses is described in the Formal Syntax | precise syntax of server responses is described in "Formal Syntax" | |||
| (<xref target='IMAP-ABNF'/>). | (<xref target="IMAP-ABNF" format="default"/>). | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | The client <bcp14>MUST</bcp14> be prepared to accept any response at all time | |||
| The client MUST be prepared to accept any response at all times. | s. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| Status responses can be tagged or untagged. Tagged status responses | Status responses can be tagged or untagged. Tagged status responses | |||
| indicate the completion result (OK, NO, or BAD status) of a client | indicate the completion result (OK, NO, or BAD status) of a client | |||
| command, and have a tag matching the command. | command and have a tag matching the command. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| Some status responses, and all server data, are untagged. An | Some status responses, and all server data, are untagged. An | |||
| untagged response is indicated by the token "*" instead of a tag. | untagged response is indicated by the token "*" instead of a tag. | |||
| Untagged status responses indicate server greeting, or server status | Untagged status responses indicate server greeting or server status | |||
| that does not indicate the completion of a command (for example, an | that does not indicate the completion of a command (for example, an | |||
| impending system shutdown alert). For historical reasons, untagged | impending system shutdown alert). For historical reasons, untagged | |||
| server data responses are also called "unsolicited data", although | server data responses are also called "unsolicited data", although | |||
| strictly speaking, only unilateral server data is truly | strictly speaking, only unilateral server data is truly | |||
| "unsolicited". | "unsolicited". | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Certain server data <bcp14>MUST</bcp14> be remembered by the client when it i | |||
| Certain server data MUST be remembered by the client when it is | s | |||
| received; this is noted in the description of that data. Such data | received; this is noted in the description of that data. Such data | |||
| conveys critical information which affects the interpretation of all | conveys critical information that affects the interpretation of all | |||
| subsequent commands and responses (e.g., updates reflecting the | subsequent commands and responses (e.g., updates reflecting the | |||
| creation or destruction of messages). | creation or destruction of messages). | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Other server data <bcp14>SHOULD</bcp14> be remembered for later reference; if | |||
| Other server data SHOULD be remembered for later reference; if the | the | |||
| client does not need to remember the data, or if remembering the data has | client does not need to remember the data, or if remembering the data has | |||
| no obvious purpose (e.g., a SEARCH response when no SEARCH command is | no obvious purpose (e.g., a SEARCH response when no SEARCH command is | |||
| in progress), the data can be ignored. | in progress), the data can be ignored. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| An example of unilateral untagged server data occurs when the IMAP | An example of unilateral untagged server data occurs when the IMAP | |||
| connection is in the selected state. In the selected state, the | connection is in the selected state. In the selected state, the | |||
| server checks the mailbox for new messages as part of command | server checks the mailbox for new messages as part of command | |||
| execution. Normally, this is part of the execution of every command; | execution. Normally, this is part of the execution of every command; | |||
| hence, a NOOP command suffices to check for new messages. If new | hence, a NOOP command suffices to check for new messages. If new | |||
| messages are found, the server sends untagged EXISTS | messages are found, the server sends an untagged EXISTS | |||
| response reflecting the new size of the mailbox. Server | response reflecting the new size of the mailbox. Server | |||
| implementations that offer multiple simultaneous access to the same | implementations that offer multiple simultaneous access to the same | |||
| mailbox SHOULD also send appropriate unilateral untagged FETCH and | mailbox <bcp14>SHOULD</bcp14> also send appropriate unilateral untagged FETCH and | |||
| EXPUNGE responses if another agent changes the state of any message | EXPUNGE responses if another agent changes the state of any message | |||
| flags or expunges any messages. | flags or expunges any messages. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| Command continuation request responses use the token "+" instead of a | Command continuation request responses use the token "+" instead of a | |||
| tag. These responses are sent by the server to indicate acceptance | tag. These responses are sent by the server to indicate acceptance | |||
| of an incomplete client command and readiness for the remainder of | of an incomplete client command and readiness for the remainder of | |||
| the command. | the command. | |||
| </t> | </t> | |||
| <section anchor="server-status-responses" numbered="true" toc="default"> | ||||
| <section title='Server Responses - Generic Status Responses' anchor='server- | <name>Server Responses - Generic Status Responses</name> | |||
| status-responses'> | <t> | |||
| Status responses are OK, NO, BAD, PREAUTH, and BYE. OK, NO, and BAD | ||||
| <t> | ||||
| Status responses are OK, NO, BAD, PREAUTH and BYE. OK, NO, and BAD | ||||
| can be tagged or untagged. PREAUTH and BYE are always untagged. | can be tagged or untagged. PREAUTH and BYE are always untagged. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Status responses <bcp14>MAY</bcp14> include an <bcp14>OPTIONAL</bcp14> "respo | |||
| Status responses MAY include an OPTIONAL "response code". A response | nse code". A response | |||
| code consists of data inside square brackets in the form of an atom, | code consists of data inside square brackets in the form of an atom, | |||
| possibly followed by a space and arguments. The response code | possibly followed by a space and arguments. The response code | |||
| contains additional information or status codes for client software | contains additional information or status codes for client software | |||
| beyond the OK/NO/BAD condition, and are defined when there is a | beyond the OK/NO/BAD condition and are defined when there is a | |||
| specific action that a client can take based upon the additional | specific action that a client can take based upon the additional | |||
| information. | information. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The currently defined response codes are: | The currently defined response codes are: | |||
| <list style='hanging'> | </t> | |||
| <t hangText='ALERT'> | <dl newline="true" spacing="normal"> | |||
| <iref item='ALERT (response code)'/> | <dt>ALERT</dt> | |||
| <dd><iref item="ALERT (response code)" subitem="" primary="false"/> | ||||
| <list> | The human-readable text contains a special alert that is | |||
| <t> | ||||
| The human-readable text contains a special alert that are | ||||
| presented to the user in a fashion that calls the user's | presented to the user in a fashion that calls the user's | |||
| attention to the message. | attention to the message. | |||
| Content of ALERT response codes received on a connection without | Content of ALERT response codes received on a connection without | |||
| TLS or SASL security layer confidentiality SHOULD be ignored | TLS or SASL security-layer confidentiality <bcp14>SHOULD</bcp14> be ig | |||
| by clients. If displayed, such alerts MUST be clearly marked | nored | |||
| by clients. If displayed, such alerts <bcp14>MUST</bcp14> be clearly m | ||||
| arked | ||||
| as potentially suspicious. (Note that some existing clients | as potentially suspicious. (Note that some existing clients | |||
| are known to hyperlink returned text which make them very | are known to hyperlink returned text, which make them very | |||
| dangerous.) | dangerous.) | |||
| Alerts received after successful establishment of a TLS/SASL | Alerts received after successful establishment of a TLS/SASL | |||
| confidentiality layer MUST be presented to the user. | confidentiality layer <bcp14>MUST</bcp14> be presented to the user. | |||
| <!--Warn about dangers of ALERT before STARTTLS, as they can be inject | ||||
| ed by an attacker | ||||
| They might contain URLs and trick users into clicking them, as some cl | ||||
| ients will HTML-ize ALERT text.--> | ||||
| </t> | ||||
| </list> | ||||
| </t> | ||||
| <t hangText='ALREADYEXISTS'> | </dd> | |||
| <iref item='ALREADYEXISTS (response code)'/> | ||||
| <list> | <dt>ALREADYEXISTS</dt> | |||
| <t> | <dd><t><iref item="ALREADYEXISTS (response code)" subitem="" primary=" | |||
| false"/> | ||||
| The operation attempts to create something that already exists, | The operation attempts to create something that already exists, | |||
| such as when the CREATE or RENAME directories attempt to create | such as when a CREATE or RENAME command attempts to create | |||
| a mailbox and there is already one of that name. | a mailbox and there is already one of that name. | |||
| </t> | </t> | |||
| <sourcecode type=""> | ||||
| C: o356 RENAME this that | ||||
| S: o356 NO [ALREADYEXISTS] Mailbox "that" already exists | ||||
| </sourcecode> | ||||
| </dd> | ||||
| <t> | <dt>APPENDUID</dt> | |||
| C: o356 RENAME this that<vspace/> | <dd><t><iref item="APPENDUID (response code)" subitem="" primary="fals | |||
| S: o356 NO [ALREADYEXISTS] Mailbox "that" already exists | e"/> | |||
| </t> | ||||
| </list> | ||||
| </t> | ||||
| <t hangText='APPENDUID'> | ||||
| <iref item='APPENDUID (response code)'/> | ||||
| <list> | ||||
| <t> | ||||
| Followed by the UIDVALIDITY of the destination mailbox and the UID | Followed by the UIDVALIDITY of the destination mailbox and the UID | |||
| assigned to the appended message in the destination mailbox, | assigned to the appended message in the destination mailbox, | |||
| indicates that the message has been appended to the destination | it indicates that the message has been appended to the destination | |||
| mailbox with that UID. | mailbox with that UID. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | If the server also supports the <xref target="RFC3502" format="def | |||
| If the server also supports the <xref target='MULTIAPPEND'/> exten | ault"/> extension, and if | |||
| sion, and if | ||||
| multiple messages were appended in the APPEND command, then the | multiple messages were appended in the APPEND command, then the | |||
| second value is a UID set containing the UIDs assigned to the | second value is a UID set containing the UIDs assigned to the | |||
| appended messages, in the order they were transmitted in the | appended messages, in the order they were transmitted in the | |||
| APPEND command. This UID set may not contain extraneous UIDs or | APPEND command. This UID set may not contain extraneous UIDs or | |||
| the symbol "*". | the symbol "*". | |||
| </t> | </t> | |||
| <t indent="3"> | ||||
| <t> | Note: the UID set form of the APPENDUID response code <bcp14>M | |||
| <list> | UST NOT</bcp14> | |||
| <t> | ||||
| Note: the UID set form of the APPENDUID response code MUST NOT | ||||
| be used if only a single message was appended. In particular, | be used if only a single message was appended. In particular, | |||
| a server MUST NOT send a range such as 123:123. This is | a server <bcp14>MUST NOT</bcp14> send a range such as 123:123. | |||
| because a client that does not support <xref target='MULTIAPPE | This is | |||
| ND'/> expects | because a client that does not support <xref target="RFC3502" | |||
| format="default"/> expects | ||||
| only a single UID and not a UID set. | only a single UID and not a UID set. | |||
| </t> | </t> | |||
| </list> | <t> | |||
| </t> | ||||
| <t> | ||||
| UIDs are assigned in strictly ascending order in the mailbox | UIDs are assigned in strictly ascending order in the mailbox | |||
| (refer to <xref target='uid-def'/>); note that a range of 12:10 is | (refer to <xref target="uid-def" format="default"/>); note that a | |||
| exactly | range of 12:10 is exactly | |||
| equivalent to 10:12 and refers to the sequence 10,11,12. | equivalent to 10:12 and refers to the sequence 10,11,12.</t> | |||
| </t> | ||||
| <t> | <t> | |||
| This response code is returned in a tagged OK response to the | This response code is returned in a tagged OK response to the | |||
| APPEND command. | APPEND command.</t> | |||
| </t> | </dd> | |||
| </list> | ||||
| </t> | ||||
| <t hangText='AUTHENTICATIONFAILED'> | ||||
| <iref item='AUTHENTICATIONFAILED (response code)'/> | ||||
| <list> | <dt>AUTHENTICATIONFAILED</dt> | |||
| <t> | <dd><t><iref item="AUTHENTICATIONFAILED (response code)" subitem="" pr | |||
| imary="false"/> | ||||
| Authentication failed for some reason on which the server is | Authentication failed for some reason on which the server is | |||
| unwilling to elaborate. Typically, this includes "unknown | unwilling to elaborate. Typically, this includes "unknown | |||
| user" and "bad password". | user" and "bad password". | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| This is the same as not sending any response code, except that | This is the same as not sending any response code, except that | |||
| when a client sees AUTHENTICATIONFAILED, it knows that the | when a client sees AUTHENTICATIONFAILED, it knows that the | |||
| problem wasn't, e.g., UNAVAILABLE, so there's no point in | problem wasn't, e.g., UNAVAILABLE, so there's no point in | |||
| trying the same login/password again later. | trying the same login/password again later. | |||
| </t> | </t> | |||
| <sourcecode type=""> | ||||
| C: b LOGIN "fred" "foo" | ||||
| S: b NO [AUTHENTICATIONFAILED] Authentication failed | ||||
| </sourcecode> | ||||
| </dd> | ||||
| <t> | <dt>AUTHORIZATIONFAILED</dt> | |||
| C: b LOGIN "fred" "foo"<vspace/> | <dd> <t><iref item="AUTHORIZATIONFAILED (response code)" subitem="" pr | |||
| S: b NO [AUTHENTICATIONFAILED] Authentication failed | imary="false"/> | |||
| </t> | ||||
| </list> | ||||
| </t> | ||||
| <t hangText='AUTHORIZATIONFAILED'> | ||||
| <iref item='AUTHORIZATIONFAILED (response code)'/> | ||||
| <list> | ||||
| <t> | ||||
| Authentication succeeded in using the authentication identity, | Authentication succeeded in using the authentication identity, | |||
| but the server cannot or will not allow the authentication | but the server cannot or will not allow the authentication | |||
| identity to act as the requested authorization identity. This | identity to act as the requested authorization identity. This | |||
| is only applicable when the authentication and authorization | is only applicable when the authentication and authorization | |||
| identities are different. | identities are different. | |||
| </t> | </t> | |||
| <t> | <sourcecode type=""> | |||
| C: c1 AUTHENTICATE PLAIN<vspace/> | C: c1 AUTHENTICATE PLAIN | |||
| [...]<vspace/> | [...] | |||
| S: c1 NO [AUTHORIZATIONFAILED] No such authorization-ID<vspace/> | S: c1 NO [AUTHORIZATIONFAILED] No such authorization-ID | |||
| </t> | </sourcecode> | |||
| <t> | ||||
| C: c2 AUTHENTICATE PLAIN<vspace/> | ||||
| [...]<vspace/> | ||||
| S: c2 NO [AUTHORIZATIONFAILED] Authenticator is not an admin | ||||
| </t> | ||||
| </list> | ||||
| </t> | ||||
| <t hangText='BADCHARSET'> | ||||
| <iref item='BADCHARSET (response code)'/> | ||||
| <list> | <sourcecode type=""> | |||
| <t> | C: c2 AUTHENTICATE PLAIN | |||
| [...] | ||||
| S: c2 NO [AUTHORIZATIONFAILED] Authenticator is not an admin | ||||
| </sourcecode> | ||||
| </dd> | ||||
| <dt>BADCHARSET</dt> | ||||
| <dd><iref item="BADCHARSET (response code)" subitem="" primary="false" | ||||
| /> | ||||
| Optionally followed by a parenthesized list of charsets. A | Optionally followed by a parenthesized list of charsets. A | |||
| SEARCH failed because the given charset is not supported by | SEARCH failed because the given charset is not supported by | |||
| this implementation. If the optional list of charsets is | this implementation. If the optional list of charsets is | |||
| given, this lists the charsets that are supported by this | given, this lists the charsets that are supported by this | |||
| implementation.</t> | implementation.</dd> | |||
| </list> | ||||
| </t> | ||||
| <t hangText='CANNOT'> | ||||
| <iref item='CANNOT (response code)'/> | ||||
| <list> | <dt>CANNOT</dt> | |||
| <t> | <dd><t><iref item="CANNOT (response code)" subitem="" primary="false"/ | |||
| The operation violates some invariant of the server and can | > | |||
| This operation violates some invariant of the server and can | ||||
| never succeed. | never succeed. | |||
| </t> | </t> | |||
| <t> | <sourcecode type=""> | |||
| C: l create "///////"<vspace/> | C: l create "///////" | |||
| S: l NO [CANNOT] Adjacent slashes are not supported | S: l NO [CANNOT] Adjacent slashes are not supported | |||
| </t> | </sourcecode> | |||
| </list> | </dd> | |||
| </t> | <dt>CAPABILITY</dt> | |||
| <dd><iref item="CAPABILITY (response code)" subitem="" primary="false" | ||||
| <t hangText='CAPABILITY'> | /> | |||
| <iref item='CAPABILITY (response code)'/> | ||||
| <list> | ||||
| <t> | ||||
| Followed by a list of capabilities. This can appear in the | Followed by a list of capabilities. This can appear in the | |||
| initial OK or PREAUTH response to transmit an initial | initial OK or PREAUTH response to transmit an initial | |||
| capabilities list. It can also appear in tagged responses to LOGIN | capabilities list. It can also appear in tagged responses to LOGIN | |||
| or AUTHENTICATE commands. This makes it unnecessary for a client to | or AUTHENTICATE commands. This makes it unnecessary for a client to | |||
| send a separate CAPABILITY command if it recognizes this | send a separate CAPABILITY command if it recognizes this | |||
| response code and there was no change to the TLS and/or authentication | response code and there was no change to the TLS and/or authentication | |||
| state since it was received.</t> | state since it was received. | |||
| </list> | </dd> | |||
| </t> | <dt>CLIENTBUG</dt> | |||
| <dd><t><iref item="CLIENTBUG (response code)" subitem="" primary="fals | ||||
| <t hangText='CLIENTBUG'> | e"/> | |||
| <iref item='CLIENTBUG (response code)'/> | The server has detected a client bug. This can accompany any | |||
| <list> | ||||
| <t> | ||||
| The server has detected a client bug. This can accompany all | ||||
| of OK, NO, and BAD, depending on what the client bug is. | of OK, NO, and BAD, depending on what the client bug is. | |||
| </t> | </t> | |||
| <t> | <sourcecode type=""> | |||
| C: k1 select "/archive/projects/experiment-iv"<vspace/> | C: k1 select "/archive/projects/experiment-iv" | |||
| [...]<vspace/> | [...] | |||
| S: k1 OK [READ-ONLY] Done<vspace/> | S: k1 OK [READ-ONLY] Done | |||
| C: k2 status "/archive/projects/experiment-iv" (messages)<vspace/> | C: k2 status "/archive/projects/experiment-iv" (messages) | |||
| [...]<vspace/> | [...] | |||
| S: k2 OK [CLIENTBUG] Done | S: k2 OK [CLIENTBUG] Done | |||
| </t> | </sourcecode> | |||
| </list> | </dd> | |||
| </t> | ||||
| <t hangText='CLOSED' anchor='closed'> | ||||
| <iref item='CLOSED (response code)'/> | ||||
| <list> | <dt>CLOSED</dt> | |||
| <t> | <dd anchor="closed"> | |||
| The CLOSED response code has no parameters. A server return the CLOS | <t><iref item="CLOSED (response code)" subitem="" primary="false"/> | |||
| ED | The CLOSED response code has no parameters. | |||
| A server returns the CLOSED | ||||
| response code when the currently selected mailbox is closed | response code when the currently selected mailbox is closed | |||
| implicitly using the SELECT/EXAMINE command on another mailbox. The | implicitly using the SELECT or EXAMINE command on another mailbox. T he | |||
| CLOSED response code serves as a boundary between responses for the | CLOSED response code serves as a boundary between responses for the | |||
| previously opened mailbox (which was closed) and the newly selected | previously opened mailbox (which was closed) and the newly selected | |||
| mailbox; all responses before the CLOSED response code relate to the | mailbox; all responses before the CLOSED response code relate to the | |||
| mailbox that was closed, and all subsequent responses relate to the | mailbox that was closed, and all subsequent responses relate to the | |||
| newly opened mailbox. | newly opened mailbox. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| There is no need to return the CLOSED response code on completion of | There is no need to return the CLOSED response code on completion of | |||
| the CLOSE or the UNSELECT command (or similar), whose | the CLOSE or the UNSELECT command (or similar), whose | |||
| purpose is to close the currently selected mailbox without opening a | purpose is to close the currently selected mailbox without opening a | |||
| new one. | new one.</t> | |||
| </t> | </dd> | |||
| </list> | ||||
| </t> | ||||
| <t hangText='CONTACTADMIN'> | ||||
| <iref item='CONTACTADMIN (response code)'/> | ||||
| <list> | <dt>CONTACTADMIN</dt> | |||
| <t> | <dd><t><iref item="CONTACTADMIN (response code)" subitem="" primary="f | |||
| alse"/> | ||||
| The user should contact the system administrator or support | The user should contact the system administrator or support | |||
| desk. | desk. | |||
| </t> | </t> | |||
| <sourcecode type=""> | ||||
| C: e login "fred" "foo" | ||||
| S: e NO [CONTACTADMIN] | ||||
| </sourcecode> | ||||
| </dd> | ||||
| <t> | <dt>COPYUID</dt> | |||
| C: e login "fred" "foo"<vspace/> | <dd><t><iref item="COPYUID (response code)" subitem="" primary="false" | |||
| S: e NO [CONTACTADMIN] | /> | |||
| </t> | ||||
| </list> | ||||
| </t> | ||||
| <t hangText='COPYUID'> | ||||
| <iref item='COPYUID (response code)'/> | ||||
| <list> | ||||
| <t> | ||||
| Followed by the UIDVALIDITY of the destination mailbox, a UID set | Followed by the UIDVALIDITY of the destination mailbox, a UID set | |||
| containing the UIDs of the message(s) in the source mailbox that | containing the UIDs of the message(s) in the source mailbox that | |||
| were copied to the destination mailbox, followed by another UID se t | were copied to the destination mailbox, followed by another UID se t | |||
| containing the UIDs | containing the UIDs | |||
| assigned to the copied message(s) in the destination mailbox, | assigned to the copied message(s) in the destination mailbox, | |||
| indicates that the message(s) have been copied to the destination | indicates that the message(s) has been copied to the destination | |||
| mailbox with the stated UID(s). | mailbox with the stated UID(s). | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | The source UID set is in the order the message(s) was copied; the | |||
| The source UID set is in the order the message(s) were copied; the | ||||
| destination UID set corresponds to the source UID set and is in | destination UID set corresponds to the source UID set and is in | |||
| the same order. Neither of the UID sets may contain extraneous | the same order. Neither of the UID sets may contain extraneous | |||
| UIDs or the symbol "*". | UIDs or the symbol "*". | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| UIDs are assigned in strictly ascending order in the mailbox | UIDs are assigned in strictly ascending order in the mailbox | |||
| (refer to <xref target='uid-def'/>); note that a range of 12:10 is | (refer to <xref target="uid-def" format="default"/>); note that a | |||
| exactly | range of 12:10 is exactly | |||
| equivalent to 10:12 and refers to the sequence 10,11,12. | equivalent to 10:12 and refers to the sequence 10,11,12.</t> | |||
| </t> | ||||
| <t> | ||||
| This response code is returned in a tagged OK response to the COPY | ||||
| /UID COPY | ||||
| command or in the untagged OK response to the MOVE/UID MOVE comman | ||||
| d. | ||||
| </t> | ||||
| </list> | ||||
| </t> | ||||
| <t hangText='CORRUPTION'> | <t> | |||
| <iref item='CORRUPTION (response code)'/> | This response code is returned in a tagged OK response to the COPY | |||
| or UID COPY | ||||
| command or in the untagged OK response to the MOVE or UID MOVE com | ||||
| mand.</t> | ||||
| </dd> | ||||
| <list> | <dt>CORRUPTION</dt> | |||
| <t> | <dd> <t><iref item="CORRUPTION (response code)" subitem="" primary="fa | |||
| lse"/> | ||||
| The server discovered that some relevant data (e.g., the | The server discovered that some relevant data (e.g., the | |||
| mailbox) are corrupt. This response code does not include any | mailbox) are corrupt. This response code does not include any | |||
| information about what's corrupt, but the server can write that | information about what's corrupt, but the server can write that | |||
| to its logfiles. | to its logfiles. | |||
| </t> | </t> | |||
| <sourcecode type=""> | ||||
| C: i select "/archive/projects/experiment-iv" | ||||
| S: i NO [CORRUPTION] Cannot open mailbox | ||||
| </sourcecode> | ||||
| </dd> | ||||
| <t> | <dt>EXPIRED</dt> | |||
| C: i select "/archive/projects/experiment-iv"<vspace/> | <dd><t><iref item="EXPIRED (response code)" subitem="" primary="false" | |||
| S: i NO [CORRUPTION] Cannot open mailbox | /> | |||
| </t> | ||||
| </list> | ||||
| </t> | ||||
| <t hangText='EXPIRED'> | ||||
| <iref item='EXPIRED (response code)'/> | ||||
| <list> | ||||
| <t> | ||||
| Either authentication succeeded or the server no longer had the | Either authentication succeeded or the server no longer had the | |||
| necessary data; either way, access is no longer permitted using | necessary data; either way, access is no longer permitted using | |||
| that passphrase. The client or user should get a new | that passphrase. The client or user should get a new | |||
| passphrase. | passphrase. | |||
| </t> | </t> | |||
| <sourcecode type=""> | ||||
| C: d login "fred" "foo" | ||||
| S: d NO [EXPIRED] That password isn't valid any more | ||||
| </sourcecode> | ||||
| </dd> | ||||
| <t> | <dt>EXPUNGEISSUED</dt> | |||
| C: d login "fred" "foo"<vspace/> | <dd><t><iref item="EXPUNGEISSUED (response code)" subitem="" primary=" | |||
| S: d NO [EXPIRED] That password isn't valid any more | false"/> | |||
| </t> | ||||
| </list> | ||||
| </t> | ||||
| <t hangText='EXPUNGEISSUED'> | ||||
| <iref item='EXPUNGEISSUED (response code)'/> | ||||
| <list> | ||||
| <t> | ||||
| Someone else has issued an EXPUNGE for the same mailbox. The | Someone else has issued an EXPUNGE for the same mailbox. The | |||
| client may want to issue NOOP soon. <xref target='IMAP-MULTIACCESS'/> discusses this | client may want to issue NOOP soon. <xref target="RFC2180" format="def ault"/> discusses this | |||
| subject in depth. | subject in depth. | |||
| </t> | </t> | |||
| <t> | <sourcecode type=""> | |||
| C: h search from maria@example.com<vspace/> | C: h search from maria@example.com | |||
| S: * ESEARCH (TAG "h") ALL 1:3,5,8,13,21,42<vspace/> | S: * ESEARCH (TAG "h") ALL 1:3,5,8,13,21,42 | |||
| S: h OK [EXPUNGEISSUED] Search completed | S: h OK [EXPUNGEISSUED] Search completed | |||
| </t> | </sourcecode> | |||
| </list> | </dd> | |||
| </t> | ||||
| <t hangText='HASCHILDREN'> | ||||
| <iref item='HASCHILDREN (response code)'/> | ||||
| <list> | <dt>HASCHILDREN</dt> | |||
| <t> | <dd> <t><iref item="HASCHILDREN (response code)" subitem="" primary="f | |||
| alse"/> | ||||
| The mailbox delete operation failed because the mailbox | The mailbox delete operation failed because the mailbox | |||
| has one or more children and the server doesn't allow | has one or more children, and the server doesn't allow | |||
| deletion of mailboxes with children. | deletion of mailboxes with children. | |||
| </t> | </t> | |||
| <sourcecode type=""> | ||||
| C: m356 DELETE Notes | ||||
| S: o356 NO [HASCHILDREN] Mailbox "Notes" has children | ||||
| that need to be deleted first | ||||
| </sourcecode> | ||||
| </dd> | ||||
| <t> | <dt>INUSE</dt> | |||
| C: m356 DELETE Notes<vspace/> | <dd><t><iref item="INUSE (response code)" subitem="" primary="false"/> | |||
| S: o356 NO [HASCHILDREN] Mailbox "Notes" has children | ||||
| that need to be deleted first | ||||
| </t> | ||||
| </list> | ||||
| </t> | ||||
| <t hangText='INUSE'> | ||||
| <iref item='INUSE (response code)'/> | ||||
| <list> | ||||
| <t> | ||||
| An operation has not been carried out because it involves | An operation has not been carried out because it involves | |||
| sawing off a branch someone else is sitting on. Someone else | sawing off a branch someone else is sitting on. Someone else | |||
| may be holding an exclusive lock needed for this operation, or | may be holding an exclusive lock needed for this operation, or | |||
| the operation may involve deleting a resource someone else is | the operation may involve deleting a resource someone else is | |||
| using, typically a mailbox. | using, typically a mailbox. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The operation may succeed if the client tries again later. | The operation may succeed if the client tries again later. | |||
| </t> | </t> | |||
| <sourcecode type=""> | ||||
| C: g delete "/archive/projects/experiment-iv" | ||||
| S: g NO [INUSE] Mailbox in use | ||||
| </sourcecode> | ||||
| </dd> | ||||
| <t> | <dt>LIMIT</dt> | |||
| C: g delete "/archive/projects/experiment-iv"<vspace/> | <dd><t><iref item="LIMIT (response code)" subitem="" primary="false"/> | |||
| S: g NO [INUSE] Mailbox in use | ||||
| </t> | ||||
| </list> | ||||
| </t> | ||||
| <t hangText='LIMIT'> | ||||
| <iref item='LIMIT (response code)'/> | ||||
| <list> | ||||
| <t> | ||||
| The operation ran up against an implementation limit of some | The operation ran up against an implementation limit of some | |||
| kind, such as the number of flags on a single message or the | kind, such as the number of flags on a single message or the | |||
| number of flags used in a mailbox. | number of flags used in a mailbox. | |||
| </t> | </t> | |||
| <sourcecode type=""> | ||||
| C: m STORE 42 FLAGS f1 f2 f3 f4 f5 ... f250 | ||||
| S: m NO [LIMIT] At most 32 flags in one mailbox supported | ||||
| </sourcecode> | ||||
| </dd> | ||||
| <t> | <dt>NONEXISTENT</dt> | |||
| C: m STORE 42 FLAGS f1 f2 f3 f4 f5 ... f250<vspace/> | <dd><t><iref item="NONEXISTENT (response code)" subitem="" primary="fa | |||
| S: m NO [LIMIT] At most 32 flags in one mailbox supported | lse"/> | |||
| </t> | ||||
| </list> | ||||
| </t> | ||||
| <t hangText='NONEXISTENT'> | ||||
| <iref item='NONEXISTENT (response code)'/> | ||||
| <list> | ||||
| <t> | ||||
| The operation attempts to delete something that does not exist. | The operation attempts to delete something that does not exist. | |||
| Similar to ALREADYEXISTS. | Similar to ALREADYEXISTS. | |||
| </t> | </t> | |||
| <sourcecode type=""> | ||||
| C: p RENAME this that | ||||
| S: p NO [NONEXISTENT] No such mailbox | ||||
| </sourcecode> | ||||
| </dd> | ||||
| <t> | <dt>NOPERM</dt> | |||
| C: p RENAME this that<vspace/> | <dd><t><iref item="NOPERM (response code)" subitem="" primary="false"/ | |||
| S: p NO [NONEXISTENT] No such mailbox | > | |||
| </t> | The access control system (e.g., ACL; see | |||
| </list> | <xref target="RFC4314" format="default"/>) does not permit this user to | |||
| </t> | carry out an operation, | |||
| <t hangText='NOPERM'> | ||||
| <iref item='NOPERM (response code)'/> | ||||
| <list> | ||||
| <t> | ||||
| The access control system (e.g., Access Control List (ACL), see | ||||
| <xref target='RFC4314'/>) does not permit this user to carry out an ope | ||||
| ration, | ||||
| such as selecting or creating a mailbox. | such as selecting or creating a mailbox. | |||
| </t> | </t> | |||
| <sourcecode type=""> | ||||
| C: f select "/archive/projects/experiment-iv" | ||||
| S: f NO [NOPERM] Access denied | ||||
| </sourcecode> | ||||
| </dd> | ||||
| <t> | <dt>OVERQUOTA</dt> | |||
| C: f select "/archive/projects/experiment-iv"<vspace/> | <dd><t><iref item="OVERQUOTA (response code)" subitem="" primary="fals | |||
| S: f NO [NOPERM] Access denied | e"/> | |||
| </t> | ||||
| </list> | ||||
| </t> | ||||
| <t hangText='OVERQUOTA'> | ||||
| <iref item='OVERQUOTA (response code)'/> | ||||
| <list> | ||||
| <t> | ||||
| The user would be over quota after the operation. (The user | The user would be over quota after the operation. (The user | |||
| may or may not be over quota already.) | may or may not be over quota already.) | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| Note that if the server sends OVERQUOTA but doesn't support the | Note that if the server sends OVERQUOTA but doesn't support the | |||
| IMAP QUOTA extension defined by <xref target='RFC2087'/>, then there is | IMAP QUOTA extension defined by <xref target="RFC2087" format="default" | |||
| a | />, then there is a quota, but the client cannot find out what the quota is. | |||
| quota, but the client cannot find out what the quota is. | </t> | |||
| </t> | ||||
| <t> | ||||
| C: n1 uid copy 1:* oldmail<vspace/> | ||||
| S: n1 NO [OVERQUOTA] Sorry<vspace/> | ||||
| </t> | ||||
| <t> | <sourcecode type=""> | |||
| C: n2 uid copy 1:* oldmail<vspace/> | C: n1 uid copy 1:* oldmail | |||
| S: n2 OK [OVERQUOTA] You are now over your soft quota | S: n1 NO [OVERQUOTA] Sorry | |||
| </t> | </sourcecode> | |||
| </list> | ||||
| </t> | ||||
| <t hangText='PARSE'> | <sourcecode type=""> | |||
| <iref item='PARSE (response code)'/> | C: n2 uid copy 1:* oldmail | |||
| S: n2 OK [OVERQUOTA] You are now over your soft quota | ||||
| </sourcecode> | ||||
| </dd> | ||||
| <list> | <dt>PARSE</dt> | |||
| <t> | <dd><iref item="PARSE (response code)" subitem="" primary="false"/> | |||
| The human-readable text represents an error in parsing the | The human-readable text represents an error in parsing the | |||
| <xref target='RFC-5322'/> header or <xref target='MIME-IMB'/> headers o | <xref target="RFC5322" format="default"/> header or <xref target="RFC20 | |||
| f a message in the | 45" format="default"/> headers of a message in the | |||
| mailbox.</t> | mailbox.</dd> | |||
| </list> | ||||
| </t> | ||||
| <t hangText='PERMANENTFLAGS'> | ||||
| <iref item='PERMANENTFLAGS (response code)'/> | ||||
| <list> | <dt>PERMANENTFLAGS</dt> | |||
| <t> | <dd><t><iref item="PERMANENTFLAGS (response code)" subitem="" primary= | |||
| Followed by a parenthesized list of flags, indicates which of | "false"/> | |||
| Followed by a parenthesized list of flags and indicates which of | ||||
| the known flags the client can change permanently. Any flags | the known flags the client can change permanently. Any flags | |||
| that are in the FLAGS untagged response, but not the | that are in the FLAGS untagged response, but not in the | |||
| PERMANENTFLAGS list, can not be set permanently. | PERMANENTFLAGS list, cannot be set permanently. | |||
| The PERMANENTFLAGS list can also include the special flag \*, | The PERMANENTFLAGS list can also include the special flag \*, | |||
| which indicates that it is possible to create new keywords by | which indicates that it is possible to create new keywords by | |||
| attempting to store those keywords in the mailbox. | attempting to store those keywords in the mailbox. | |||
| If the client attempts to STORE a flag that is not in the PERMANENTFLAG S | If the client attempts to STORE a flag that is not in the PERMANENTFLAG S | |||
| list, the server will either ignore the change or store the | list, the server will either ignore the change or store the | |||
| state change for the remainder of the current session only. | state change for the remainder of the current session only. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| There is no need for a server that included the special flag \* | There is no need for a server that included the special flag \* | |||
| to return a new PERMANENTFLAGS response code when a new keyword | to return a new PERMANENTFLAGS response code when a new keyword | |||
| was successfully set on a message upon client request. | was successfully set on a message upon client request. | |||
| However if the server has a limit on the number of different keywords | However, if the server has a limit on the number of different keywords | |||
| that can be stored in a mailbox and that limit is reached, | that can be stored in a mailbox and that limit is reached, | |||
| the server MUST send a new PERMANENTFLAGS response code | the server <bcp14>MUST</bcp14> send a new PERMANENTFLAGS response code | |||
| without the special flag \*. | without the special flag \*. | |||
| </t> | </t></dd> | |||
| </list> | ||||
| </t> | ||||
| <t hangText='PRIVACYREQUIRED'> | ||||
| <iref item='PRIVACYREQUIRED (response code)'/> | ||||
| <list> | <dt>PRIVACYREQUIRED</dt> | |||
| <t> | <dd><t><iref item="PRIVACYREQUIRED (response code)" subitem="" primary | |||
| ="false"/> | ||||
| The operation is not permitted due to a lack of data confidentiality. | The operation is not permitted due to a lack of data confidentiality. | |||
| If Transport Layer Security (TLS) is not in use, the client could | If TLS is not in use, the client could | |||
| try STARTTLS (see <xref target='STARTTLS'/>) or alternatively | try STARTTLS (see <xref target="STARTTLS" format="default"/>) or altern | |||
| reconnect on Implicit TLS port, and then repeat | atively | |||
| reconnect on an Implicit TLS port, and then repeat | ||||
| the operation. | the operation. | |||
| </t> | </t> | |||
| <sourcecode type=""> | ||||
| C: d login "fred" "foo" | ||||
| S: d NO [PRIVACYREQUIRED] Connection offers no privacy | ||||
| </sourcecode> | ||||
| <t> | <sourcecode type=""> | |||
| C: d login "fred" "foo"<vspace/> | C: d select inbox | |||
| S: d NO [PRIVACYREQUIRED] Connection offers no privacy<vspace/> | S: d NO [PRIVACYREQUIRED] Connection offers no privacy | |||
| </t> | </sourcecode> | |||
| </dd> | ||||
| <t> | ||||
| C: d select inbox<vspace/> | ||||
| S: d NO [PRIVACYREQUIRED] Connection offers no privacy | ||||
| </t> | ||||
| </list> | ||||
| </t> | ||||
| <t hangText='READ-ONLY'> | ||||
| <iref item='READ-ONLY (response code)'/> | ||||
| <list> | ||||
| <t> | ||||
| The mailbox is selected read-only, or its access while selected | ||||
| has changed from read-write to read-only.</t> | ||||
| </list> | ||||
| </t> | ||||
| <t hangText='READ-WRITE'> | ||||
| <iref item='READ-WRITE (response code)'/> | ||||
| <list> | <dt>READ-ONLY</dt> | |||
| <t> | <dd><iref item="READ-ONLY (response code)" subitem="" primary="false"/ | |||
| The mailbox is selected read-write, or its access while | > | |||
| selected has changed from read-only to read-write.</t> | The mailbox is selected as read-only, or its access while selected | |||
| </list> | has changed from read-write to read-only.</dd> | |||
| </t> | ||||
| <t hangText='SERVERBUG'> | <dt>READ-WRITE</dt> | |||
| <iref item='SERVERBUG (response code)'/> | <dd><iref item="READ-WRITE (response code)" subitem="" primary="false" | |||
| /> | ||||
| The mailbox is selected as read-write, or its access while | ||||
| selected has changed from read-only to read-write.</dd> | ||||
| <list> | <dt>SERVERBUG</dt> | |||
| <t> | <dd><t><iref item="SERVERBUG (response code)" subitem="" primary="fals | |||
| e"/> | ||||
| The server encountered a bug in itself or violated one of its | The server encountered a bug in itself or violated one of its | |||
| own invariants. | own invariants. | |||
| </t> | </t> | |||
| <sourcecode type=""> | ||||
| C: j select "/archive/projects/experiment-iv" | ||||
| S: j NO [SERVERBUG] This should not happen | ||||
| </sourcecode> | ||||
| </dd> | ||||
| <t> | <dt>TRYCREATE</dt> | |||
| C: j select "/archive/projects/experiment-iv"<vspace/> | <dd><iref item="TRYCREATE (response code)" subitem="" primary="false"/ | |||
| S: j NO [SERVERBUG] This should not happen | > | |||
| </t> | An APPEND, COPY, or MOVE attempt is failing because the target mailbox | |||
| </list> | ||||
| </t> | ||||
| <t hangText='TRYCREATE'> | ||||
| <iref item='TRYCREATE (response code)'/> | ||||
| <list> | ||||
| <t> | ||||
| An APPEND, COPY or MOVE attempt is failing because the target mailbox | ||||
| does not exist (as opposed to some other reason). This is a | does not exist (as opposed to some other reason). This is a | |||
| hint to the client that the operation can succeed if the | hint to the client that the operation can succeed if the | |||
| mailbox is first created by the CREATE command.</t> | mailbox is first created by the CREATE command.</dd> | |||
| </list> | ||||
| </t> | ||||
| <t hangText='UIDNEXT'> | ||||
| <iref item='UIDNEXT (response code)'/> | ||||
| <list> | ||||
| <t> | ||||
| Followed by a decimal number, indicates the next unique | ||||
| identifier value. Refer to <xref target='uid-def'/> for more | ||||
| information.</t> | ||||
| </list> | ||||
| </t> | ||||
| <t hangText='UIDNOTSTICKY'> | <dt>UIDNEXT</dt> | |||
| <iref item='UIDNOTSTICKY (response code)'/> | <dd><iref item="UIDNEXT (response code)" subitem="" primary="false"/> | |||
| Followed by a decimal number and indicates the next unique | ||||
| identifier value. Refer to <xref target="uid-def" format="default"/> f | ||||
| or more | ||||
| information.</dd> | ||||
| <list> | <dt>UIDNOTSTICKY</dt> | |||
| <t> | <dd><t><iref item="UIDNOTSTICKY (response code)" subitem="" primary="f | |||
| alse"/> | ||||
| The selected mailbox is supported by a mail store that does not | The selected mailbox is supported by a mail store that does not | |||
| support persistent UIDs; that is, UIDVALIDITY will be different | support persistent UIDs; that is, UIDVALIDITY will be different | |||
| each time the mailbox is selected. Consequently, APPEND or COPY | each time the mailbox is selected. Consequently, APPEND or COPY | |||
| to this mailbox will not return an APPENDUID or COPYUID response | to this mailbox will not return an APPENDUID or COPYUID response | |||
| code.</t> | code.</t> | |||
| <t>This response code is returned in an untagged NO response to the | <t>This response code is returned in an untagged NO response to th e | |||
| SELECT command.</t> | SELECT command.</t> | |||
| <t> | <t indent="3"> | |||
| <list> | Note: servers <bcp14>SHOULD NOT</bcp14> have any UIDNOTSTICKY ma | |||
| <t> | il stores. | |||
| Note: servers SHOULD NOT have any UIDNOTSTICKY mail stores. | ||||
| This facility exists to support legacy mail stores in which it | This facility exists to support legacy mail stores in which it | |||
| is technically infeasible to support persistent UIDs. This | is technically infeasible to support persistent UIDs. This | |||
| should be avoided when designing new mail stores. | should be avoided when designing new mail stores. | |||
| </t> | </t> | |||
| </list> | </dd> | |||
| </t> | ||||
| </list> | ||||
| </t> | ||||
| <t hangText='UIDVALIDITY'> | ||||
| <iref item='UIDVALIDITY (response code)'/> | ||||
| <list> | ||||
| <t> | ||||
| Followed by a decimal number, indicates the unique identifier | ||||
| validity value. Refer to <xref target='uid-def'/> for more information | ||||
| .</t> | ||||
| </list> | ||||
| </t> | ||||
| <t hangText='UNAVAILABLE'> | <dt>UIDVALIDITY</dt> | |||
| <iref item='UNAVAILABLE (response code)'/> | <dd><iref item="UIDVALIDITY (response code)" subitem="" primary="false | |||
| "/> | ||||
| Followed by a decimal number and indicates the unique identifier | ||||
| validity value. Refer to <xref target="uid-def" format="default"/> fo | ||||
| r more information.</dd> | ||||
| <list> | <dt>UNAVAILABLE</dt> | |||
| <t> | <dd><t><iref item="UNAVAILABLE (response code)" subitem="" primary="fa | |||
| lse"/> | ||||
| Temporary failure because a subsystem is down. For example, an | Temporary failure because a subsystem is down. For example, an | |||
| IMAP server that uses a Lightweight Directory Access Protocol | IMAP server that uses a Lightweight Directory Access Protocol | |||
| (LDAP) or Radius server for authentication might use this | (LDAP) or Radius server for authentication might use this | |||
| response code when the LDAP/Radius server is down. | response code when the LDAP/Radius server is down. | |||
| </t> | </t> | |||
| <sourcecode type=""> | ||||
| C: a LOGIN "fred" "foo" | ||||
| S: a NO [UNAVAILABLE] User's backend down for maintenance | ||||
| </sourcecode> | ||||
| </dd> | ||||
| <t> | <dt>UNKNOWN-CTE</dt> | |||
| C: a LOGIN "fred" "foo"<vspace/> | <dd><iref item="UNKNOWN-CTE (response code)" subitem="" primary="false | |||
| S: a NO [UNAVAILABLE] User's backend down for maintenance | "/> | |||
| </t> | ||||
| </list> | ||||
| </t> | ||||
| <t hangText='UNKNOWN-CTE'> | ||||
| <iref item='UNKNOWN-CTE (response code)'/> | ||||
| <list> | ||||
| <t> | ||||
| The server does not know how to decode the section's Content-Transfer-E ncoding. | The server does not know how to decode the section's Content-Transfer-E ncoding. | |||
| </t> | </dd> | |||
| </dl> | ||||
| <!-- | ||||
| <t> | ||||
| </t> | ||||
| --> | ||||
| </list> | ||||
| </t> | ||||
| </list> | ||||
| </t> | ||||
| <t> | ||||
| <!--Removed this: | ||||
| Additional response codes defined by particular client or server | ||||
| implementations SHOULD be prefixed with an "X" until they are | ||||
| added to a revision of this protocol.--> | ||||
| Client implementations MUST ignore response codes that they do not recogni | ||||
| ze. | ||||
| </t> | ||||
| <section title='OK Response'> | ||||
| <iref item='OK (response)'/> | ||||
| <t> | ||||
| <list style='hanging' hangIndent='12'> | ||||
| <t hangText='Contents:'>OPTIONAL response code<vspace/> | ||||
| human-readable text</t> | ||||
| </list> | ||||
| </t> | ||||
| <t> | <t> | |||
| Client implementations <bcp14>MUST</bcp14> ignore response codes that they | ||||
| do not recognize. | ||||
| </t> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>OK Response</name> | ||||
| <iref item="OK (response)" subitem="" primary="false"/> | ||||
| <dl newline="false" spacing="compact" indent="12"> | ||||
| <dt>Contents:</dt> | ||||
| <dd> | ||||
| <ul spacing="compact" empty="true" bare="true"> | ||||
| <li><bcp14>OPTIONAL</bcp14> response code</li> | ||||
| <li>human-readable text</li> | ||||
| </ul> | ||||
| </dd> | ||||
| </dl> | ||||
| <t> | ||||
| The OK response indicates an information message from the server. | The OK response indicates an information message from the server. | |||
| When tagged, it indicates successful completion of the associated | When tagged, it indicates successful completion of the associated | |||
| command. The human-readable text MAY be presented to the user as | command. The human-readable text <bcp14>MAY</bcp14> be presented to the u ser as | |||
| an information message. The untagged form indicates an | an information message. The untagged form indicates an | |||
| information-only message; the nature of the information MAY be | information-only message; the nature of the information <bcp14>MAY</bcp14> be | |||
| indicated by a response code. | indicated by a response code. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The untagged form is also used as one of three possible greetings | The untagged form is also used as one of three possible greetings | |||
| at connection startup. It indicates that the connection is not | at connection startup. It indicates that the connection is not | |||
| yet authenticated and that a LOGIN or an AUTHENTICATE command is needed. | yet authenticated and that a LOGIN or an AUTHENTICATE command is needed. | |||
| </t> | </t> | |||
| <figure><artwork> | ||||
| Example: S: * OK IMAP4rev2 server ready | ||||
| C: A001 LOGIN fred blurdybloop | ||||
| S: * OK [ALERT] System shutdown in 10 minutes | ||||
| S: A001 OK LOGIN Completed | ||||
| </artwork></figure> | ||||
| </section> | ||||
| <section title='NO Response'> | ||||
| <iref item='NO (response)'/> | ||||
| <t> | ||||
| <list style='hanging' hangIndent='12'> | ||||
| <t hangText='Contents:'>OPTIONAL response code<vspace/> | ||||
| human-readable text</t> | ||||
| </list> | ||||
| </t> | ||||
| <t> | <t> | |||
| Example: | ||||
| </t> | ||||
| <sourcecode type=""> | ||||
| S: * OK IMAP4rev2 server ready | ||||
| C: A001 LOGIN fred blurdybloop | ||||
| S: * OK [ALERT] System shutdown in 10 minutes | ||||
| S: A001 OK LOGIN Completed | ||||
| </sourcecode> | ||||
| </section> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>NO Response</name> | ||||
| <iref item="NO (response)" subitem="" primary="false"/> | ||||
| <dl newline="false" spacing="compact" indent="12"> | ||||
| <dt>Contents:</dt> | ||||
| <dd> | ||||
| <ul spacing="compact" empty="true" bare="true"> | ||||
| <li><bcp14>OPTIONAL</bcp14> response code</li> | ||||
| <li> | ||||
| human-readable text</li> | ||||
| </ul> | ||||
| </dd> | ||||
| </dl> | ||||
| <t> | ||||
| The NO response indicates an operational error message from the | The NO response indicates an operational error message from the | |||
| server. When tagged, it indicates unsuccessful completion of the | server. When tagged, it indicates unsuccessful completion of the | |||
| associated command. The untagged form indicates a warning; the | associated command. The untagged form indicates a warning; the | |||
| command can still complete successfully. The human-readable text | command can still complete successfully. The human-readable text | |||
| describes the condition. | describes the condition. | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | Example: | |||
| Example: C: A222 COPY 1:2 owatagusiam | </t> | |||
| S: * NO Disk is 98% full, please delete unnecessary data | <sourcecode type=""> | |||
| S: A222 OK COPY completed | C: A222 COPY 1:2 owatagusiam | |||
| C: A223 COPY 3:200 blurdybloop | S: * NO Disk is 98% full, please delete unnecessary data | |||
| S: * NO Disk is 98% full, please delete unnecessary data | S: A222 OK COPY completed | |||
| S: * NO Disk is 99% full, please delete unnecessary data | C: A223 COPY 3:200 blurdybloop | |||
| S: A223 NO COPY failed: disk is full | S: * NO Disk is 98% full, please delete unnecessary data | |||
| </artwork></figure> | S: * NO Disk is 99% full, please delete unnecessary data | |||
| S: A223 NO COPY failed: disk is full | ||||
| </section> | </sourcecode> | |||
| </section> | ||||
| <section title='BAD Response'> | <section numbered="true" toc="default"> | |||
| <iref item='BAD (response)'/> | <name>BAD Response</name> | |||
| <iref item="BAD (response)" subitem="" primary="false"/> | ||||
| <t> | <dl newline="false" spacing="normal" indent="12"> | |||
| <list style='hanging' hangIndent='12'> | <dt>Contents:</dt> | |||
| <t hangText='Contents:'>OPTIONAL response code<vspace/> | <dd> | |||
| human-readable text</t> | <ul spacing="compact" empty="true" bare="true"> | |||
| </list> | <li><bcp14>OPTIONAL</bcp14> response code</li> | |||
| </t> | <li>human-readable text</li> | |||
| </ul> | ||||
| <t> | </dd> | |||
| </dl> | ||||
| <t> | ||||
| The BAD response indicates an error message from the server. When | The BAD response indicates an error message from the server. When | |||
| tagged, it reports a protocol-level error in the client's command; | tagged, it reports a protocol-level error in the client's command; | |||
| the tag indicates the command that caused the error. The untagged | the tag indicates the command that caused the error. The untagged | |||
| form indicates a protocol-level error for which the associated | form indicates a protocol-level error for which the associated | |||
| command can not be determined; it can also indicate an internal | command can not be determined; it can also indicate an internal | |||
| server failure. The human-readable text describes the condition. | server failure. The human-readable text describes the condition. | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | Example: | |||
| Example: C: ...very long command line... | </t> | |||
| S: * BAD Command line too long | <sourcecode type=""> | |||
| C: ...empty line... | C: ...very long command line... | |||
| S: * BAD Empty command line | S: * BAD Command line too long | |||
| C: A443 EXPUNGE | C: ...empty line... | |||
| S: * BAD Disk crash, attempting salvage to a new disk! | S: * BAD Empty command line | |||
| S: * OK Salvage successful, no data lost | C: A443 EXPUNGE | |||
| S: A443 OK Expunge completed | S: * BAD Disk crash, attempting salvage to a new disk! | |||
| </artwork></figure> | S: * OK Salvage successful, no data lost | |||
| S: A443 OK Expunge completed | ||||
| </section> | </sourcecode> | |||
| </section> | ||||
| <section title='PREAUTH Response' anchor='preauth-resp'> | <section anchor="preauth-resp" numbered="true" toc="default"> | |||
| <iref item='PREAUTH (response)'/> | <name>PREAUTH Response</name> | |||
| <iref item="PREAUTH (response)" subitem="" primary="false"/> | ||||
| <t> | <dl newline="false" spacing="normal" indent="12"> | |||
| <list style='hanging' hangIndent='12'> | <dt>Contents:</dt> | |||
| <t hangText='Contents:'>OPTIONAL response code<vspace/> | <dd> | |||
| human-readable text</t> | <ul spacing="compact" empty="true" bare="true"> | |||
| </list> | <li><bcp14>OPTIONAL</bcp14> response code</li> | |||
| </t> | <li>human-readable text</li> | |||
| </ul> | ||||
| <t> | </dd> | |||
| The PREAUTH response is always untagged, and is one of three | </dl> | |||
| <t> | ||||
| The PREAUTH response is always untagged and is one of three | ||||
| possible greetings at connection startup. It indicates that the | possible greetings at connection startup. It indicates that the | |||
| connection has already been authenticated by external means; thus | connection has already been authenticated by external means; thus, | |||
| no LOGIN/AUTHENTICATE command is needed. | no LOGIN/AUTHENTICATE command is needed. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| <!--////Explain that injected (by an attacker) PREAUTH can force a naive cl | ||||
| ient | ||||
| to send data in cleartext (because this bypasses STARTTLS).--> | ||||
| Because PREAUTH moves the connection directly to the authenticated state, | Because PREAUTH moves the connection directly to the authenticated state, | |||
| it effectively prevents the client from using the STARTTLS command <xref ta | it effectively prevents the client from using the STARTTLS command (<xref t | |||
| rget='STARTTLS'/>. | arget="STARTTLS" format="default"/>). | |||
| For this reason PREAUTH response SHOULD only be returned by servers | For this reason, the PREAUTH response <bcp14>SHOULD</bcp14> only be returne | |||
| on connections that are protected by TLS (such as on implicit TLS port <xre | d by servers | |||
| f target='RFC8314'/>) or | on connections that are protected by TLS (such as on an Implicit TLS port < | |||
| protected through other means such as IPSec.<!--Mention loopback or the lik | xref target="RFC8314" format="default"/>) or | |||
| e?--> | protected through other means such as IPsec. | |||
| Clients that require mandatory TLS MUST close the connection after receivin | Clients that require mandatory TLS <bcp14>MUST</bcp14> close the connection | |||
| g PREAUTH response | after receiving the PREAUTH response on a non-protected port. | |||
| on a non protected port. | </t> | |||
| </t> | <t> | |||
| Example: | ||||
| <figure><artwork> | </t> | |||
| Example: S: * PREAUTH IMAP4rev2 server logged in as Smith | <sourcecode type=""> | |||
| </artwork></figure> | S: * PREAUTH IMAP4rev2 server logged in as Smith | |||
| </sourcecode> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title='BYE Response'> | <name>BYE Response</name> | |||
| <iref item='BYE (response)'/> | <iref item="BYE (response)" subitem="" primary="false"/> | |||
| <dl newline="false" spacing="normal" indent="12"> | ||||
| <t> | <dt>Contents:</dt> | |||
| <list style='hanging' hangIndent='12'> | <dd> | |||
| <t hangText='Contents:'>OPTIONAL response code<vspace/> | <ul spacing="compact" empty="true" bare="true"> | |||
| human-readable text</t> | <li><bcp14>OPTIONAL</bcp14> response code</li> | |||
| </list> | <li>human-readable text</li> | |||
| </t> | </ul> | |||
| </dd> | ||||
| <t> | </dl> | |||
| The BYE response is always untagged, and indicates that the server | <t> | |||
| is about to close the connection. The human-readable text MAY be | The BYE response is always untagged and indicates that the server | |||
| is about to close the connection. The human-readable text <bcp14>MAY</bcp | ||||
| 14> be | ||||
| displayed to the user in a status report by the client. The BYE | displayed to the user in a status report by the client. The BYE | |||
| response is sent under one of four conditions: | response is sent under one of four conditions: | |||
| <list style='numbers'> | </t> | |||
| <t> | <ol spacing="normal" type="1"><li> | |||
| as part of a normal logout sequence. The server will close | as part of a normal logout sequence. The server will close | |||
| the connection after sending the tagged OK response to the | the connection after sending the tagged OK response to the | |||
| LOGOUT command. | LOGOUT command. | |||
| </t> | </li> | |||
| <li> | ||||
| <t> | ||||
| as a panic shutdown announcement. The server closes the | as a panic shutdown announcement. The server closes the | |||
| connection immediately. | connection immediately. | |||
| </t> | </li> | |||
| <li> | ||||
| <t> | ||||
| as an announcement of an inactivity autologout. The server | as an announcement of an inactivity autologout. The server | |||
| closes the connection immediately. | closes the connection immediately. | |||
| </t> | </li> | |||
| <li> | ||||
| <t> | ||||
| as one of three possible greetings at connection startup, | as one of three possible greetings at connection startup, | |||
| indicating that the server is not willing to accept a | indicating that the server is not willing to accept a | |||
| connection from this client. The server closes the | connection from this client. The server closes the | |||
| connection immediately. | connection immediately. | |||
| </t> | </li> | |||
| </list> | </ol> | |||
| </t> | <t> | |||
| <t> | ||||
| The difference between a BYE that occurs as part of a normal | The difference between a BYE that occurs as part of a normal | |||
| LOGOUT sequence (the first case) and a BYE that occurs because of | LOGOUT sequence (the first case) and a BYE that occurs because of | |||
| a failure (the other three cases) is that the connection closes | a failure (the other three cases) is that the connection closes | |||
| immediately in the failure case. In all cases the client SHOULD | immediately in the failure case. In all cases, the client <bcp14>SHOULD</ bcp14> | |||
| continue to read response data from the server until the | continue to read response data from the server until the | |||
| connection is closed; this will ensure that any pending untagged | connection is closed; this will ensure that any pending untagged | |||
| or completion responses are read and processed. | or completion responses are read and processed. | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | Example: | |||
| Example: S: * BYE Autologout; idle for too long | </t> | |||
| </artwork></figure> | <sourcecode type=""> | |||
| S: * BYE Autologout; idle for too long | ||||
| </sourcecode> | ||||
| </section> | ||||
| </section> | </section> | |||
| <section anchor="server-status-capabilities" numbered="true" toc="default" | ||||
| </section> | > | |||
| <name>Server Responses - Server Status</name> | ||||
| <section title='Server Responses - Server Status' anchor='server-status-capa | <t> | |||
| bilities'> | ||||
| <t> | ||||
| These responses are always untagged. This is how server | These responses are always untagged. This is how server | |||
| status data are transmitted from the server to the client. | status data are transmitted from the server to the client. | |||
| </t> | </t> | |||
| <section anchor="enabled" numbered="true" toc="default"> | ||||
| <section title='ENABLED Response' anchor='enabled'> | <name>ENABLED Response</name> | |||
| <dl newline="false" spacing="normal" indent="12"> | ||||
| <t> | <dt>Contents:</dt> | |||
| <list style='hanging' hangIndent='12'> | <dd>capability listing</dd> | |||
| <t hangText='Contents:'>capability listing</t> | </dl> | |||
| </list> | <t> | |||
| </t> | ||||
| <t> | ||||
| The ENABLED response occurs as a result of an ENABLE command. The | The ENABLED response occurs as a result of an ENABLE command. The | |||
| capability listing contains a space-separated listing of capability | capability listing contains a space-separated listing of capability | |||
| names that the server supports and that were successfully enabled. | names that the server supports and that were successfully enabled. | |||
| The ENABLED response may contain no capabilities, which means that no | The ENABLED response may contain no capabilities, which means that no | |||
| extensions listed by the client were successfully enabled. | extensions listed by the client were successfully enabled. | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | Example: | |||
| Example: S: * ENABLED CONDSTORE QRESYNC | </t> | |||
| </artwork></figure> | <sourcecode type=""> | |||
| S: * ENABLED CONDSTORE QRESYNC | ||||
| </section> | </sourcecode> | |||
| </section> | ||||
| <section title='CAPABILITY Response' anchor='capability-resp'> | <section anchor="capability-resp" numbered="true" toc="default"> | |||
| <iref item='CAPABILITY (response)'/> | <name>CAPABILITY Response</name> | |||
| <iref item="CAPABILITY (response)" subitem="" primary="false"/> | ||||
| <t> | <dl newline="false" spacing="normal" indent="12"> | |||
| <list style='hanging' hangIndent='12'> | <dt>Contents:</dt> | |||
| <t hangText='Contents:'>capability listing</t> | <dd>capability listing</dd> | |||
| </list> | </dl> | |||
| </t> | <t> | |||
| <t> | ||||
| The CAPABILITY response occurs as a result of a CAPABILITY | The CAPABILITY response occurs as a result of a CAPABILITY | |||
| command. The capability listing contains a space-separated | command. The capability listing contains a space-separated | |||
| listing of capability names that the server supports. The | listing of capability names that the server supports. The | |||
| capability listing MUST include the atom "IMAP4rev2", | capability listing <bcp14>MUST</bcp14> include the atom "IMAP4rev2", | |||
| but note that it doesn't have to be the first capability listed. | but note that it doesn't have to be the first capability listed. | |||
| The order of capability names has no significance. | The order of capability names has no significance. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Client and server implementations <bcp14>MUST</bcp14> implement the capabi | |||
| In addition, client and server implementations MUST implement the | lities | |||
| "STARTTLS" and "LOGINDISABLED" (only on the cleartext port), and "AUTH=PLA | "AUTH=PLAIN" (described in <xref target="RFC4616" format="default"/>), | |||
| IN" (described in <xref target='PLAIN'/>) | and <bcp14>MUST</bcp14> implement "STARTTLS" and "LOGINDISABLED" on the cl | |||
| capabilities. See the Security Considerations (<xref target='sec-cons'/>) | eartext port. | |||
| for | See the Security Considerations (<xref target="sec-cons" format="default"/ | |||
| >) for | ||||
| important information related to these capabilities. | important information related to these capabilities. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | A capability name that begins with "AUTH=" indicates that the | |||
| A capability name which begins with "AUTH=" indicates that the | server supports that particular authentication mechanism <xref target="RFC | |||
| server supports that particular authentication mechanism <xref target='SAS | 4422" format="default"/>. | |||
| L'/>. | </t> | |||
| </t> | <t> | |||
| <t> | ||||
| The LOGINDISABLED capability indicates that the LOGIN command is | The LOGINDISABLED capability indicates that the LOGIN command is | |||
| disabled, and that the server will respond with a tagged NO | disabled, and that the server will respond with a tagged NO | |||
| response to any attempt to use the LOGIN command even if the user | response to any attempt to use the LOGIN command even if the user | |||
| name and password are valid. An IMAP client MUST NOT issue the | name and password are valid (their validity will not be checked). | |||
| An IMAP client <bcp14>MUST NOT</bcp14> issue the | ||||
| LOGIN command if the server advertises the LOGINDISABLED | LOGIN command if the server advertises the LOGINDISABLED | |||
| capability. | capability. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| Other capability names indicate that the server supports an | Other capability names indicate that the server supports an | |||
| extension, revision, or amendment to the IMAP4rev2 protocol. | extension, revision, or amendment to the IMAP4rev2 protocol. | |||
| If IMAP4rev1 capability is not advertised, server responses | If IMAP4rev1 capability is not advertised, server responses | |||
| MUST conform to this document until the client | <bcp14>MUST</bcp14> conform to this document until the client | |||
| issues a command that uses the associated capability. | issues a command that uses an additional capability. | |||
| If both IMAP4rev1 and IMAP4rev2 capabilities are advertised, | If both IMAP4rev1 and IMAP4rev2 capabilities are advertised, | |||
| server responses MUST conform to RFC 3501 until the client | server responses <bcp14>MUST</bcp14> conform to <xref target="RFC3501" for | |||
| issues a command that uses the associated capability. | mat="default"/> until the client | |||
| issues a command that uses an additional capability. | ||||
| (For example, the client can issue ENABLE IMAP4rev2 to | (For example, the client can issue ENABLE IMAP4rev2 to | |||
| enable IMAP4rev2 specific behaviour). | enable IMAP4rev2-specific behavior.) | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Capability names <bcp14>SHOULD</bcp14> be registered with IANA using the R | |||
| Capability names SHOULD be registered with IANA using RFC Required policy. | FC Required policy <xref target="RFC8126" format="default"/>. | |||
| A server SHOULD NOT offer unregistered capability names. | A server <bcp14>SHOULD NOT</bcp14> offer unregistered capability names. | |||
| <!--"In particular, implementation defined capabilities SHOULD be register | </t> | |||
| ed | <t> | |||
| in Independent Stream or IETF Informational/Experimental RFC."--> | Client implementations <bcp14>SHOULD NOT</bcp14> require any capability na | |||
| </t> | me | |||
| <t> | ||||
| Client implementations SHOULD NOT require any capability name | ||||
| other than "IMAP4rev2", and possibly "STARTTLS" and "LOGINDISABLED" | other than "IMAP4rev2", and possibly "STARTTLS" and "LOGINDISABLED" | |||
| (on a cleartext port). | (on a cleartext port). | |||
| Client implementations MUST ignore any unknown capability | Client implementations <bcp14>MUST</bcp14> ignore any unknown capability | |||
| names. | names. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | A server <bcp14>MAY</bcp14> send capabilities automatically, by using the | |||
| A server MAY send capabilities automatically, by using the | CAPABILITY response code in the initial PREAUTH or OK responses | |||
| CAPABILITY response code in the initial PREAUTH or OK responses, | ||||
| and by sending an updated CAPABILITY response code in the tagged | and by sending an updated CAPABILITY response code in the tagged | |||
| OK response as part of a successful authentication. It is | OK response as part of a successful authentication. It is | |||
| unnecessary for a client to send a separate CAPABILITY command if | unnecessary for a client to send a separate CAPABILITY command if | |||
| it recognizes these automatic capabilities and there was no change to | it recognizes these automatic capabilities and there was no change to | |||
| the TLS and/or authentication state since they were received. | the TLS and/or authentication state since they were received. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | The list of capabilities returned by a server <bcp14>MAY</bcp14> change du | |||
| The list of capabilities returned by a server MAY change during the connec | ring the connection. | |||
| tion. | In particular, it is quite common for the server to change the list | |||
| In particular, it is quite common for the server to change list | ||||
| of capabilities after successful TLS negotiation (STARTTLS command) | of capabilities after successful TLS negotiation (STARTTLS command) | |||
| and/or after successful authentication (AUTHENTICATE or LOGIN commands). | and/or after successful authentication (AUTHENTICATE or LOGIN commands). | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | Example: | |||
| Example: S: * CAPABILITY STARTTLS AUTH=GSSAPI IMAP4rev2 LOGINDISABLED | </t> | |||
| XPIG-LATIN | <sourcecode type=""> | |||
| </artwork></figure> | S: * CAPABILITY STARTTLS AUTH=GSSAPI IMAP4rev2 LOGINDISABLED | |||
| XPIG-LATIN | ||||
| <t>Note that in the above example XPIG-LATIN is a fictitious capability name. | </sourcecode> | |||
| </t> | <t>Note that in the above example, XPIG-LATIN is a fictitious capabili | |||
| ty name.</t> | ||||
| </section> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| </section> | <name>Server Responses - Mailbox Status</name> | |||
| <t> | ||||
| <section title='Server Responses - Mailbox Status'> | ||||
| <t> | ||||
| These responses are always untagged. This is how mailbox | These responses are always untagged. This is how mailbox | |||
| status data are transmitted from the server to the client. Many of | status data are transmitted from the server to the client. Many of | |||
| these responses typically result from a command with the same name. | these responses typically result from a command with the same name. | |||
| </t> | </t> | |||
| <section anchor="list-resp" numbered="true" toc="default"> | ||||
| <section title='LIST Response' anchor='list-resp'> | <name>LIST Response</name> | |||
| <iref item='LIST (response)'/> | <iref item="LIST (response)" subitem="" primary="false"/> | |||
| <dl newline="false" spacing="normal" indent="12"> | ||||
| <t> | <dt>Contents:</dt> | |||
| <list style='hanging' hangIndent='12'> | <dd> | |||
| <t hangText='Contents:'>name attributes<vspace/> | <ul spacing="compact" empty="true" bare="true"> | |||
| hierarchy delimiter<vspace/> | <li>name attributes</li> | |||
| name<vspace/> | <li>hierarchy delimiter</li> | |||
| OPTIONAL extension data</t> | <li>name</li> | |||
| </list> | <li><bcp14>OPTIONAL</bcp14> extension data</li> | |||
| </t> | </ul> | |||
| </dd> | ||||
| <t> | </dl> | |||
| <t> | ||||
| The LIST response occurs as a result of a LIST command. It | The LIST response occurs as a result of a LIST command. It | |||
| returns a single name that matches the LIST specification. There | returns a single name that matches the LIST specification. There | |||
| can be multiple LIST responses for a single LIST command. | can be multiple LIST responses for a single LIST command. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The following base mailbox name attributes are defined: | The following base mailbox name attributes are defined: | |||
| <list style='hanging'> | </t> | |||
| <t hangText='\NonExistent'> | <dl newline="true" spacing="normal"> | |||
| <iref item='\NonExistent (mailbox name attribute)'/> | <dt>\NonExistent</dt> | |||
| <dd> | ||||
| <t><iref item="\NonExistent (mailbox name attribute)" subitem="" p | ||||
| rimary="false"/> | ||||
| The "\NonExistent" attribute indicates that a mailbox name does not | The "\NonExistent" attribute indicates that a mailbox name does not | |||
| refer to an existing mailbox. Note that this attribute is not | refer to an existing mailbox. Note that this attribute is not | |||
| meaningful by itself, as mailbox names that match the canonical LIST | meaningful by itself, as mailbox names that match the canonical LIST | |||
| pattern but don't exist must not be returned unless one of the two | pattern but don't exist must not be returned unless one of the two | |||
| conditions listed below is also satisfied: | conditions listed below is also satisfied: | |||
| <list style='numbers'> | </t> | |||
| <t>The mailbox name also satisfies the selection criteria (for | <ol spacing="normal" type="1"><li>The mailbox name also satisfies | |||
| the selection criteria (for | ||||
| example, it is subscribed and the "SUBSCRIBED" selection option | example, it is subscribed and the "SUBSCRIBED" selection option | |||
| has been specified).</t> | has been specified).</li> | |||
| <li>"RECURSIVEMATCH" has been specified, and the mailbox name ha | ||||
| <t>"RECURSIVEMATCH" has been specified, and the mailbox name has at | s at | |||
| least one descendant mailbox name that does not match the LIST | least one descendant mailbox name that does not match the LIST | |||
| pattern and does match the selection criteria.</t> | pattern and does match the selection criteria.</li> | |||
| </list> | </ol> | |||
| <t> | ||||
| In practice, this means that the "\NonExistent" attribute is usually | In practice, this means that the "\NonExistent" attribute is usually | |||
| returned with one or more of "\Subscribed", "\Remote", | returned with one or more of "\Subscribed", "\Remote", | |||
| "\HasChildren", or the CHILDINFO extended data item.<vspace blankLines= | "\HasChildren", or the CHILDINFO extended data item.</t> | |||
| "1"/> | <t> | |||
| The "\NonExistent" attribute implies "\NoSelect". | The "\NonExistent" attribute implies "\NoSelect". | |||
| <!--This is implied for all basic attributes: | </t> | |||
| The "\NonExistent" | </dd> | |||
| attribute MUST be supported and MUST be accurately computed. | <dt>\Noinferiors</dt> | |||
| --> | <dd> | |||
| </t> | <iref item="\Noinferiors (mailbox name attribute)" subitem="" prim | |||
| ary="false"/> | ||||
| <t hangText='\Noinferiors'> | ||||
| <iref item='\Noinferiors (mailbox name attribute)'/> | ||||
| It is not possible for any child levels of hierarchy to exist | It is not possible for any child levels of hierarchy to exist | |||
| under this name; no child levels exist now and none can be | under this name; no child levels exist now and none can be | |||
| created in the future.</t> | created in the future.</dd> | |||
| <dt>\Noselect</dt> | ||||
| <t hangText='\Noselect'> | <dd> | |||
| <iref item='\Noselect (mailbox name attribute)'/> | <iref item="\Noselect (mailbox name attribute)" subitem="" primary | |||
| It is not possible to use this name as a selectable mailbox.</t> | ="false"/> | |||
| It is not possible to use this name as a selectable mailbox.</dd> | ||||
| <t hangText='\HasChildren'> | <dt>\HasChildren</dt> | |||
| <iref item='\HasChildren (mailbox name attribute)'/> | <dd> | |||
| <iref item="\HasChildren (mailbox name attribute)" subitem="" prim | ||||
| ary="false"/> | ||||
| The presence of this attribute indicates that the mailbox has child | The presence of this attribute indicates that the mailbox has child | |||
| mailboxes. A server SHOULD NOT set this attribute if there are | mailboxes. A server <bcp14>SHOULD NOT</bcp14> set this attribute if th ere are | |||
| child mailboxes and the user does not have permission to access | child mailboxes and the user does not have permission to access | |||
| any of them. In this case, \HasNoChildren SHOULD be used. In | any of them. In this case, \HasNoChildren <bcp14>SHOULD</bcp14> be use d. In | |||
| many cases, however, a server may not be able to efficiently | many cases, however, a server may not be able to efficiently | |||
| compute whether a user has access to any child mailbox. Note | compute whether a user has access to any child mailboxes. Note | |||
| that even though the \HasChildren attribute for a mailbox must | that even though the \HasChildren attribute for a mailbox must | |||
| be correct at the time of processing of the mailbox, a client | be correct at the time of processing the mailbox, a client | |||
| must be prepared to deal with a situation when a mailbox is | must be prepared to deal with a situation when a mailbox is | |||
| marked with the \HasChildren attribute, but no child mailbox | marked with the \HasChildren attribute, but no child mailbox | |||
| appears in the response to the LIST command. This might happen, | appears in the response to the LIST command. This might happen, | |||
| for example, due to children mailboxes being deleted or made | for example, due to child mailboxes being deleted or made | |||
| inaccessible to the user (using access control) by another | inaccessible to the user (using access control) by another | |||
| client before the server is able to list them. | client before the server is able to list them. | |||
| </t> | </dd> | |||
| <dt>\HasNoChildren</dt> | ||||
| <t hangText='\HasNoChildren'> | <dd> | |||
| <iref item='\HasNoChildren (mailbox name attribute)'/> | <iref item="\HasNoChildren (mailbox name attribute)" subitem="" pr | |||
| imary="false"/> | ||||
| The presence of this attribute indicates that the mailbox has NO | The presence of this attribute indicates that the mailbox has NO | |||
| child mailboxes that are accessible to the currently | child mailboxes that are accessible to the currently | |||
| authenticated user. | authenticated user. | |||
| </t> | </dd> | |||
| <dt>\Marked</dt> | ||||
| <t hangText='\Marked'> | <dd> | |||
| <iref item='\Marked (mailbox name attribute)'/> | <iref item="\Marked (mailbox name attribute)" subitem="" primary=" | |||
| false"/> | ||||
| The mailbox has been marked "interesting" by the server; the | The mailbox has been marked "interesting" by the server; the | |||
| mailbox probably contains messages that have been added since | mailbox probably contains messages that have been added since | |||
| the last time the mailbox was selected.</t> | the last time the mailbox was selected.</dd> | |||
| <dt>\Unmarked</dt> | ||||
| <t hangText='\Unmarked'> | <dd> | |||
| <iref item='\Unmarked (mailbox name attribute)'/> | <iref item="\Unmarked (mailbox name attribute)" subitem="" primary | |||
| ="false"/> | ||||
| The mailbox does not contain any additional messages since the | The mailbox does not contain any additional messages since the | |||
| last time the mailbox was selected.</t> | last time the mailbox was selected.</dd> | |||
| <dt>\Subscribed</dt> | ||||
| <t hangText='\Subscribed'> | <dd> | |||
| <iref item='\Subscribed (mailbox name attribute)'/> | <iref item="\Subscribed (mailbox name attribute)" subitem="" prima | |||
| The mailbox name was subscribed to using the SUBSCRIBE command.</t> | ry="false"/> | |||
| The mailbox name was subscribed to using the SUBSCRIBE command.</dd> | ||||
| <t hangText='\Remote'> | <dt>\Remote</dt> | |||
| <iref item='\Remote (mailbox name attribute)'/> | <dd> | |||
| The mailbox is a remote mailbox.</t> | <iref item="\Remote (mailbox name attribute)" subitem="" primary=" | |||
| </list> | false"/> | |||
| The mailbox is a remote mailbox.</dd> | ||||
| </t> | </dl> | |||
| <t> | ||||
| <t> | ||||
| It is an error for the server to return both a \HasChildren and a | It is an error for the server to return both a \HasChildren and a | |||
| \HasNoChildren attribute in the same LIST response. A client that | \HasNoChildren attribute in the same LIST response. A client that | |||
| encounters a LIST response with both \HasChildren and \HasNoChildren | encounters a LIST response with both \HasChildren and \HasNoChildren | |||
| attributes present should act as if both are absent in the LIST response. | attributes present should act as if both are absent in the LIST response. | |||
| <list> | </t> | |||
| <t> | <t indent="3"> | |||
| Note: the \HasNoChildren attribute should not be confused with the | Note: the \HasNoChildren attribute should not be confused with the | |||
| \NoInferiors attribute, which indicates that no | \NoInferiors attribute, which indicates that no | |||
| child mailboxes exist now and none can be created in the future. | child mailboxes exist now and none can be created in the future. | |||
| </t> | </t> | |||
| </list> | ||||
| </t> | ||||
| <t> | <t> | |||
| If it is not feasible for the server to determine whether or not | If it is not feasible for the server to determine whether or not | |||
| the mailbox is "interesting", the server SHOULD NOT send either | the mailbox is "interesting", the server <bcp14>SHOULD NOT</bcp14> send ei | |||
| \Marked or \Unmarked. The server MUST NOT send more than one of | ther | |||
| \Marked, \Unmarked, and \Noselect for a single mailbox, and MAY | \Marked or \Unmarked. The server <bcp14>MUST NOT</bcp14> send more than o | |||
| ne of | ||||
| \Marked, \Unmarked, and \Noselect for a single mailbox, and it <bcp14>MAY< | ||||
| /bcp14> | ||||
| send none of these. | send none of these. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| In addition to the base mailbox name attributes defined above, | In addition to the base mailbox name attributes defined above, | |||
| an IMAP server MAY also include any or all of | an IMAP server <bcp14>MAY</bcp14> also include any or all of | |||
| the following attributes that denote "role" (or "special-use") of a mailbo x. | the following attributes that denote "role" (or "special-use") of a mailbo x. | |||
| These attributes are included along with base | These attributes are included along with base | |||
| attributes defined above. A given mailbox may | attributes defined above. A given mailbox may | |||
| have none, one, or more than one of these attributes. In some cases, | have none, one, or more than one of these attributes. In some cases, | |||
| a special use is advice to a client about what to put in that | a special use is advice to a client about what to put in that | |||
| mailbox. In other cases, it's advice to a client about what to | mailbox. In other cases, it's advice to a client about what to | |||
| expect to find there. | expect to find there. | |||
| <list style='hanging'> | </t> | |||
| <t hangText='\All'> | <dl newline="true" spacing="normal"> | |||
| <iref item='\All (mailbox name attribute)'/> | <dt>\All</dt> | |||
| <dd> | ||||
| <iref item="\All (mailbox name attribute)" subitem="" primary="fal | ||||
| se"/> | ||||
| This mailbox presents all messages in the user's message store. | This mailbox presents all messages in the user's message store. | |||
| Implementations MAY omit some messages, such as, perhaps, those | Implementations <bcp14>MAY</bcp14> omit some messages, such as, perhaps, those | |||
| in \Trash and \Junk. When this special use is supported, it is | in \Trash and \Junk. When this special use is supported, it is | |||
| almost certain to represent a virtual mailbox. | almost certain to represent a virtual mailbox. | |||
| </t> | </dd> | |||
| <dt>\Archive</dt> | ||||
| <t hangText='\Archive'> | <dd> | |||
| <iref item='\Archive (mailbox name attribute)'/> | <iref item="\Archive (mailbox name attribute)" subitem="" primary= | |||
| "false"/> | ||||
| This mailbox is used to archive messages. The meaning of an | This mailbox is used to archive messages. The meaning of an | |||
| "archival" mailbox is server-dependent; typically, it will be | "archival" mailbox is server dependent; typically, it will be | |||
| used to get messages out of the inbox, or otherwise keep them | used to get messages out of the inbox, or otherwise keep them | |||
| out of the user's way, while still making them accessible. | out of the user's way, while still making them accessible. | |||
| </t> | </dd> | |||
| <dt>\Drafts</dt> | ||||
| <t hangText='\Drafts'> | <dd> | |||
| <iref item='\Drafts (mailbox name attribute)'/> | <iref item="\Drafts (mailbox name attribute)" subitem="" primary=" | |||
| false"/> | ||||
| This mailbox is used to hold draft messages -- typically, | This mailbox is used to hold draft messages -- typically, | |||
| messages that are being composed but have not yet been sent. In | messages that are being composed but have not yet been sent. In | |||
| some server implementations, this might be a virtual mailbox, | some server implementations, this might be a virtual mailbox, | |||
| containing messages from other mailboxes that are marked with | containing messages from other mailboxes that are marked with | |||
| the "\Draft" message flag. Alternatively, this might just be | the "\Draft" message flag. Alternatively, this might just be | |||
| advice that a client put drafts here. | advice that a client put drafts here. | |||
| </t> | </dd> | |||
| <dt>\Flagged</dt> | ||||
| <t hangText='\Flagged'> | <dd> | |||
| <iref item='\Flagged (mailbox name attribute)'/> | <iref item="\Flagged (mailbox name attribute)" subitem="" primary= | |||
| "false"/> | ||||
| This mailbox presents all messages marked in some way as | This mailbox presents all messages marked in some way as | |||
| "important". When this special use is supported, it is likely | "important". When this special use is supported, it is likely | |||
| to represent a virtual mailbox collecting messages (from other | to represent a virtual mailbox collecting messages (from other | |||
| mailboxes) that are marked with the "\Flagged" message flag. | mailboxes) that are marked with the "\Flagged" message flag. | |||
| </t> | </dd> | |||
| <dt>\Junk</dt> | ||||
| <t hangText='\Junk'> | <dd> | |||
| <iref item='\Junk (mailbox name attribute)'/> | <iref item="\Junk (mailbox name attribute)" subitem="" primary="fa | |||
| lse"/> | ||||
| This mailbox is where messages deemed to be junk mail are held. | This mailbox is where messages deemed to be junk mail are held. | |||
| Some server implementations might put messages here | Some server implementations might put messages here | |||
| automatically. Alternatively, this might just be advice to a | automatically. Alternatively, this might just be advice to a | |||
| client-side spam filter. | client-side spam filter. | |||
| </t> | </dd> | |||
| <dt>\Sent</dt> | ||||
| <t hangText='\Sent'> | <dd> | |||
| <iref item='\Sent (mailbox name attribute)'/> | <iref item="\Sent (mailbox name attribute)" subitem="" primary="fa | |||
| lse"/> | ||||
| This mailbox is used to hold copies of messages that have been | This mailbox is used to hold copies of messages that have been | |||
| sent. Some server implementations might put messages here | sent. Some server implementations might put messages here | |||
| automatically. Alternatively, this might just be advice that a | automatically. Alternatively, this might just be advice that a | |||
| client save sent messages here. | client save sent messages here. | |||
| </t> | </dd> | |||
| <dt>\Trash</dt> | ||||
| <t hangText='\Trash'> | <dd> | |||
| <iref item='\Trash (mailbox name attribute)'/> | <iref item="\Trash (mailbox name attribute)" subitem="" primary="f | |||
| alse"/> | ||||
| This mailbox is used to hold messages that have been deleted or | This mailbox is used to hold messages that have been deleted or | |||
| marked for deletion. In some server implementations, this might | marked for deletion. In some server implementations, this might | |||
| be a virtual mailbox, containing messages from other mailboxes | be a virtual mailbox, containing messages from other mailboxes | |||
| that are marked with the "\Deleted" message flag. | that are marked with the "\Deleted" message flag. | |||
| Alternatively, this might just be advice that a client that | Alternatively, this might just be advice that a client that | |||
| chooses not to use the IMAP "\Deleted" model should use this as | chooses not to use the IMAP "\Deleted" model should use as | |||
| its trash location. In server implementations that strictly | its trash location. In server implementations that strictly | |||
| expect the IMAP "\Deleted" model, this special use is likely not | expect the IMAP "\Deleted" model, this special use is likely not | |||
| to be supported. | to be supported. | |||
| </t> | </dd> | |||
| </dl> | ||||
| </list> | ||||
| </t> | ||||
| <!-- | ||||
| For the extended list command [RFC5258], this extension adds a new | ||||
| capability string, a new selection option, and a new return option, | ||||
| all called "SPECIAL-USE". Supporting implementations MUST include | ||||
| the "SPECIAL-USE" capability string in response to an IMAP CAPABILITY | ||||
| command. If the client specifies the "SPECIAL-USE" selection option, | ||||
| the LIST command MUST return only those mailboxes that have a | ||||
| special-use attribute set. If the client specifies the "SPECIAL-USE" | ||||
| return option, the LIST command MUST return the new special-use | ||||
| attributes on those mailboxes that have them set. The "SPECIAL-USE" | ||||
| return option is implied by the "SPECIAL-USE" selection option. The | ||||
| extended LIST command MAY return SPECIAL-USE attributes even if the | ||||
| client does not specify the return option. | ||||
| <t> | <t> | |||
| All of special-use attributes are OPTIONAL, and any given server or | All special-use attributes are <bcp14>OPTIONAL</bcp14>, and any given serve r or | |||
| message store may support any combination of the attributes, or none | message store may support any combination of the attributes, or none | |||
| at all. In most cases, there will likely be at most one mailbox with | at all. In most cases, there will likely be at most one mailbox with | |||
| a given attribute for a given user, but in some server or message | a given attribute for a given user, but in some server or message | |||
| store implementations it might be possible for multiple mailboxes to | store implementations, it might be possible for multiple mailboxes to | |||
| have the same special-use attribute. | have the same special-use attribute. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Special-use attributes are likely to be user specific. User Adam | |||
| Special-use attributes are likely to be user-specific. User Adam | ||||
| might share his \Sent mailbox with user Barb, but that mailbox is | might share his \Sent mailbox with user Barb, but that mailbox is | |||
| unlikely to also serve as Barb's \Sent mailbox. | unlikely to also serve as Barb's \Sent mailbox. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| Other mailbox name attributes can be found in the "IMAP Mailbox Name Attrib utes" | Other mailbox name attributes can be found in the "IMAP Mailbox Name Attrib utes" | |||
| registry <xref target="IMAP-MAILBOX-NAME-ATTRS-REG"/>. | registry <xref target="IMAP-MAILBOX-NAME-ATTRS-REG" format="default"/>. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The hierarchy delimiter is a character used to delimit levels of | The hierarchy delimiter is a character used to delimit levels of | |||
| hierarchy in a mailbox name. A client can use it to create child | hierarchy in a mailbox name. A client can use it to create child | |||
| mailboxes, and to search higher or lower levels of naming | mailboxes and to search higher or lower levels of naming | |||
| hierarchy. All children of a top-level hierarchy node MUST use | hierarchy. All children of a top-level hierarchy node <bcp14>MUST</bcp14> | |||
| use | ||||
| the same separator character. A NIL hierarchy delimiter means | the same separator character. A NIL hierarchy delimiter means | |||
| that no hierarchy exists; the name is a "flat" name. | that no hierarchy exists; the name is a "flat" name. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | The name represents an unambiguous left-to-right hierarchy and | |||
| The name represents an unambiguous left-to-right hierarchy, and | <bcp14>MUST</bcp14> be valid for use as a reference in LIST command. | |||
| MUST be valid for use as a reference in LIST command. | Unless \Noselect or \NonExistent is indicated, the name <bcp14>MUST</bcp14 | |||
| Unless \Noselect or \NonExistent is indicated, the name MUST also be valid | > also be valid as an | |||
| as an | ||||
| argument for commands, such as SELECT, that accept mailbox names. | argument for commands, such as SELECT, that accept mailbox names. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | The name might be followed by an <bcp14>OPTIONAL</bcp14> series of extende | |||
| The name might be followed by an OPTIONAL series of extended fields, | d fields, | |||
| a parenthesized list of tagged data (also referred to as "extended data it | a parenthesized list of tagged data (also referred to as an "extended data | |||
| em"). | item"). | |||
| The first element of an extended field is a string, which identifies the t ype of | The first element of an extended field is a string, which identifies the t ype of | |||
| data. <xref target="RFC5258"/> specified requirements on string registrat | data. <xref target="RFC5258" format="default"/> specifies requirements on | |||
| ion | string registration | |||
| (which are called "tags" there; such tags are not to be confused with IMAP | (which are called "tags"; such tags are not to be confused with IMAP comma | |||
| command tags), | nd tags); | |||
| in particular it said that "Tags MUST be registered with IANA". This docum | in particular, it states that "Tags <bcp14>MUST</bcp14> be registered with | |||
| ent doesn't | IANA". This document doesn't | |||
| change that. See Section 9.5 of <xref target="RFC5258"/> for the registrat | change that. See <xref target="RFC5258" sectionFormat="of" section="9.5"/> | |||
| ion template. | for the registration template. | |||
| The server MAY return data in the extended fields that was not directly so licited by the | The server <bcp14>MAY</bcp14> return data in the extended fields that was not directly solicited by the | |||
| client in the corresponding LIST command. For example, the client | client in the corresponding LIST command. For example, the client | |||
| can enable extra extended fields by using another IMAP extension that | can enable extra extended fields by using another IMAP extension that | |||
| make use of the extended LIST responses. The client MUST ignore all | makes use of the extended LIST responses. The client <bcp14>MUST</bcp14> ignore all | |||
| extended fields it doesn't recognize. | extended fields it doesn't recognize. | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | Example: | |||
| Example: S: * LIST (\Noselect) "/" ~/Mail/foo | </t> | |||
| </artwork></figure> | <sourcecode type=""> | |||
| S: * LIST (\Noselect) "/" ~/Mail/foo | ||||
| <figure><artwork> | </sourcecode> | |||
| Example: S: * LIST (\Marked) ":" Tables (tablecloth (("edge" "lacy") | <t> | |||
| ("color" "red")) Sample "text") | Example: | |||
| S: * LIST () ":" Tables:new (tablecloth ("edge" "lacy") | </t> | |||
| Sample ("text" "more text")) | <sourcecode type=""> | |||
| </artwork></figure> | S: * LIST (\Marked) ":" Tables (tablecloth (("edge" "lacy") | |||
| ("color" "red")) Sample "text") | ||||
| </section> | S: * LIST () ":" Tables:new (tablecloth ("edge" "lacy") | |||
| Sample ("text" "more text")) | ||||
| <section title='NAMESPACE Response'> | </sourcecode> | |||
| <iref item='NAMESPACE (response)'/> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <t> | <name>NAMESPACE Response</name> | |||
| <list style='hanging' hangIndent='12'> | <iref item="NAMESPACE (response)" subitem="" primary="false"/> | |||
| <t hangText='Contents:'> | <dl newline="false" spacing="normal" indent="12"> | |||
| <dt>Contents:</dt> | ||||
| <dd> | ||||
| the prefix and hierarchy delimiter to the server's Personal | the prefix and hierarchy delimiter to the server's Personal | |||
| Namespace(s), Other Users' Namespace(s), and Shared | Namespace(s), Other Users' Namespace(s), and Shared | |||
| Namespace(s) | Namespace(s) | |||
| </t> | </dd> | |||
| </list> | </dl> | |||
| </t> | <t> | |||
| <t> | ||||
| The NAMESPACE response occurs as a result of a NAMESPACE command. | The NAMESPACE response occurs as a result of a NAMESPACE command. | |||
| It contains the prefix and hierarchy delimiter to the server's | It contains the prefix and hierarchy delimiter to the server's | |||
| Personal Namespace(s), Other Users' Namespace(s), and Shared | Personal Namespace(s), Other Users' Namespace(s), and Shared | |||
| Namespace(s) that the server wishes to expose. The | Namespace(s) that the server wishes to expose. The | |||
| response will contain a NIL for any namespace class | response will contain a NIL for any namespace class | |||
| that is not available. Namespace-Response-Extensions ABNF non terminal | that is not available. The Namespace-Response-Extensions ABNF non-terminal | |||
| is defined for extensibility and MAY be included in the response. | is defined for extensibility and <bcp14>MAY</bcp14> be included in the resp | |||
| onse. | ||||
| <!--No longer the best practice: | </t> | |||
| Namespace-Response-Extensions which are not on the IETF | <t> | |||
| standards track, MUST be prefixed with an "X-". | Example: | |||
| --> | </t> | |||
| </t> | <sourcecode type=""> | |||
| S: * NAMESPACE (("" "/")) (("~" "/")) NIL | ||||
| <figure><artwork> | </sourcecode> | |||
| Example: S: * NAMESPACE (("" "/")) (("~" "/")) NIL | </section> | |||
| </artwork></figure> | <section numbered="true" toc="default"> | |||
| <name>STATUS Response</name> | ||||
| </section> | <iref item="STATUS (response)" subitem="" primary="false"/> | |||
| <dl newline="false" spacing="normal" indent="12"> | ||||
| <section title='STATUS Response'> | <dt>Contents:</dt> | |||
| <iref item='STATUS (response)'/> | <dd> | |||
| <ul spacing="compact" empty="true" bare="true"> | ||||
| <t> | <li>name</li> | |||
| <list style='hanging' hangIndent='12'> | <li>status parenthesized list</li> | |||
| <t hangText='Contents:'>name<vspace/> | </ul> | |||
| status parenthesized list</t> | </dd> | |||
| </list> | </dl> | |||
| </t> | <t> | |||
| The STATUS response occurs as a result of a STATUS command. It | ||||
| <t> | ||||
| The STATUS response occurs as a result of an STATUS command. It | ||||
| returns the mailbox name that matches the STATUS specification and | returns the mailbox name that matches the STATUS specification and | |||
| the requested mailbox status information. | the requested mailbox status information. | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | Example: | |||
| Example: S: * STATUS blurdybloop (MESSAGES 231 UIDNEXT 44292) | </t> | |||
| </artwork></figure> | <sourcecode type=""> | |||
| S: * STATUS blurdybloop (MESSAGES 231 UIDNEXT 44292) | ||||
| </section> | </sourcecode> | |||
| </section> | ||||
| <section title='ESEARCH Response'> | <section numbered="true" toc="default"> | |||
| <iref item='ESEARCH (response)'/> | <name>ESEARCH Response</name> | |||
| <iref item="ESEARCH (response)" subitem="" primary="false"/> | ||||
| <t> | <dl newline="false" spacing="normal" indent="12"> | |||
| <list style='hanging' hangIndent='12'> | <dt>Contents:</dt> | |||
| <t hangText='Contents:'>one or more search-return-data pairs</t> | <dd>one or more search-return-data pairs</dd> | |||
| </list> | </dl> | |||
| </t> | <t> | |||
| <t> | ||||
| The ESEARCH response occurs as a result of a SEARCH or UID SEARCH | The ESEARCH response occurs as a result of a SEARCH or UID SEARCH | |||
| command. | command. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The ESEARCH response starts with an optional search correlator. If | The ESEARCH response starts with an optional search correlator. If | |||
| it is missing, then the response was not caused by a particular IMAP | it is missing, then the response was not caused by a particular IMAP | |||
| command, whereas if it is present, it contains the tag of the command | command, whereas if it is present, it contains the tag of the command | |||
| that caused the response to be returned. | that caused the response to be returned. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The search correlator is followed by an optional UID indicator. If | The search correlator is followed by an optional UID indicator. If | |||
| this indicator is present, all data in the ESEARCH response refers to | this indicator is present, all data in the ESEARCH response refers to | |||
| UIDs, otherwise all returned data refers to message numbers. | UIDs; otherwise, all returned data refers to message numbers. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The rest of the ESEARCH response contains one or more search data | The rest of the ESEARCH response contains one or more search data | |||
| pairs. Each pair starts with unique return item name, followed by a | pairs. Each pair starts with a unique return item name, followed by a | |||
| space and the corresponding data. Search data pairs may be returned | space and the corresponding data. Search data pairs may be returned | |||
| in any order. Unless specified otherwise by an extension, any return | in any order. Unless otherwise specified by an extension, any return | |||
| item name SHOULD appear only once in an ESEARCH response. | item name <bcp14>SHOULD</bcp14> appear only once in an ESEARCH response. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| This document specifies the following return item names: | This document specifies the following return item names: | |||
| <list style='hanging'> | </t> | |||
| <t hangText='MIN'> | <dl newline="true" spacing="normal"> | |||
| <iref item='MIN (search return item name)'/> | <dt>MIN</dt> | |||
| <dd> | ||||
| <list> | <t><iref item="MIN (search return item name)" subitem="" primary=" | |||
| <t> | false"/> | |||
| Returns the lowest message number/UID that satisfies the SEARCH | Returns the lowest message number/UID that satisfies the SEARCH | |||
| criteria. | criteria. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | If the SEARCH results in no matches, the server <bcp14>MUST NOT</b | |||
| If the SEARCH results in no matches, the server MUST NOT | cp14> | |||
| include the MIN return item in the ESEARCH response; however, | include the MIN return item in the ESEARCH response; however, | |||
| it still MUST send the ESEARCH response. | it still <bcp14>MUST</bcp14> send the ESEARCH response.</t> | |||
| </t> | </dd> | |||
| </list> | ||||
| </t> | ||||
| <t hangText='MAX'> | <dt>MAX</dt> | |||
| <iref item='MAX (search return item name)'/> | <dd> | |||
| <list> | <t><iref item="MAX (search return item name)" subitem="" primary=" | |||
| <t> | false"/> | |||
| Returns the highest message number/UID that satisfies the SEARCH | Returns the highest message number/UID that satisfies the SEARCH | |||
| criteria. | criteria. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | If the SEARCH results in no matches, the server <bcp14>MUST NOT</b | |||
| If the SEARCH results in no matches, the server MUST NOT | cp14> | |||
| include the MAX return item in the ESEARCH response; however, | include the MAX return item in the ESEARCH response; however, | |||
| it still MUST send the ESEARCH response. | it still <bcp14>MUST</bcp14> send the ESEARCH response.</t> | |||
| </t> | </dd> | |||
| </list> | ||||
| </t> | ||||
| <t hangText='ALL'> | <dt>ALL</dt> | |||
| <iref item='ALL (search return item name)'/> | <dd> | |||
| <list> | <t><iref item="ALL (search return item name)" subitem="" primary=" | |||
| <t> | false"/> | |||
| Returns all message numbers/UIDs that satisfy the SEARCH | Returns all message numbers/UIDs that satisfy the SEARCH | |||
| criteria using the sequence-set syntax. Note, the client | criteria using the sequence-set syntax. Each set <bcp14>MUST</bcp14> | |||
| MUST NOT assume that messages/UIDs will be listed in any | be | |||
| complete; in particular, a UID set is returned in an ESEARCH respons | ||||
| e only when | ||||
| each number in the range corresponds to an existing (matching) messag | ||||
| e. | ||||
| The client | ||||
| <bcp14>MUST NOT</bcp14> assume that messages/UIDs will be listed in | ||||
| any | ||||
| particular order. | particular order. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | If the SEARCH results in no matches, the server <bcp14>MUST NOT</bcp | |||
| If the SEARCH results in no matches, the server MUST NOT | 14> | |||
| include the ALL return item in the ESEARCH response; however, | include the ALL return item in the ESEARCH response; however, | |||
| it still MUST send the ESEARCH response. | it still <bcp14>MUST</bcp14> send the ESEARCH response.</t> | |||
| </t> | </dd> | |||
| </list> | ||||
| </t> | ||||
| <t hangText='COUNT'> | <dt>COUNT</dt> | |||
| <iref item='COUNT (search return item name)'/> | <dd> | |||
| <iref item="COUNT (search return item name)" subitem="" primary="f | ||||
| alse"/> | ||||
| Returns the number of messages that satisfy the SEARCH criteria. | Returns the number of messages that satisfy the SEARCH criteria. | |||
| This return item MUST always be included in the ESEARCH | This return item <bcp14>MUST</bcp14> always be included in the ESEAR CH | |||
| response. | response. | |||
| </t> | </dd> | |||
| </dl> | ||||
| </list> | <t> | |||
| </t> | Example: | |||
| </t> | ||||
| <figure><artwork> | <sourcecode type=""> | |||
| Example: S: * ESEARCH UID COUNT 5 ALL 4:19,21,28 | S: * ESEARCH UID COUNT 17 ALL 4:18,21,28 | |||
| </sourcecode> | ||||
| Example: S: * ESEARCH (TAG "a567") UID COUNT 5 ALL 4:19,21,28 | <t> | |||
| Example: | ||||
| Example: S: * ESEARCH COUNT 5 ALL 1:17,21 | </t> | |||
| </artwork></figure> | <sourcecode type=""> | |||
| S: * ESEARCH (TAG "a567") UID COUNT 17 ALL 4:18,21,28 | ||||
| </section> | </sourcecode> | |||
| <t> | ||||
| <section title='FLAGS Response' anchor='flags-resp'> | Example: | |||
| <iref item='FLAGS (response)'/> | </t> | |||
| <sourcecode type=""> | ||||
| <t> | S: * ESEARCH COUNT 18 ALL 1:17,21 | |||
| <list style='hanging' hangIndent='12'> | </sourcecode> | |||
| <t hangText='Contents:'>flag parenthesized list</t> | </section> | |||
| </list> | <section anchor="flags-resp" numbered="true" toc="default"> | |||
| </t> | <name>FLAGS Response</name> | |||
| <iref item="FLAGS (response)" subitem="" primary="false"/> | ||||
| <t> | <dl newline="false" spacing="normal" indent="12"> | |||
| <dt>Contents:</dt> | ||||
| <dd>flag parenthesized list</dd> | ||||
| </dl> | ||||
| <t> | ||||
| The FLAGS response occurs as a result of a SELECT or EXAMINE | The FLAGS response occurs as a result of a SELECT or EXAMINE | |||
| command. The flag parenthesized list identifies the flags (at a | command. The flag parenthesized list identifies the flags (at a | |||
| minimum, the system-defined flags) that are applicable for this | minimum, the system-defined flags) that are applicable for this | |||
| mailbox. Flags other than the system flags can also exist, | mailbox. Flags other than the system flags can also exist, | |||
| depending on server implementation. | depending on server implementation. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | The update from the FLAGS response <bcp14>MUST</bcp14> be remembered by th | |||
| The update from the FLAGS response MUST be remembered by the client. | e client. | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | Example: | |||
| Example: S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) | </t> | |||
| </artwork></figure> | <sourcecode type=""> | |||
| S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) | ||||
| </sourcecode> | ||||
| </section> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| </section> | <name>Server Responses - Mailbox Size</name> | |||
| <t> | ||||
| <section title='Server Responses - Mailbox Size'> | ||||
| <t> | ||||
| These responses are always untagged. This is how changes in the size | These responses are always untagged. This is how changes in the size | |||
| of the mailbox are transmitted from the server to the client. | of the mailbox are transmitted from the server to the client. | |||
| Immediately following the "*" token is a number that represents a | Immediately following the "*" token is a number that represents a | |||
| message count. | message count. | |||
| </t> | </t> | |||
| <section anchor="exists" numbered="true" toc="default"> | ||||
| <section title='EXISTS Response' anchor='exists'> | <name>EXISTS Response</name> | |||
| <dl newline="false" spacing="normal" indent="12"> | ||||
| <t> | <dt>Contents:</dt> | |||
| <list style='hanging' hangIndent='12'> | <dd>none</dd> | |||
| <t hangText='Contents:'>none</t> | </dl> | |||
| </list> | <t> | |||
| </t> | ||||
| <t> | ||||
| The EXISTS response reports the number of messages in the mailbox. | The EXISTS response reports the number of messages in the mailbox. | |||
| This response occurs as a result of a SELECT or EXAMINE command, | This response occurs as a result of a SELECT or EXAMINE command | |||
| and if the size of the mailbox changes (e.g., new messages). | and if the size of the mailbox changes (e.g., new messages). | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | The update from the EXISTS response <bcp14>MUST</bcp14> be remembered by t | |||
| The update from the EXISTS response MUST be remembered by the | he | |||
| client. | client. | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | Example: | |||
| Example: S: * 23 EXISTS | </t> | |||
| </artwork></figure> | <sourcecode type=""> | |||
| S: * 23 EXISTS | ||||
| </sourcecode> | ||||
| </section> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| </section> | <name>Server Responses - Message Status</name> | |||
| <t> | ||||
| <section title='Server Responses - Message Status'> | ||||
| <t> | ||||
| These responses are always untagged. This is how message data are | These responses are always untagged. This is how message data are | |||
| transmitted from the server to the client, often as a result of a | transmitted from the server to the client, often as a result of a | |||
| command with the same name. Immediately following the "*" token is a | command with the same name. Immediately following the "*" token is a | |||
| number that represents a message sequence number. | number that represents a message sequence number. | |||
| </t> | </t> | |||
| <section anchor="expunge-response" numbered="true" toc="default"> | ||||
| <section title='EXPUNGE Response' anchor='expunge-response'> | <name>EXPUNGE Response</name> | |||
| <iref item='EXPUNGE (response)'/> | <iref item="EXPUNGE (response)" subitem="" primary="false"/> | |||
| <dl newline="false" spacing="normal" indent="12"> | ||||
| <t> | <dt>Contents:</dt> | |||
| <list style='hanging' hangIndent='12'> | <dd>none</dd> | |||
| <t hangText='Contents:'>none</t> | </dl> | |||
| </list> | <t> | |||
| </t> | ||||
| <t> | ||||
| The EXPUNGE response reports that the specified message sequence | The EXPUNGE response reports that the specified message sequence | |||
| number has been permanently removed from the mailbox. The message | number has been permanently removed from the mailbox. The message | |||
| sequence number for each successive message in the mailbox is | sequence number for each successive message in the mailbox is | |||
| immediately decremented by 1, and this decrement is reflected in | immediately decremented by 1, and this decrement is reflected in | |||
| message sequence numbers in subsequent responses (including other | message sequence numbers in subsequent responses (including other | |||
| untagged EXPUNGE responses). | untagged EXPUNGE responses). | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The EXPUNGE response also decrements the number of messages in the | The EXPUNGE response also decrements the number of messages in the | |||
| mailbox; it is not necessary to send an EXISTS response with the | mailbox; it is not necessary to send an EXISTS response with the | |||
| new value. | new value. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| As a result of the immediate decrement rule, message sequence | As a result of the immediate decrement rule, message sequence | |||
| numbers that appear in a set of successive EXPUNGE responses | numbers that appear in a set of successive EXPUNGE responses | |||
| depend upon whether the messages are removed starting from lower | depend upon whether the messages are removed starting from lower | |||
| numbers to higher numbers, or from higher numbers to lower | numbers to higher numbers, or from higher numbers to lower | |||
| numbers. For example, if the last 5 messages in a 9-message | numbers. For example, if the last 5 messages in a 9-message | |||
| mailbox are expunged, a "lower to higher" server will send five | mailbox are expunged, a "lower to higher" server will send five | |||
| untagged EXPUNGE responses for message sequence number 5, whereas | untagged EXPUNGE responses for message sequence number 5, whereas | |||
| a "higher to lower server" will send successive untagged EXPUNGE | a "higher to lower" server will send successive untagged EXPUNGE | |||
| responses for message sequence numbers 9, 8, 7, 6, and 5. | responses for message sequence numbers 9, 8, 7, 6, and 5. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | An EXPUNGE response <bcp14>MUST NOT</bcp14> be sent when no command is in | |||
| An EXPUNGE response MUST NOT be sent when no command is in | ||||
| progress, nor while responding to a FETCH, STORE, or SEARCH | progress, nor while responding to a FETCH, STORE, or SEARCH | |||
| command. This rule is necessary to prevent a loss of | command. This rule is necessary to prevent a loss of | |||
| synchronization of message sequence numbers between client and | synchronization of message sequence numbers between client and | |||
| server. A command is not "in progress" until the complete command | server. A command is not "in progress" until the complete command | |||
| has been received; in particular, a command is not "in progress" | has been received; in particular, a command is not "in progress" | |||
| during the negotiation of command continuation. | during the negotiation of command continuation. | |||
| <list><t> | </t> | |||
| <t indent="3"> | ||||
| Note: UID FETCH, UID STORE, and UID SEARCH are different | Note: UID FETCH, UID STORE, and UID SEARCH are different | |||
| commands from FETCH, STORE, and SEARCH. An EXPUNGE | commands from FETCH, STORE, and SEARCH. An EXPUNGE | |||
| response MAY be sent during a UID command. | response <bcp14>MAY</bcp14> be sent during a UID command. | |||
| </t></list> | </t> | |||
| </t> | <t> | |||
| The update from the EXPUNGE response <bcp14>MUST</bcp14> be remembered by | ||||
| <t> | the | |||
| The update from the EXPUNGE response MUST be remembered by the | ||||
| client. | client. | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | Example: | |||
| Example: S: * 44 EXPUNGE | </t> | |||
| </artwork></figure> | <sourcecode type=""> | |||
| S: * 44 EXPUNGE | ||||
| </section> | </sourcecode> | |||
| </section> | ||||
| <section title='FETCH Response' anchor='fetch-response'> | <section anchor="fetch-response" numbered="true" toc="default"> | |||
| <iref item='FETCH (response)'/> | <name>FETCH Response</name> | |||
| <iref item="FETCH (response)" subitem="" primary="false"/> | ||||
| <t> | <dl newline="false" spacing="normal" indent="12"> | |||
| <list style='hanging' hangIndent='12'> | <dt>Contents:</dt> | |||
| <t hangText='Contents:'>message data</t> | <dd>message data</dd> | |||
| </list> | </dl> | |||
| </t> | <t> | |||
| <t> | ||||
| The FETCH response returns data about a message to the client. | The FETCH response returns data about a message to the client. | |||
| The data are pairs of data item names and their values in | The data are pairs of data item names, and their values are in | |||
| parentheses. This response occurs as the result of a FETCH or | parentheses. This response occurs as the result of a FETCH or | |||
| STORE command, as well as by unilateral server decision (e.g., | STORE command, as well as by a unilateral server decision (e.g., | |||
| flag updates). | flag updates). | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The current data items are: | The current data items are: | |||
| <list style='hanging'> | </t> | |||
| <dl newline="true" spacing="normal"> | ||||
| <t hangText='BINARY[<section-binary>]<<number>>'> | <dt>BINARY[<section-binary>]<<number>></dt> | |||
| <iref item='BINARY[<section-binary>]<<number>> (fetch result)'/> | <dd> | |||
| <list> | <t><iref item="BINARY[<section-binary>]<<number>> | |||
| <t> | ; (fetch result)" subitem="" primary="false"/> | |||
| An <nstring> or <literal8> expressing the content of the | An <nstring> or <literal8> expressing the content of the | |||
| specified section after removing any Content-Transfer-Encoding-related | specified section after removing any encoding specified in the | |||
| encoding. If | corresponding Content-Transfer-Encoding header field. | |||
| <number> is present it refers to the offset within the DECODED | If <number> is present, it refers to the offset within the DECODED | |||
| section data. | section data.</t> | |||
| </t> | ||||
| <t> | <t> | |||
| If the domain of the decoded data is "8bit" and the data does | If the domain of the decoded data is "8bit" and the data does | |||
| not contain the NUL octet, the server SHOULD return the data in | not contain the NUL octet, the server <bcp14>SHOULD</bcp14> return the | |||
| a <string> instead of a <literal8>; this allows the client to | data in | |||
| a <string> instead of a <literal8>; this allows the client | ||||
| to | ||||
| determine if the "8bit" data contains the NUL octet without | determine if the "8bit" data contains the NUL octet without | |||
| having to explicitly scan the data stream for for NULs. | having to explicitly scan the data stream for NULs. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| <!--This text used to be in the "Implementation Considerations" section of BINARY extension:--> | ||||
| Messaging clients and servers have been notoriously lax in their | Messaging clients and servers have been notoriously lax in their | |||
| adherence to the Internet CRLF convention for terminating lines of | adherence to the Internet CRLF convention for terminating lines of | |||
| textual data (text/* media types) in Internet protocols. | textual data (text/* media types) in Internet protocols. | |||
| When sending data in BINARY[...] FETCH data item, | When sending data in a BINARY[...] FETCH data item, | |||
| servers MUST ensure that textual line-oriented | servers <bcp14>MUST</bcp14> ensure that textual line-oriented | |||
| sections are always transmitted using the IMAP4 CRLF line termination | sections are always transmitted using the IMAP CRLF line termination | |||
| syntax, regardless of the underlying storage representation of the | syntax, regardless of the underlying storage representation of the | |||
| data on the server. | data on the server.</t> | |||
| </t> | ||||
| <t> | <t> | |||
| If the server does not know how to decode the section's Content-Transfe r-Encoding, | If the server does not know how to decode the section's Content-Transfe r-Encoding, | |||
| it MUST fail the request and issue a "NO" response that contains | it <bcp14>MUST</bcp14> fail the request and issue a "NO" response that | |||
| the "UNKNOWN-CTE" response code. | contains | |||
| </t> | the "UNKNOWN-CTE" response code.</t> | |||
| </dd> | ||||
| </list> | ||||
| </t> | ||||
| <t hangText='BINARY.SIZE[<section-binary>]'> | <dt>BINARY.SIZE[<section-binary>]</dt> | |||
| <iref item='BINARY.SIZE[<section-binary>] (fetch result)'/> | <dd> | |||
| <list> | <t><iref item="BINARY.SIZE[<section-binary>] (fetch result)" | |||
| <t> | subitem="" primary="false"/> | |||
| The size of the section after removing any Content-Transfer-Encoding-re | The size of the section after removing any encoding specified in the | |||
| lated | corresponding Content-Transfer-Encoding header field. The value returne | |||
| encoding. The value returned MUST match the size of the | d <bcp14>MUST</bcp14> match the size of the | |||
| <nstring> or <literal8> that will be returned by the | <nstring> or <literal8> that will be returned by the | |||
| corresponding FETCH BINARY request. | corresponding FETCH BINARY request. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| If the server does not know how to decode the section's Content-Transfe r-Encoding, | If the server does not know how to decode the section's Content-Transfe r-Encoding, | |||
| it MUST fail the request and issue a "NO" response that contains | it <bcp14>MUST</bcp14> fail the request and issue a "NO" response that | |||
| the "UNKNOWN-CTE" response code. | contains | |||
| </t> | the "UNKNOWN-CTE" response code.</t> | |||
| </dd> | ||||
| </list> | <dt>BODY</dt> | |||
| </t> | <dd> | |||
| <iref item="BODY (fetch result)" subitem="" primary="false"/> | ||||
| A form of BODYSTRUCTURE without extension data.</dd> | ||||
| <t hangText='BODY'> | <dt>BODY[<section>]<<origin octet>></dt> | |||
| <iref item='BODY (fetch result)'/> | <dd> | |||
| A form of BODYSTRUCTURE without extension data.</t> | <t><iref item="BODY[<section>]<<origin octet>> ( | |||
| fetch result)" subitem="" primary="false"/> | ||||
| <t hangText='BODY[<section>]<<origin octet>>'> | ||||
| <iref item='BODY[<section>]<<origin octet>> (fetch result)'/> | ||||
| <list> | ||||
| <t> | ||||
| A string expressing the body contents of the specified section. | A string expressing the body contents of the specified section. | |||
| The string SHOULD be interpreted by the client according to the | The string <bcp14>SHOULD</bcp14> be interpreted by the client according to the | |||
| content transfer encoding, body type, and subtype. | content transfer encoding, body type, and subtype. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| If the origin octet is specified, this string is a substring of | If the origin octet is specified, this string is a substring of | |||
| the entire body contents, starting at that origin octet. This | the entire body contents, starting at that origin octet. This | |||
| means that BODY[]<0> MAY be truncated, but BODY[] is NEVER | means that BODY[]<0> <bcp14>MAY</bcp14> be truncated, but BODY[] is NEVER | |||
| truncated. | truncated. | |||
| </t> | ||||
| <list> | <t indent="3"> | |||
| <t> | Note: The origin octet facility <bcp14>MUST NOT</bcp14> be used by a | |||
| Note: The origin octet facility MUST NOT be used by a server | server | |||
| in a FETCH response unless the client specifically requested | in a FETCH response unless the client specifically requested | |||
| it by means of a FETCH of a BODY[<section>]<<partial>> data | it by means of a FETCH of a BODY[<section>]<<partial> > data | |||
| item. | item. | |||
| </t> | </t> | |||
| </list> | <t> | |||
| </t> | 8-bit textual data is permitted if a <xref target="RFC2978" format="def | |||
| ault"/> identifier is | ||||
| <t> | ||||
| 8-bit textual data is permitted if a <xref target='CHARSET'/> identifie | ||||
| r is | ||||
| part of the body parameter parenthesized list for this section. | part of the body parameter parenthesized list for this section. | |||
| Note that headers (part specifiers HEADER or MIME, or the | Note that headers (part specifiers HEADER or MIME, or the | |||
| header portion of a MESSAGE/RFC822 or MESSAGE/GLOBAL part), MAY be in U | header portion of a MESSAGE/RFC822 or MESSAGE/GLOBAL part) <bcp14>MAY</ | |||
| TF-8. Note also that the | bcp14> be in UTF-8. Note also that the | |||
| <xref target='RFC-5322'/> delimiting blank line between the header and | <xref target="RFC5322" format="default"/> delimiting blank line between | |||
| the | the header and the | |||
| body is not affected by header line subsetting; the blank line | body is not affected by header-line subsetting; the blank line | |||
| is always included as part of header data, except in the case | is always included as part of the header data, except in the case | |||
| of a message which has no body and no blank line. | of a message that has no body and no blank line. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Non-textual data such as binary data MUST be transfer encoded | Non-textual data such as binary data <bcp14>MUST</bcp14> be transfer en | |||
| into a textual form, such as BASE64, prior to being sent to the | coded | |||
| client. To derive the original binary data, the client MUST | into a textual form, such as base64, prior to being sent to the | |||
| decode the transfer encoded string. | client. To derive the original binary data, the client <bcp14>MUST</bc | |||
| </t> | p14> | |||
| </list> | decode the transfer-encoded string.</t> | |||
| </t> | </dd> | |||
| <t hangText='BODYSTRUCTURE'> | <dt>BODYSTRUCTURE</dt> | |||
| <iref item='BODYSTRUCTURE (fetch result)'/> | <dd> | |||
| <list> | <t><iref item="BODYSTRUCTURE (fetch result)" subitem="" primary="f | |||
| <t> | alse"/> | |||
| A parenthesized list that describes the <xref target='MIME-IMB'/> body | ||||
| A parenthesized list that describes the <xref target="RFC2045" format=" | ||||
| default"/> body | ||||
| structure of a message. This is computed by the server by | structure of a message. This is computed by the server by | |||
| parsing the <xref target='MIME-IMB'/> header fields, defaulting various fields | parsing the <xref target="RFC2045" format="default"/> header fields, de faulting various fields | |||
| as necessary. | as necessary. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| For example, a simple text message of 48 lines and 2279 octets | For example, a simple text message of 48 lines and 2279 octets | |||
| can have a body structure of: ("TEXT" "PLAIN" ("CHARSET" | can have a body structure of:</t> | |||
| "US-ASCII") NIL NIL "7BIT" 2279 48) | ||||
| </t> | ||||
| <t> | <artwork type="" align="left" alt=""><![CDATA[ | |||
| ("TEXT" "PLAIN" ("CHARSET" "US-ASCII") NIL NIL "7BIT" 2279 48) | ||||
| ]]></artwork> | ||||
| <t> | ||||
| Multiple parts are indicated by parenthesis nesting. Instead | Multiple parts are indicated by parenthesis nesting. Instead | |||
| of a body type as the first element of the parenthesized list, | of a body type as the first element of the parenthesized list, | |||
| there is a sequence of one or more nested body structures. The | there is a sequence of one or more nested body structures. The | |||
| second element of the parenthesized list is the multipart | second element of the parenthesized list is the multipart | |||
| subtype (mixed, digest, parallel, alternative, etc.). | subtype (mixed, digest, parallel, alternative, etc.). | |||
| </t> | </t> | |||
| <t> | ||||
| For example, a two-part message consisting of a text and a | ||||
| base64-encoded text attachment can have a body structure of:</t> | ||||
| <t> | <artwork type="" align="left" alt=""><![CDATA[ | |||
| For example, a two part message consisting of a text and a | (("TEXT" "PLAIN" ("CHARSET" "US-ASCII") NIL NIL "7BIT" 1152 23) | |||
| BASE64-encoded text attachment can have a body structure of: | ("TEXT" "PLAIN" ("CHARSET" "US-ASCII" "NAME" "cc.diff") | |||
| (("TEXT" "PLAIN" ("CHARSET" "US-ASCII") NIL NIL "7BIT" 1152 | "<960723163407.20117h@cac.washington.edu>" "Compiler diff" | |||
| 23)("TEXT" "PLAIN" ("CHARSET" "US-ASCII" "NAME" "cc.diff") | "BASE64" 4554 73) "MIXED") | |||
| "<960723163407.20117h@cac.washington.edu>" "Compiler diff" | ]]></artwork> | |||
| "BASE64" 4554 73) "MIXED") | <t> | |||
| </t> | ||||
| <t> | ||||
| Extension data follows the multipart subtype. Extension data | Extension data follows the multipart subtype. Extension data | |||
| is never returned with the BODY fetch, but can be returned with | is never returned with the BODY fetch but can be returned with | |||
| a BODYSTRUCTURE fetch. Extension data, if present, MUST be in | a BODYSTRUCTURE fetch. Extension data, if present, <bcp14>MUST</bcp14> | |||
| be in | ||||
| the defined order. The extension data of a multipart body part | the defined order. The extension data of a multipart body part | |||
| are in the following order: | are in the following order: | |||
| </t></dd> | ||||
| <list style='hanging'> | <dt>body parameter parenthesized list</dt> | |||
| <t hangText='body parameter parenthesized list'> | <dd> | |||
| A parenthesized list of attribute/value pairs [e.g., ("foo" | A parenthesized list of attribute/value pairs (e.g., ("foo" | |||
| "bar" "baz" "rag") where "bar" is the value of "foo", and | "bar" "baz" "rag") where "bar" is the value of "foo", and | |||
| "rag" is the value of "baz"] as defined in <xref target='MIME-IMB'/> | "rag" is the value of "baz") as defined in <xref target="RFC2045" fo | |||
| . | rmat="default"/>. | |||
| Servers SHOULD decode parameter value continuations and | Servers <bcp14>SHOULD</bcp14> decode parameter-value continuations a | |||
| parameter value character sets as described in <xref target='RFC2231 | nd | |||
| '/>, | parameter-value character sets as described in <xref target="RFC2231 | |||
| for example, if the message contains parameters "baz*0", "baz*1" and | " format="default"/>, | |||
| "baz*2", | for example, if the message contains parameters "baz*0", "baz*1", an | |||
| the server should RFC2231-decode them, concatenate and return the re | d "baz*2", | |||
| sulting value | the server should decode them per <xref target="RFC2231" format="def | |||
| ault"/>, concatenate, and return the resulting value | ||||
| as a parameter "baz". | as a parameter "baz". | |||
| Similarly, if the message contains parameters "foo*0*" and "foo*1*", the server | Similarly, if the message contains parameters "foo*0*" and "foo*1*", the server | |||
| should RFC2231-decode them, convert to UTF-8, concatenate and return | should decode them per <xref target="RFC2231" format="default"/>, co nvert to UTF-8, concatenate, and return | |||
| the resulting value as a parameter "foo*". | the resulting value as a parameter "foo*". | |||
| </t> | </dd> | |||
| <dt>body disposition</dt> | ||||
| <t hangText='body disposition'> | <dd> | |||
| A parenthesized list, consisting of a disposition type | A parenthesized list, consisting of a disposition type | |||
| string, followed by a parenthesized list of disposition | string, followed by a parenthesized list of disposition | |||
| attribute/value pairs as defined in <xref target='DISPOSITION'/>. | attribute/value pairs as defined in <xref target="RFC2183" format="d | |||
| Servers SHOULD decode parameter value continuations as described in | efault"/>. | |||
| <xref target='RFC2231'/>. | Servers <bcp14>SHOULD</bcp14> decode parameter-value continuations a | |||
| </t> | s described in <xref target="RFC2231" format="default"/>. | |||
| </dd> | ||||
| <t hangText='body language'> | <dt>body language</dt> | |||
| <dd> | ||||
| A string or parenthesized list giving the body language | A string or parenthesized list giving the body language | |||
| value as defined in <xref target='LANGUAGE-TAGS'/>.</t> | value as defined in <xref target="RFC3282" format="default"/>.</dd> | |||
| <dt>body location</dt> | ||||
| <t hangText='body location'> | <dd><t> | |||
| A string giving the body content URI as defined in | A string giving the body content URI as defined in | |||
| <xref target='LOCATION'/>.</t> | <xref target="RFC2557" format="default"/>.</t> | |||
| </list> | ||||
| </t> | ||||
| <t> | <t> | |||
| Any following extension data are not yet defined in this | Any following extension data are not yet defined in this | |||
| version of the protocol. Such extension data can consist of | version of the protocol. Such extension data can consist of | |||
| zero or more NILs, strings, numbers, or potentially nested | zero or more NILs, strings, numbers, or potentially nested | |||
| parenthesized lists of such data. Client implementations that | parenthesized lists of such data. Client implementations that | |||
| do a BODYSTRUCTURE fetch MUST be prepared to accept such | do a BODYSTRUCTURE fetch <bcp14>MUST</bcp14> be prepared to accept such | |||
| extension data. Server implementations MUST NOT send such | extension data. Server implementations <bcp14>MUST NOT</bcp14> send su | |||
| ch | ||||
| extension data until it has been defined by a revision of this | extension data until it has been defined by a revision of this | |||
| protocol. | protocol.</t> | |||
| </t> | ||||
| <t> | <t> | |||
| The basic fields of a non-multipart body part are in the | The basic fields of a non-multipart body part are in the | |||
| following order: | following order: | |||
| </t></dd> | ||||
| <list style='hanging'> | <dt>body type</dt> | |||
| <t hangText='body type'> | <dd> | |||
| A string giving the content media type name as defined in | A string giving the content media-type name as defined in | |||
| <xref target='MIME-IMB'/>.</t> | <xref target="RFC2045" format="default"/>.</dd> | |||
| <dt>body subtype</dt> | ||||
| <t hangText='body subtype'> | <dd> | |||
| A string giving the content subtype name as defined in | A string giving the content subtype name as defined in | |||
| <xref target='MIME-IMB'/>.</t> | <xref target="RFC2045" format="default"/>.</dd> | |||
| <dt>body parameter parenthesized list</dt> | ||||
| <t hangText='body parameter parenthesized list'> | <dd> | |||
| A parenthesized list of attribute/value pairs [e.g., ("foo" | A parenthesized list of attribute/value pairs (e.g., ("foo" | |||
| "bar" "baz" "rag") where "bar" is the value of "foo" and | "bar" "baz" "rag") where "bar" is the value of "foo", and | |||
| "rag" is the value of "baz"] as defined in <xref target='MIME-IMB'/> | "rag" is the value of "baz") as defined in <xref target="RFC2045" fo | |||
| .</t> | rmat="default"/>.</dd> | |||
| <dt>body id</dt> | ||||
| <t hangText='body id'> | <dd> | |||
| A string giving the Content-ID header field value as defined in | A string giving the Content-ID header field value as defined in | |||
| Section 7 of <xref target='MIME-IMB'/>.</t> | <xref target="RFC2045" sectionFormat="of" section="7"/>.</dd> | |||
| <dt>body description</dt> | ||||
| <t hangText='body description'> | <dd> | |||
| A string giving the Content-Description header field value as define d in | A string giving the Content-Description header field value as define d in | |||
| Section 8 of <xref target='MIME-IMB'/>.</t> | <xref target="RFC2045" sectionFormat="of" section="8"/>.</dd> | |||
| <dt>body encoding</dt> | ||||
| <t hangText='body encoding'> | <dd> | |||
| A string giving the content transfer encoding as defined in | A string giving the content transfer encoding as defined in | |||
| Section 6 of <xref target='MIME-IMB'/>.</t> | <xref target="RFC2045" sectionFormat="of" section="6"/>.</dd> | |||
| <dt>body size</dt> | ||||
| <t hangText='body size'> | <dd><t> | |||
| A number giving the size of the body in octets. Note that | A number giving the size of the body in octets. Note that | |||
| this size is the size in its transfer encoding and not the | this size is the size in its transfer encoding and not the | |||
| resulting size after any decoding.</t> | resulting size after any decoding.</t> | |||
| </list> | <t> | |||
| </t> | ||||
| <t> | ||||
| A body type of type MESSAGE and subtype RFC822 contains, | A body type of type MESSAGE and subtype RFC822 contains, | |||
| immediately after the basic fields, the envelope structure, | immediately after the basic fields, the envelope structure, | |||
| body structure, and size in text lines of the encapsulated | body structure, and size in text lines of the encapsulated | |||
| message. | message.</t> | |||
| </t> | ||||
| <t> | <t> | |||
| A body type of type TEXT contains, immediately after the basic | A body type of type TEXT contains, immediately after the basic | |||
| fields, the size of the body in text lines. Note that this | fields, the size of the body in text lines. Note that this | |||
| size is the size in its content transfer encoding and not the | size is the size in its content transfer encoding and not the | |||
| resulting size after any decoding. | resulting size after any decoding.</t> | |||
| </t> | ||||
| <t> | <t> | |||
| Extension data follows the basic fields and the type-specific | Extension data follows the basic fields and the type-specific | |||
| fields listed above. Extension data is never returned with the | fields listed above. Extension data is never returned with the | |||
| BODY fetch, but can be returned with a BODYSTRUCTURE fetch. | BODY fetch but can be returned with a BODYSTRUCTURE fetch. | |||
| Extension data, if present, MUST be in the defined order. | Extension data, if present, <bcp14>MUST</bcp14> be in the defined order | |||
| . | ||||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The extension data of a non-multipart body part are in the | The extension data of a non-multipart body part are in the | |||
| following order: | following order: | |||
| </t></dd> | ||||
| <list style='hanging'> | <dt>body MD5</dt> | |||
| <t hangText='body MD5'> | <dd> | |||
| A string giving the body MD5 value as defined in <xref target='MD5'/ | A string giving the body MD5 value as defined in <xref target="RFC18 | |||
| >.</t> | 64" format="default"/>.</dd> | |||
| <dt>body disposition</dt> | ||||
| <t hangText='body disposition'> | <dd> | |||
| A parenthesized list with the same content and function as | A parenthesized list with the same content and function as | |||
| the body disposition for a multipart body part.</t> | the body disposition for a multipart body part.</dd> | |||
| <dt>body language</dt> | ||||
| <t hangText='body language'> | <dd> | |||
| A string or parenthesized list giving the body language | A string or parenthesized list giving the body language | |||
| value as defined in <xref target='LANGUAGE-TAGS'/>.</t> | value as defined in <xref target="RFC3282" format="default"/>.</dd> | |||
| <dt>body location</dt> | ||||
| <t hangText='body location'> | <dd><t> | |||
| A string giving the body content URI as defined in | A string giving the body content URI as defined in | |||
| <xref target='LOCATION'/>.</t> | <xref target="RFC2557" format="default"/>.</t> | |||
| </list> | ||||
| </t> | ||||
| <t> | <t> | |||
| Any following extension data are not yet defined in this | Any following extension data are not yet defined in this | |||
| version of the protocol, and would be as described above under | version of the protocol and would be as described above under | |||
| multipart extension data. | multipart extension data.</t> | |||
| </t> | </dd> | |||
| </list> | ||||
| </t> | ||||
| <t hangText='ENVELOPE'> | <dt>ENVELOPE</dt> | |||
| <iref item='ENVELOPE (fetch result)'/> | <dd> | |||
| <list> | <t><iref item="ENVELOPE (fetch result)" subitem="" primary="false" | |||
| <t> | /> | |||
| A parenthesized list that describes the envelope structure of a | A parenthesized list that describes the envelope structure of a | |||
| message. This is computed by the server by parsing the | message. This is computed by the server by parsing the | |||
| <xref target='RFC-5322'/> header into the component parts, defaulting v arious | <xref target="RFC5322" format="default"/> header into the component par ts, defaulting various | |||
| fields as necessary. | fields as necessary. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The fields of the envelope structure are in the following | The fields of the envelope structure are in the following | |||
| order: date, subject, from, sender, reply-to, to, cc, bcc, | order: date, subject, from, sender, reply-to, to, cc, bcc, | |||
| in-reply-to, and message-id. The date, subject, in-reply-to, | in-reply-to, and message-id. The date, subject, in-reply-to, | |||
| and message-id fields are strings. The from, sender, reply-to, | and message-id fields are strings. The from, sender, reply-to, | |||
| to, cc, and bcc fields are parenthesized lists of address | to, cc, and bcc fields are parenthesized lists of address | |||
| structures. | structures. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| An address structure is a parenthesized list that describes an | An address structure is a parenthesized list that describes an | |||
| electronic mail address. The fields of an address structure | electronic mail address. The fields of an address structure | |||
| are in the following order: display name, <xref target='SMTP'/> | are in the following order: display name, <xref target="RFC5321" format | |||
| at-domain-list (source route, obs-route ABNF production from <xref targ | ="default"/> | |||
| et='RFC-5322'/>), | at-domain-list (source route and obs-route ABNF production from <xref t | |||
| mailbox name (local-part ABNF production from <xref target='RFC-5322'/> | arget="RFC5322" format="default"/>), | |||
| ), and host name. | mailbox name (local-part ABNF production from <xref target="RFC5322" fo | |||
| rmat="default"/>), and hostname. | ||||
| </t> | </t> | |||
| <t> | ||||
| <t> | <xref target="RFC5322" format="default"/> group syntax is indi | |||
| <xref target='RFC-5322'/> group syntax is indicated by a special form o | cated by a special form of | |||
| f | address structure in which the hostname field is NIL. If the | |||
| 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 | |||
| mailbox name field is also NIL, this is an end of group marker | (semicolon in RFC 822 syntax). If the mailbox name field is | |||
| (semi-colon in RFC 822 syntax). If the mailbox name field is | non-NIL, this is the start of a group marker, and the mailbox name | |||
| non-NIL, this is a start of group marker, and the mailbox name | ||||
| field holds the group name phrase. | field holds the group name phrase. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| If the Date, Subject, In-Reply-To, and Message-ID header fields | If the Date, Subject, In-Reply-To, and Message-ID header fields | |||
| are absent in the <xref target='RFC-5322'/> header, the corresponding m ember | are absent in the <xref target="RFC5322" format="default"/> header, the corresponding member | |||
| of the envelope is NIL; if these header fields are present but | of the envelope is NIL; if these header fields are present but | |||
| empty the corresponding member of the envelope is the empty | empty, the corresponding member of the envelope is the empty | |||
| string. | string. | |||
| </t> | ||||
| <list> | <t indent="3"> | |||
| <t> | ||||
| Note: some servers may return a NIL envelope member in the | Note: some servers may return a NIL envelope member in the | |||
| "present but empty" case. Clients SHOULD treat NIL and | "present but empty" case. Clients <bcp14>SHOULD</bcp14> treat NIL a | |||
| empty string as identical. | nd | |||
| the empty string as identical. | ||||
| </t> | </t> | |||
| <t indent="3"> | ||||
| <t> | Note: <xref target="RFC5322" format="default"/> requires that all me | |||
| Note: <xref target='RFC-5322'/> requires that all messages have a va | ssages have a valid | |||
| lid | Date header field. Therefore, for a well-formed message, the date m | |||
| Date header field. Therefore, for a well-formed message the date me | ember in the envelope cannot | |||
| mber in the envelope can | be NIL or the empty string. However, it can be NIL | |||
| not be NIL or the empty string. However it can be NIL | for a malformed or draft message. | |||
| for a malformed or a draft message. | ||||
| </t> | </t> | |||
| <t indent="3"> | ||||
| <t> | Note: <xref target="RFC5322" format="default"/> requires that the In | |||
| Note: <xref target='RFC-5322'/> requires that the In-Reply-To and | -Reply-To and | |||
| Message-ID header fields, if present, have non-empty content. | Message-ID header fields, if present, have non-empty content. | |||
| Therefore, for a well-formed message the in-reply-to and message-id | Therefore, for a well-formed message, the in-reply-to and message-id | |||
| members in the | members in the | |||
| envelope can not be the empty string. However they can still be | envelope cannot be the empty string. However, they can still be | |||
| the empty string for a malformed message. | the empty string for a malformed message. | |||
| </t> | </t> | |||
| </list> | <t> | |||
| </t> | ||||
| <t> | ||||
| If the From, To, Cc, and Bcc header fields are absent in the | If the From, To, Cc, and Bcc header fields are absent in the | |||
| <xref target='RFC-5322'/> header, or are present but empty, the corresp onding | <xref target="RFC5322" format="default"/> header, or are present but em pty, the corresponding | |||
| member of the envelope is NIL. | member of the envelope is NIL. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | If the Sender or Reply-To header fields are absent in the <xref target= | |||
| If the Sender or Reply-To header fields are absent in the <xref target= | "RFC5322" format="default"/> | |||
| 'RFC-5322'/> | ||||
| header, or are present but empty, the server sets the | header, or are present but empty, the server sets the | |||
| corresponding member of the envelope to be the same value as | corresponding member of the envelope to be the same value as | |||
| the from member (the client is not expected to know to do | the from member (the client is not expected to know how to do | |||
| this). | this). </t> | |||
| <list><t> | ||||
| Note: <xref target='RFC-5322'/> requires that all messages have a va | ||||
| lid | ||||
| From header field. Therefore, for a well-formed message the from, s | ||||
| ender, and reply-to | ||||
| members in the envelope can not be NIL. However they can be NIL | ||||
| for a malformed or a draft message. | ||||
| </t></list> | ||||
| </t> | ||||
| </list> | ||||
| </t> | ||||
| <t hangText='FLAGS'> | ||||
| <iref item='FLAGS (fetch result)'/> | ||||
| A parenthesized list of flags that are set for this message.</t> | ||||
| <t hangText='INTERNALDATE'> | ||||
| <iref item='INTERNALDATE (fetch result)'/> | ||||
| A string representing the internal date of the message.</t> | ||||
| <t hangText='RFC822.SIZE'> | ||||
| <iref item='RFC822.SIZE (fetch result)'/> | ||||
| A number expressing the <xref target='RFC-5322'/> size of the message.< | ||||
| /t> | ||||
| <t hangText='UID'> | ||||
| <iref item='UID (fetch result)'/> | ||||
| A number expressing the unique identifier of the message.</t> | ||||
| </list> | ||||
| </t> | ||||
| <t> | ||||
| If the server chooses to send unsolicited FETCH responses, they MUST includ | ||||
| e UID FETCH item. | ||||
| Note that this is a new requirement when compared to RFC 3501. | ||||
| </t> | ||||
| <figure><artwork> | <t indent="3"> | |||
| Example: S: * 23 FETCH (FLAGS (\Seen) RFC822.SIZE 44827 UID 447) | Note: <xref target="RFC5322" format="default"/> requires that all me | |||
| </artwork></figure> | ssages have a valid | |||
| From header field. Therefore, for a well-formed message, the from, | ||||
| sender, and reply-to | ||||
| members in the envelope cannot be NIL. However, they can be NIL | ||||
| for a malformed or draft message. | ||||
| </t> | ||||
| </dd> | ||||
| <dt>FLAGS</dt> | ||||
| <dd> | ||||
| <iref item="FLAGS (fetch result)" subitem="" primary="false"/> | ||||
| A parenthesized list of flags that are set for this message.</dd> | ||||
| <dt>INTERNALDATE</dt> | ||||
| <dd> | ||||
| <iref item="INTERNALDATE (fetch result)" subitem="" primary="false | ||||
| "/> | ||||
| A string representing the internal date of the message.</dd> | ||||
| <dt>RFC822.SIZE</dt> | ||||
| <dd> | ||||
| <iref item="RFC822.SIZE (fetch result)" subitem="" primary="false" | ||||
| /> | ||||
| A number expressing the size of a message, as described in <xref target | ||||
| ="RFC822.SIZE_message_attribute"/>.</dd> | ||||
| <dt>UID</dt> | ||||
| <dd> | ||||
| <iref item="UID (fetch result)" subitem="" primary="false"/> | ||||
| A number expressing the unique identifier of the message.</dd> | ||||
| </dl> | ||||
| <t> | ||||
| If the server chooses to send unsolicited FETCH responses, they <bcp14>MUST | ||||
| </bcp14> include UID FETCH item. | ||||
| Note that this is a new requirement when compared to <xref target="RFC3501" | ||||
| format="default"/>. | ||||
| </t> | ||||
| <t> | ||||
| Example: | ||||
| </t> | ||||
| <sourcecode type=""> | ||||
| S: * 23 FETCH (FLAGS (\Seen) RFC822.SIZE 44827 UID 447) | ||||
| </sourcecode> | ||||
| </section> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| </section> | <name>Server Responses - Command Continuation Request</name> | |||
| <t> | ||||
| <section title='Server Responses - Command Continuation Request'> | ||||
| <t> | ||||
| The command continuation request response is indicated by a "+" token | The command continuation request response is indicated by a "+" token | |||
| instead of a tag. This form of response indicates that the server is | 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 | ready to accept the continuation of a command from the client. The | |||
| remainder of this response is a line of text. | remainder of this response is a line of text. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| This response is used in the AUTHENTICATE command to transmit server | This response is used in the AUTHENTICATE command to transmit server | |||
| data to the client, and request additional client data. This | data to the client and request additional client data. This | |||
| response is also used if an argument to any command is a synchronizing litera l. | response is also used if an argument to any command is a synchronizing litera l. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The client is not permitted to send the octets of the synchronizing literal u nless | The client is not permitted to send the octets of the synchronizing literal u nless | |||
| the server indicates that it is expected. This permits the server to | the server indicates that it is expected. This permits the server to | |||
| process commands and reject errors on a line-by-line basis. The | process commands and reject errors on a line-by-line basis. The | |||
| remainder of the command, including the CRLF that terminates a | remainder of the command, including the CRLF that terminates a | |||
| command, follows the octets of the literal. If there are any | command, follows the octets of the literal. If there are any | |||
| additional command arguments, the literal octets are followed by a | additional command arguments, the literal octets are followed by a | |||
| space and those arguments. | space and those arguments. | |||
| </t> | </t> | |||
| <t> | ||||
| <figure><artwork> | Example: | |||
| Example: C: A001 LOGIN {11} | </t> | |||
| S: + Ready for additional command text | <sourcecode type=""> | |||
| C: FRED FOOBAR {7} | C: A001 LOGIN {11} | |||
| S: + Ready for additional command text | S: + Ready for additional command text | |||
| C: fat man | C: FRED FOOBAR {7} | |||
| S: A001 OK LOGIN completed | S: + Ready for additional command text | |||
| C: A044 BLURDYBLOOP {102856} | C: fat man | |||
| S: A044 BAD No such command as "BLURDYBLOOP" | S: A001 OK LOGIN completed | |||
| </artwork></figure> | C: A044 BLURDYBLOOP {102856} | |||
| S: A044 BAD No such command as "BLURDYBLOOP" | ||||
| </sourcecode> | ||||
| </section> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default" anchor="sample_IMAP4rev2"> | ||||
| <name>Sample IMAP4rev2 Connection</name> | ||||
| </section> | <t> | |||
| The following is a transcript of an IMAP4rev2 connection on a non-TLS port. | ||||
| <section title='Sample IMAP4rev2 connection'> | ||||
| <t> | ||||
| The following is a transcript of an IMAP4rev2 connection on a non TLS port. | ||||
| A long line in this sample is broken for editorial clarity. | A long line in this sample is broken for editorial clarity. | |||
| </t> | </t> | |||
| <sourcecode type=""> | ||||
| <figure><artwork> | ||||
| S: * OK [CAPABILITY STARTTLS AUTH=SCRAM-SHA-256 LOGINDISABLED | S: * OK [CAPABILITY STARTTLS AUTH=SCRAM-SHA-256 LOGINDISABLED | |||
| IMAP4rev2] IMAP4rev2 Service Ready | IMAP4rev2] IMAP4rev2 Service Ready | |||
| C: a000 starttls | C: a000 starttls | |||
| S: a000 OK Proceed with TLS negotiation | S: a000 OK Proceed with TLS negotiation | |||
| <TLS negotiation> | <TLS negotiation> | |||
| C: A001 AUTHENTICATE SCRAM-SHA-256 | C: A001 AUTHENTICATE SCRAM-SHA-256 | |||
| biwsbj11c2VyLHI9ck9wck5HZndFYmVSV2diTkVrcU8= | biwsbj11c2VyLHI9ck9wck5HZndFYmVSV2diTkVrcU8= | |||
| S: + cj1yT3ByTkdmd0ViZVJXZ2JORWtxTyVodllEcFdVYTJSYVRDQWZ1eEZJbGopaE5s | S: + cj1yT3ByTkdmd0ViZVJXZ2JORWtxTyVodllEcFdVYTJSYVRDQWZ1eEZJbGopaE | |||
| RiRrMCxzPVcyMlphSjBTTlk3c29Fc1VFamI2Z1E9PSxpPTQwOTY= | 5sRiRrMCxzPVcyMlphSjBTTlk3c29Fc1VFamI2Z1E9PSxpPTQwOTY= | |||
| C: Yz1iaXdzLHI9ck9wck5HZndFYmVSV2diTkVrcU8laHZZRHBXVWEyUmFUQ0FmdXhG | C: Yz1iaXdzLHI9ck9wck5HZndFYmVSV2diTkVrcU8laHZZRHBXVWEyUmFUQ0FmdXhG | |||
| SWxqKWhObEYkazAscD1kSHpiWmFwV0lrNGpVaE4rVXRlOXl0YWc5empmTUhnc3Ft | SWxqKWhObEYkazAscD1kSHpiWmFwV0lrNGpVaE4rVXRlOXl0YWc5empmTUhnc3Ft | |||
| bWl6N0FuZFZRPQ== | bWl6N0FuZFZRPQ== | |||
| S: + dj02cnJpVFJCaTIzV3BSUi93dHVwK21NaFVaVW4vZEI1bkxUSlJzamw5NUc0PQ== | S: + dj02cnJpVFJCaTIzV3BSUi93dHVwK21NaFVaVW4vZEI1bkxUSlJzamw5NUc0 | |||
| PQ== | ||||
| C: | C: | |||
| S: A001 OK SCRAM-SHA-256 authentication successful | S: A001 OK SCRAM-SHA-256 authentication successful | |||
| C: babc ENABLE IMAP4rev2 | C: babc ENABLE IMAP4rev2 | |||
| S: * ENABLED IMAP4rev2 | S: * ENABLED IMAP4rev2 | |||
| S: babc OK Some capabilities enabled | S: babc OK Some capabilities enabled | |||
| C: a002 select inbox | C: a002 select inbox | |||
| S: * 18 EXISTS | S: * 18 EXISTS | |||
| S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) | S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) | |||
| S: * OK [UIDVALIDITY 3857529045] UIDs valid | S: * OK [UIDVALIDITY 3857529045] UIDs valid | |||
| S: * LIST () "/" INBOX ("OLDNAME" ("inbox")) | S: * LIST () "/" INBOX ("OLDNAME" ("inbox")) | |||
| S: a002 OK [READ-WRITE] SELECT completed | S: a002 OK [READ-WRITE] SELECT completed | |||
| C: a003 fetch 12 full | C: a003 fetch 12 full | |||
| S: * 12 FETCH (FLAGS (\Seen) INTERNALDATE "17-Jul-1996 02:44:25 -0700" | S: * 12 FETCH (FLAGS (\Seen) INTERNALDATE | |||
| RFC822.SIZE 4286 ENVELOPE ("Wed, 17 Jul 1996 02:23:25 -0700 (PDT)" | "17-Jul-1996 02:44:25 -0700" RFC822.SIZE 4286 ENVELOPE ( | |||
| "Wed, 17 Jul 1996 02:23:25 -0700 (PDT)" | ||||
| "IMAP4rev2 WG mtg summary and minutes" | "IMAP4rev2 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")) | (("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 "imap" "cac.washington.edu")) | |||
| ((NIL NIL "minutes" "CNRI.Reston.VA.US") | ((NIL NIL "minutes" "CNRI.Reston.VA.US") | |||
| ("John Klensin" NIL "KLENSIN" "MIT.EDU")) NIL NIL | ("John Klensin" NIL "KLENSIN" "MIT.EDU")) NIL NIL | |||
| "<B27397-0100000@cac.washington.edu>") | "<B27397-0100000@cac.washington.ed>") | |||
| BODY ("TEXT" "PLAIN" ("CHARSET" "US-ASCII") NIL NIL "7BIT" 3028 | BODY ("TEXT" "PLAIN" ("CHARSET" "US-ASCII") NIL NIL "7BIT" | |||
| 92)) | 3028 92)) | |||
| S: a003 OK FETCH completed | S: a003 OK FETCH completed | |||
| C: a004 fetch 12 body[header] | C: a004 fetch 12 body[header] | |||
| S: * 12 FETCH (BODY[HEADER] {342} | S: * 12 FETCH (BODY[HEADER] {342} | |||
| S: Date: Wed, 17 Jul 1996 02:23:25 -0700 (PDT) | S: Date: Wed, 17 Jul 1996 02:23:25 -0700 (PDT) | |||
| S: From: Terry Gray <gray@cac.washington.edu> | S: From: Terry Gray <gray@cac.washington.edu> | |||
| S: Subject: IMAP4rev2 WG mtg summary and minutes | S: Subject: IMAP4rev2 WG mtg summary and minutes | |||
| S: To: imap@cac.washington.edu | S: To: imap@cac.washington.edu | |||
| S: cc: minutes@CNRI.Reston.VA.US, John Klensin <KLENSIN@MIT.EDU> | S: cc: minutes@CNRI.Reston.VA.US, John Klensin <KLENSIN@MIT.EDU> | |||
| S: Message-Id: <B27397-0100000@cac.washington.edu> | S: Message-Id: <B27397-0100000@cac.washington.edu> | |||
| S: MIME-Version: 1.0 | S: MIME-Version: 1.0 | |||
| S: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII | S: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII | |||
| S: | S: | |||
| S: ) | S: ) | |||
| S: a004 OK FETCH completed | S: a004 OK FETCH completed | |||
| C: a005 store 12 +flags \deleted | C: a005 store 12 +flags \deleted | |||
| S: * 12 FETCH (FLAGS (\Seen \Deleted)) | S: * 12 FETCH (FLAGS (\Seen \Deleted)) | |||
| S: a005 OK +FLAGS completed | S: a005 OK +FLAGS completed | |||
| C: a006 logout | C: a006 logout | |||
| S: * BYE IMAP4rev2 server terminating connection | S: * BYE IMAP4rev2 server terminating connection | |||
| S: a006 OK LOGOUT completed | S: a006 OK LOGOUT completed | |||
| </artwork></figure> | </sourcecode> | |||
| </section> | ||||
| </section> | <section anchor="IMAP-ABNF" numbered="true" toc="default"> | |||
| <name>Formal Syntax</name> | ||||
| <section title='Formal Syntax' anchor='IMAP-ABNF'> | <t> | |||
| <t> | ||||
| The following syntax specification uses the Augmented Backus-Naur | The following syntax specification uses the Augmented Backus-Naur | |||
| Form (ABNF) notation as specified in <xref target='ABNF'/>. | Form (ABNF) notation as specified in <xref target="RFC5234" format="default"/ | |||
| </t> | >. | |||
| </t> | ||||
| <t> | <t> | |||
| In the case of alternative or optional rules in which a later rule | 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 | overlaps an earlier rule, the rule that is listed earlier <bcp14>MUST</bcp14> take | |||
| priority. For example, "\Seen" when parsed as a flag is the \Seen | priority. For example, "\Seen" when parsed as a flag is the \Seen | |||
| flag name and not a flag-extension, even though "\Seen" can be parsed | flag name and not a flag-extension, even though "\Seen" can be parsed | |||
| as a flag-extension. Some, but not all, instances of this rule are | as a flag-extension. Some, but not all, instances of this rule are | |||
| noted below. | noted below. | |||
| <list> | </t> | |||
| <t> | <t indent="2" keepWithPrevious="true"> | |||
| Note: <xref target='ABNF'/> rules MUST be followed strictly; in | Note: <xref target="RFC5234" format="default"/> rules <bcp14>MUST</bcp14 | |||
| > be followed strictly; in | ||||
| particular: | particular: | |||
| </t> | </t> | |||
| <t> | <ol spacing="normal" type="1"> | |||
| (1) Except as noted otherwise, all alphabetic characters | <li> Unless otherwise noted, all alphabetic characters | |||
| are case-insensitive. The use of upper or lower case | are case insensitive. The use of uppercase or lowercase | |||
| characters to define token strings is for editorial clarity | characters to define token strings is for editorial clarity | |||
| only. Implementations MUST accept these strings in a | only. Implementations <bcp14>MUST</bcp14> accept these strings in a | |||
| case-insensitive fashion. | case-insensitive fashion. | |||
| </t> | </li> | |||
| <li> | ||||
| <t> | In all cases, SP refers to exactly one space. It is | |||
| (2) In all cases, SP refers to exactly one space. It is | ||||
| NOT permitted to substitute TAB, insert additional spaces, | NOT permitted to substitute TAB, insert additional spaces, | |||
| or otherwise treat SP as being equivalent to LWSP. | or otherwise treat SP as being equivalent to linear whitespace (LWSP). | |||
| </t> | </li> | |||
| <li> | ||||
| <t> | The ASCII NUL character, %x00, <bcp14>MUST NOT</bcp14> be used anywhere, | |||
| (3) The ASCII NUL character, %x00, MUST NOT be used anywhere, | ||||
| with the exception of the OCTET production. | with the exception of the OCTET production. | |||
| </t> | </li> | |||
| </list> | </ol> | |||
| </t> | ||||
| <figure><artwork> | <sourcecode type="abnf"> | |||
| SP = <Defined in RFC 5234> | SP = <Defined in RFC 5234> | |||
| CTL = <Defined in RFC 5234> | CTL = <Defined in RFC 5234> | |||
| CRLF = <Defined in RFC 5234> | CRLF = <Defined in RFC 5234> | |||
| ALPHA = <Defined in RFC 5234> | ALPHA = <Defined in RFC 5234> | |||
| DIGIT = <Defined in RFC 5234> | DIGIT = <Defined in RFC 5234> | |||
| DQUOTE = <Defined in RFC 5234> | DQUOTE = <Defined in RFC 5234> | |||
| OCTET = <Defined in RFC 5234> | OCTET = <Defined in RFC 5234> | |||
| address = "(" addr-name SP addr-adl SP addr-mailbox SP | address = "(" addr-name SP addr-adl SP addr-mailbox SP | |||
| addr-host ")" | addr-host ")" | |||
| addr-adl = nstring | addr-adl = nstring | |||
| ; Holds route from [RFC-5322] obs-route if | ; Holds route from [RFC5322] obs-route if | |||
| ; non-NIL | ; non-NIL | |||
| addr-host = nstring | addr-host = nstring | |||
| ; NIL indicates [RFC-5322] group syntax. | ; NIL indicates [RFC5322] group syntax. | |||
| ; Otherwise, holds [RFC-5322] domain name | ; Otherwise, holds [RFC5322] domain name | |||
| addr-mailbox = nstring | addr-mailbox = nstring | |||
| ; NIL indicates end of [RFC-5322] group; if | ; NIL indicates end of [RFC5322] group; if | |||
| ; non-NIL and addr-host is NIL, holds | ; non-NIL and addr-host is NIL, holds | |||
| ; [RFC-5322] group name. | ; [RFC5322] group name. | |||
| ; Otherwise, holds [RFC-5322] local-part | ; Otherwise, holds [RFC5322] local-part | |||
| ; after removing [RFC-5322] quoting | ; after removing [RFC5322] quoting | |||
| addr-name = nstring | addr-name = nstring | |||
| ; If non-NIL, holds phrase from [RFC-5322] | ; If non-NIL, holds phrase from [RFC5322] | |||
| ; mailbox after removing [RFC-5322] quoting | ; mailbox after removing [RFC5322] quoting | |||
| append = "APPEND" SP mailbox [SP flag-list] [SP date-time] SP | append = "APPEND" SP mailbox [SP flag-list] [SP date-time] | |||
| literal | SP literal | |||
| append-uid = uniqueid | append-uid = uniqueid | |||
| astring = 1*ASTRING-CHAR / string | astring = 1*ASTRING-CHAR / string | |||
| ASTRING-CHAR = ATOM-CHAR / resp-specials | ASTRING-CHAR = ATOM-CHAR / resp-specials | |||
| atom = 1*ATOM-CHAR | atom = 1*ATOM-CHAR | |||
| ATOM-CHAR = <any CHAR except atom-specials> | ATOM-CHAR = <any CHAR except atom-specials> | |||
| atom-specials = "(" / ")" / "{" / SP / CTL / list-wildcards / | atom-specials = "(" / ")" / "{" / SP / CTL / list-wildcards / | |||
| quoted-specials / resp-specials | quoted-specials / resp-specials | |||
| authenticate = "AUTHENTICATE" SP auth-type [SP initial-resp] | authenticate = "AUTHENTICATE" SP auth-type [SP initial-resp] | |||
| *(CRLF base64) | *(CRLF base64) | |||
| auth-type = atom | auth-type = atom | |||
| ; Defined by [SASL] | ; Authentication mechanism name, as defined by | |||
| ; [SASL], Section 7.1 | ||||
| base64 = *(4base64-char) [base64-terminal] | base64 = *(4base64-char) [base64-terminal] | |||
| base64-char = ALPHA / DIGIT / "+" / "/" | base64-char = ALPHA / DIGIT / "+" / "/" | |||
| ; Case-sensitive | ; Case sensitive | |||
| base64-terminal = (2base64-char "==") / (3base64-char "=") | base64-terminal = (2base64-char "==") / (3base64-char "=") | |||
| body = "(" (body-type-1part / body-type-mpart) ")" | body = "(" (body-type-1part / body-type-mpart) ")" | |||
| body-extension = nstring / number / number64 / | body-extension = nstring / number / number64 / | |||
| "(" body-extension *(SP body-extension) ")" | "(" body-extension *(SP body-extension) ")" | |||
| ; Future expansion. Client implementations | ; Future expansion. Client implementations | |||
| ; MUST accept body-extension fields. Server | ; MUST accept body-extension fields. Server | |||
| ; implementations MUST NOT generate | ; implementations MUST NOT generate | |||
| ; body-extension fields except as defined by | ; body-extension fields except as defined by | |||
| ; future standard or standards-track | ; future Standard or Standards Track | |||
| ; revisions of this specification. | ; revisions of this specification. | |||
| body-ext-1part = body-fld-md5 [SP body-fld-dsp [SP body-fld-lang | body-ext-1part = body-fld-md5 [SP body-fld-dsp [SP body-fld-lang | |||
| [SP body-fld-loc *(SP body-extension)]]] | [SP body-fld-loc *(SP body-extension)]]] | |||
| ; MUST NOT be returned on non-extensible | ; MUST NOT be returned on non-extensible | |||
| ; "BODY" fetch | ; "BODY" fetch | |||
| body-ext-mpart = body-fld-param [SP body-fld-dsp [SP body-fld-lang | body-ext-mpart = body-fld-param [SP body-fld-dsp [SP body-fld-lang | |||
| [SP body-fld-loc *(SP body-extension)]]] | [SP body-fld-loc *(SP body-extension)]]] | |||
| ; MUST NOT be returned on non-extensible | ; MUST NOT be returned on non-extensible | |||
| skipping to change at line 8668 ¶ | skipping to change at line 7978 ¶ | |||
| body-fld-lang = nstring / "(" string *(SP string) ")" | body-fld-lang = nstring / "(" string *(SP string) ")" | |||
| body-fld-loc = nstring | body-fld-loc = nstring | |||
| body-fld-lines = number64 | body-fld-lines = number64 | |||
| body-fld-md5 = nstring | body-fld-md5 = nstring | |||
| body-fld-octets = number | body-fld-octets = number | |||
| body-fld-param = "(" string SP string *(SP string SP string) ")" / nil | body-fld-param = "(" string SP string *(SP string SP string) ")" / | |||
| nil | ||||
| body-type-1part = (body-type-basic / body-type-msg / body-type-text) | body-type-1part = (body-type-basic / body-type-msg / body-type-text) | |||
| [SP body-ext-1part] | [SP body-ext-1part] | |||
| body-type-basic = media-basic SP body-fields | body-type-basic = media-basic SP body-fields | |||
| ; MESSAGE subtype MUST NOT be "RFC822" or "GLOBAL" | ; MESSAGE subtype MUST NOT be "RFC822" or | |||
| ; "GLOBAL" | ||||
| body-type-mpart = 1*body SP media-subtype | body-type-mpart = 1*body SP media-subtype | |||
| [SP body-ext-mpart] | [SP body-ext-mpart] | |||
| ; MULTIPART body part | ; MULTIPART body part | |||
| body-type-msg = media-message SP body-fields SP envelope | body-type-msg = media-message SP body-fields SP envelope | |||
| SP body SP body-fld-lines | SP body SP body-fld-lines | |||
| body-type-text = media-text SP body-fields SP body-fld-lines | body-type-text = media-text SP body-fields SP body-fld-lines | |||
| capability = ("AUTH=" auth-type) / atom | capability = ("AUTH=" auth-type) / atom | |||
| ; New capabilities SHOULD be | ; New capabilities SHOULD be | |||
| ; registered with IANA using | ; registered with IANA using the | |||
| ; RFC Required policy, i.e. in | ; RFC Required policy, i.e., in | |||
| ; a standards-track, an experimental | ; a Standards Track, an Experimental, | |||
| ; or an informational RFC. | ; or an Informational RFC. | |||
| capability-data = "CAPABILITY" *(SP capability) SP "IMAP4rev2" | capability-data = "CAPABILITY" *(SP capability) SP "IMAP4rev2" | |||
| *(SP capability) | *(SP capability) | |||
| ; Servers MUST implement the STARTTLS and LOGINDISABLED | ; See Section 6.1.1 for information about | |||
| ; (on cleartext port), AUTH=PLAIN capabilities. | ; required security-related capabilities. | |||
| ; Servers which offer RFC 1730 compatibility MUST | ; Servers that offer RFC 1730 compatibility MUST | |||
| ; list "IMAP4" as the first capability. | ; list "IMAP4" as the first capability. | |||
| ; Servers which offer RFC 3501 compatibility MUST | ; Servers that offer RFC 3501 compatibility MUST | |||
| ; list "IMAP4rev1" as one of capabilities. | ; list "IMAP4rev1" as one of the capabilities. | |||
| CHAR = <defined in [ABNF]> | CHAR = <defined in [ABNF]> | |||
| CHAR8 = %x01-ff | CHAR8 = %x01-ff | |||
| ; any OCTET except NUL, %x00 | ; any OCTET except NUL, %x00 | |||
| charset = atom / quoted | charset = atom / quoted | |||
| childinfo-extended-item = "CHILDINFO" SP "(" | childinfo-extended-item = "CHILDINFO" SP "(" | |||
| list-select-base-opt-quoted | list-select-base-opt-quoted | |||
| *(SP list-select-base-opt-quoted) ")" | *(SP list-select-base-opt-quoted) ")" | |||
| ; Extended data item (mbox-list-extended-item) | ; Extended data item (mbox-list-extended-item) | |||
| ; returned when the RECURSIVEMATCH | ; returned when the RECURSIVEMATCH | |||
| ; selection option is specified. | ; selection option is specified. | |||
| ; Note 1: the CHILDINFO extended data item tag can be | ; Note 1: the CHILDINFO extended data item tag can be | |||
| ; returned with and without surrounding quotes, as per | ; returned with or without surrounding quotes, as per | |||
| ; mbox-list-extended-item-tag production. | ; mbox-list-extended-item-tag production. | |||
| ; Note 2: The selection options are always returned | ; Note 2: The selection options are always returned | |||
| ; quoted, unlike their specification in | ; quoted, unlike their specification in | |||
| ; the extended LIST command. | ; the extended LIST command. | |||
| child-mbox-flag = "\HasChildren" / "\HasNoChildren" | child-mbox-flag = "\HasChildren" / "\HasNoChildren" | |||
| ; attributes for CHILDREN return option, at most one | ; attributes for the CHILDREN return option, at most | |||
| ; possible per LIST response | ; one possible per LIST response | |||
| command = tag SP (command-any / command-auth / command-nonauth / | command = tag SP (command-any / command-auth / | |||
| command-select) CRLF | command-nonauth / command-select) CRLF | |||
| ; Modal based on state | ; Modal based on state | |||
| command-any = "CAPABILITY" / "LOGOUT" / "NOOP" | command-any = "CAPABILITY" / "LOGOUT" / "NOOP" | |||
| ; Valid in all states | ; Valid in all states | |||
| command-auth = append / create / delete / enable / examine / list / | command-auth = append / create / delete / enable / examine / | |||
| Namespace-Command / | list / namespace-command / rename / | |||
| rename / select / status / subscribe / unsubscribe / | select / status / subscribe / unsubscribe / | |||
| idle | idle | |||
| ; Valid only in Authenticated or Selected state | ; Valid only in Authenticated or Selected state | |||
| command-nonauth = login / authenticate / "STARTTLS" | command-nonauth = login / authenticate / "STARTTLS" | |||
| ; Valid only when in Not Authenticated state | ; Valid only when in Not Authenticated state | |||
| command-select = "CLOSE" / "UNSELECT" / "EXPUNGE" / copy / | command-select = "CLOSE" / "UNSELECT" / "EXPUNGE" / copy / | |||
| move / fetch / store / search / uid | move / fetch / store / search / uid | |||
| ; Valid only when in Selected state | ; Valid only when in Selected state | |||
| skipping to change at line 8818 ¶ | skipping to change at line 8130 ¶ | |||
| env-to = "(" 1*address ")" / nil | env-to = "(" 1*address ")" / nil | |||
| esearch-response = "ESEARCH" [search-correlator] [SP "UID"] | esearch-response = "ESEARCH" [search-correlator] [SP "UID"] | |||
| *(SP search-return-data) | *(SP search-return-data) | |||
| ; ESEARCH response replaces SEARCH response | ; ESEARCH response replaces SEARCH response | |||
| ; from IMAP4rev1. | ; from IMAP4rev1. | |||
| examine = "EXAMINE" SP mailbox | examine = "EXAMINE" SP mailbox | |||
| fetch = "FETCH" SP sequence-set SP ("ALL" / "FULL" / "FAST" / | fetch = "FETCH" SP sequence-set SP ( | |||
| "ALL" / "FULL" / "FAST" / | ||||
| fetch-att / "(" fetch-att *(SP fetch-att) ")") | fetch-att / "(" fetch-att *(SP fetch-att) ")") | |||
| fetch-att = "ENVELOPE" / "FLAGS" / "INTERNALDATE" / | fetch-att = "ENVELOPE" / "FLAGS" / "INTERNALDATE" / | |||
| "RFC822.SIZE" / | "RFC822.SIZE" / | |||
| "BODY" ["STRUCTURE"] / "UID" / | "BODY" ["STRUCTURE"] / "UID" / | |||
| "BODY" section [partial] / | "BODY" section [partial] / | |||
| "BODY.PEEK" section [partial] / | "BODY.PEEK" section [partial] / | |||
| "BINARY" [".PEEK"] section-binary [partial] / | "BINARY" [".PEEK"] section-binary [partial] / | |||
| "BINARY.SIZE" section-binary | "BINARY.SIZE" section-binary | |||
| flag = "\Answered" / "\Flagged" / "\Deleted" / | flag = "\Answered" / "\Flagged" / "\Deleted" / | |||
| "\Seen" / "\Draft" / flag-keyword / flag-extension | "\Seen" / "\Draft" / flag-keyword / flag-extension | |||
| ; Does not include "\Recent" | ; Does not include "\Recent" | |||
| flag-extension = "\" atom | flag-extension = "\" atom | |||
| ; Future expansion. Client implementations | ; Future expansion. Client implementations | |||
| ; MUST accept flag-extension flags. Server | ; MUST accept flag-extension flags. Server | |||
| ; implementations MUST NOT generate | ; implementations MUST NOT generate | |||
| ; flag-extension flags except as defined by | ; flag-extension flags except as defined by | |||
| ; future standard or standards-track | ; a future Standard or Standards Track | |||
| ; revisions of this specification. | ; revisions of this specification. | |||
| ; "\Recent" was defined in RFC 3501 | ; "\Recent" was defined in RFC 3501 | |||
| ; and is now deprecated. | ; and is now deprecated. | |||
| flag-fetch = flag | flag-fetch = flag / obsolete-flag-recent | |||
| flag-keyword = "$MDNSent" / "$Forwarded" / "$Junk" / | flag-keyword = "$MDNSent" / "$Forwarded" / "$Junk" / | |||
| "$NotJunk" / "$Phishing" / atom | "$NotJunk" / "$Phishing" / atom | |||
| flag-list = "(" [flag *(SP flag)] ")" | flag-list = "(" [flag *(SP flag)] ")" | |||
| flag-perm = flag / "\*" | flag-perm = flag / "\*" | |||
| greeting = "*" SP (resp-cond-auth / resp-cond-bye) CRLF | greeting = "*" SP (resp-cond-auth / resp-cond-bye) CRLF | |||
| header-fld-name = astring | header-fld-name = astring | |||
| header-list = "(" header-fld-name *(SP header-fld-name) ")" | header-list = "(" header-fld-name *(SP header-fld-name) ")" | |||
| idle = "IDLE" CRLF "DONE" | idle = "IDLE" CRLF "DONE" | |||
| initial-resp = (base64 / "=") | initial-resp = (base64 / "=") | |||
| ; "initial response" defined in | ; "initial response" defined in | |||
| ; Section 5.1 of [RFC4422] | ; Section 4 of [SASL] | |||
| list = "LIST" [SP list-select-opts] SP mailbox SP mbox-or-pat | list = "LIST" [SP list-select-opts] SP | |||
| mailbox SP mbox-or-pat | ||||
| [SP list-return-opts] | [SP list-return-opts] | |||
| list-mailbox = 1*list-char / string | list-mailbox = 1*list-char / string | |||
| list-char = ATOM-CHAR / list-wildcards / resp-specials | list-char = ATOM-CHAR / list-wildcards / resp-specials | |||
| list-return-opt = return-option | list-return-opt = return-option | |||
| ; Note that return-option is the ABNF | ; Note that return-option is the ABNF | |||
| ; non terminal used by RFC 5258 | ; non-terminal used by RFC 5258 | |||
| list-return-opts = "RETURN" SP | list-return-opts = "RETURN" SP | |||
| "(" [list-return-opt *(SP list-return-opt)] ")" | "(" [list-return-opt *(SP list-return-opt)] ")" | |||
| ; list return options, e.g., CHILDREN | ; list return options, e.g., CHILDREN | |||
| list-select-base-opt = "SUBSCRIBED" / option-extension | list-select-base-opt = "SUBSCRIBED" / option-extension | |||
| ; options that can be used by themselves | ; options that can be used by themselves | |||
| list-select-base-opt-quoted = DQUOTE list-select-base-opt DQUOTE | list-select-base-opt-quoted = DQUOTE list-select-base-opt DQUOTE | |||
| list-select-independent-opt = "REMOTE" / option-extension | list-select-independent-opt = "REMOTE" / option-extension | |||
| ; options that do not syntactically interact with | ; options that do not syntactically interact with | |||
| ; other options | ; other options | |||
| list-select-mod-opt = "RECURSIVEMATCH" / option-extension | list-select-mod-opt = "RECURSIVEMATCH" / option-extension | |||
| ; options that require a list-select-base-opt | ; options that require a list-select-base-opt | |||
| ; to also be present | ; to also be present | |||
| list-select-opt = list-select-base-opt / list-select-independent-opt | list-select-opt = list-select-base-opt / list-select-independent-opt | |||
| / list-select-mod-opt | / list-select-mod-opt | |||
| ; An option registration template is described in | ||||
| ; Section 9.3 of this document. | ||||
| list-select-opts = "(" [ | list-select-opts = "(" [ | |||
| (*(list-select-opt SP) list-select-base-opt | (*(list-select-opt SP) list-select-base-opt | |||
| *(SP list-select-opt)) | *(SP list-select-opt)) | |||
| / (list-select-independent-opt | / (list-select-independent-opt | |||
| *(SP list-select-independent-opt)) | *(SP list-select-independent-opt)) | |||
| ] ")" | ] ")" | |||
| ; Any number of options may be in any order. | ; Any number of options may be in any order. | |||
| ; If a list-select-mod-opt appears, then a | ; If a list-select-mod-opt appears, then a | |||
| ; list-select-base-opt must also appear. | ; list-select-base-opt must also appear. | |||
| skipping to change at line 8921 ¶ | skipping to change at line 8233 ¶ | |||
| ; (SUBSCRIBED RECURSIVEMATCH) | ; (SUBSCRIBED RECURSIVEMATCH) | |||
| ; (SUBSCRIBED REMOTE RECURSIVEMATCH) | ; (SUBSCRIBED REMOTE RECURSIVEMATCH) | |||
| ; But does NOT allow these: | ; But does NOT allow these: | |||
| ; (RECURSIVEMATCH) | ; (RECURSIVEMATCH) | |||
| ; (REMOTE RECURSIVEMATCH) | ; (REMOTE RECURSIVEMATCH) | |||
| list-wildcards = "%" / "*" | list-wildcards = "%" / "*" | |||
| literal = "{" number64 ["+"] "}" CRLF *CHAR8 | literal = "{" number64 ["+"] "}" CRLF *CHAR8 | |||
| ; <number64> represents the number of CHAR8s. | ; <number64> represents the number of CHAR8s. | |||
| ; A non-synchronizing literal is distinguished from | ; A non-synchronizing literal is distinguished | |||
| ; a synchronizing literal by presence of the "+" | ; from a synchronizing literal by the presence of | |||
| ; before the closing "}". | ; "+" before the closing "}". | |||
| ; Non synchronizing literals are not allowed when | ; Non-synchronizing literals are not allowed when | |||
| ; sent from server to the client. | ; sent from server to the client. | |||
| literal8 = "~{" number64 "}" CRLF *OCTET | literal8 = "~{" number64 "}" CRLF *OCTET | |||
| ; <number64> represents the number of OCTETs | ; <number64> represents the number of OCTETs | |||
| ; in the response string. | ; in the response string. | |||
| login = "LOGIN" SP userid SP password | login = "LOGIN" SP userid SP password | |||
| mailbox = "INBOX" / astring | mailbox = "INBOX" / astring | |||
| ; INBOX is case-insensitive. All case variants of | ; INBOX is case insensitive. All case variants | |||
| ; INBOX (e.g., "iNbOx") MUST be interpreted as INBOX | ; of INBOX (e.g., "iNbOx") MUST be interpreted as | |||
| ; not as an astring. An astring which consists of | ; INBOX, not as an astring. An astring that | |||
| ; the case-insensitive sequence "I" "N" "B" "O" "X" | ; consists of the case-insensitive sequence | |||
| ; is considered to be INBOX and not an astring. | ; "I" "N" "B" "O" "X" is considered | |||
| ; Refer to section 5.1 for further | ; to be an INBOX and not an astring. | |||
| ; Refer to Section 5.1 for further | ||||
| ; semantic details of mailbox names. | ; semantic details of mailbox names. | |||
| mailbox-data = "FLAGS" SP flag-list / "LIST" SP mailbox-list / | mailbox-data = "FLAGS" SP flag-list / "LIST" SP mailbox-list / | |||
| esearch-response / | esearch-response / | |||
| "STATUS" SP mailbox SP "(" [status-att-list] ")" / | "STATUS" SP mailbox SP "(" [status-att-list] ")" / | |||
| number SP "EXISTS" / Namespace-Response | number SP "EXISTS" / namespace-response / | |||
| obsolete-search-response / | ||||
| obsolete-recent-response | ||||
| ; obsolete-search-response and | ||||
| ; obsolete-recent-response can only be returned | ||||
| ; by servers that support both IMAPrev1 | ||||
| ; and IMAPrev2. | ||||
| mailbox-list = "(" [mbx-list-flags] ")" SP | mailbox-list = "(" [mbx-list-flags] ")" SP | |||
| (DQUOTE QUOTED-CHAR DQUOTE / nil) SP mailbox | (DQUOTE QUOTED-CHAR DQUOTE / nil) SP mailbox | |||
| [SP mbox-list-extended] | [SP mbox-list-extended] | |||
| ; This is the list information pointed to by the ABNF | ; This is the list information pointed to by the ABNF | |||
| ; item "mailbox-data", which is defined in [IMAP4] | ; item "mailbox-data", which is defined above | |||
| mbox-list-extended = "(" [mbox-list-extended-item | mbox-list-extended = "(" [mbox-list-extended-item | |||
| *(SP mbox-list-extended-item)] ")" | *(SP mbox-list-extended-item)] ")" | |||
| mbox-list-extended-item = mbox-list-extended-item-tag SP | mbox-list-extended-item = mbox-list-extended-item-tag SP | |||
| tagged-ext-val | tagged-ext-val | |||
| mbox-list-extended-item-tag = astring | mbox-list-extended-item-tag = astring | |||
| ; The content MUST conform to either "eitem-vendor-tag" | ; The content MUST conform to either | |||
| ; or "eitem-standard-tag" ABNF productions. | ; "eitem-vendor-tag" or "eitem-standard-tag" | |||
| ; ABNF productions. | ||||
| mbox-or-pat = list-mailbox / patterns | mbox-or-pat = list-mailbox / patterns | |||
| mbx-list-flags = *(mbx-list-oflag SP) mbx-list-sflag | mbx-list-flags = *(mbx-list-oflag SP) mbx-list-sflag | |||
| *(SP mbx-list-oflag) / | *(SP mbx-list-oflag) / | |||
| mbx-list-oflag *(SP mbx-list-oflag) | mbx-list-oflag *(SP mbx-list-oflag) | |||
| mbx-list-oflag = "\Noinferiors" / child-mbox-flag / | mbx-list-oflag = "\Noinferiors" / child-mbox-flag / | |||
| "\Subscribed" / "\Remote" / flag-extension | "\Subscribed" / "\Remote" / flag-extension | |||
| ; Other flags; multiple possible per LIST response | ; Other flags; multiple from this list are | |||
| ; possible per LIST response, but each flag | ||||
| ; can only appear once per LIST response | ||||
| mbx-list-sflag = "\NonExistent" / "\Noselect" / "\Marked" / "\Unmarked" | mbx-list-sflag = "\NonExistent" / "\Noselect" / "\Marked" / | |||
| ; Selectability flags; only one per LIST response | "\Unmarked" | |||
| ; Selectability flags; only one per LIST response | ||||
| media-basic = ((DQUOTE ("APPLICATION" / "AUDIO" / "IMAGE" / | media-basic = ((DQUOTE ("APPLICATION" / "AUDIO" / "IMAGE" / | |||
| "FONT" / "MESSAGE" / "MODEL" / "VIDEO" ) DQUOTE) | "FONT" / "MESSAGE" / "MODEL" / "VIDEO" ) DQUOTE) | |||
| / string) | / string) | |||
| SP media-subtype | SP media-subtype | |||
| ; FONT defined in RFC 8081. | ; FONT defined in [RFC8081]. | |||
| ; MODEL defined in RFC 2077. | ; MODEL defined in [RFC2077]. | |||
| ; Other top level media types | ; Other top-level media types | |||
| ; are defined in [MIME-IMT]. | ; are defined in [MIME-IMT]. | |||
| media-message = DQUOTE "MESSAGE" DQUOTE SP | media-message = DQUOTE "MESSAGE" DQUOTE SP | |||
| DQUOTE ("RFC822" / "GLOBAL") DQUOTE | DQUOTE ("RFC822" / "GLOBAL") DQUOTE | |||
| ; Defined in [MIME-IMT] | ; Defined in [MIME-IMT] | |||
| media-subtype = string | media-subtype = string | |||
| ; Defined in [MIME-IMT] | ; Defined in [MIME-IMT] | |||
| media-text = DQUOTE "TEXT" DQUOTE SP media-subtype | media-text = DQUOTE "TEXT" DQUOTE SP media-subtype | |||
| skipping to change at line 9005 ¶ | skipping to change at line 8328 ¶ | |||
| message-data = nz-number SP ("EXPUNGE" / ("FETCH" SP msg-att)) | message-data = nz-number SP ("EXPUNGE" / ("FETCH" SP msg-att)) | |||
| move = "MOVE" SP sequence-set SP mailbox | move = "MOVE" SP sequence-set SP mailbox | |||
| msg-att = "(" (msg-att-dynamic / msg-att-static) | msg-att = "(" (msg-att-dynamic / msg-att-static) | |||
| *(SP (msg-att-dynamic / msg-att-static)) ")" | *(SP (msg-att-dynamic / msg-att-static)) ")" | |||
| msg-att-dynamic = "FLAGS" SP "(" [flag-fetch *(SP flag-fetch)] ")" | msg-att-dynamic = "FLAGS" SP "(" [flag-fetch *(SP flag-fetch)] ")" | |||
| ; MAY change for a message | ; MAY change for a message | |||
| msg-att-static = "ENVELOPE" SP envelope / "INTERNALDATE" SP date-time / | msg-att-static = "ENVELOPE" SP envelope / | |||
| "INTERNALDATE" SP date-time / | ||||
| "RFC822.SIZE" SP number64 / | "RFC822.SIZE" SP number64 / | |||
| "BODY" ["STRUCTURE"] SP body / | "BODY" ["STRUCTURE"] SP body / | |||
| "BODY" section ["<" number ">"] SP nstring / | "BODY" section ["<" number ">"] SP nstring / | |||
| "BINARY" section-binary SP (nstring / literal8) / | "BINARY" section-binary SP (nstring / literal8) / | |||
| "BINARY.SIZE" section-binary SP number / | "BINARY.SIZE" section-binary SP number / | |||
| "UID" SP uniqueid | "UID" SP uniqueid | |||
| ; MUST NOT change for a message | ; MUST NOT change for a message | |||
| name-component = 1*UTF8-CHAR | name-component = 1*UTF8-CHAR | |||
| ; MUST NOT contain ".", "/", "%", or "*" | ; MUST NOT contain ".", "/", "%", or "*" | |||
| namespace = nil / "(" 1*namespace-descr ")" | namespace = nil / "(" 1*namespace-descr ")" | |||
| skipping to change at line 9032 ¶ | skipping to change at line 8356 ¶ | |||
| (DQUOTE QUOTED-CHAR DQUOTE / nil) | (DQUOTE QUOTED-CHAR DQUOTE / nil) | |||
| [namespace-response-extensions] ")" | [namespace-response-extensions] ")" | |||
| namespace-response-extensions = *namespace-response-extension | namespace-response-extensions = *namespace-response-extension | |||
| namespace-response-extension = SP string SP | namespace-response-extension = SP string SP | |||
| "(" string *(SP string) ")" | "(" string *(SP string) ")" | |||
| namespace-response = "NAMESPACE" SP namespace | namespace-response = "NAMESPACE" SP namespace | |||
| SP namespace SP namespace | SP namespace SP namespace | |||
| ; The first Namespace is the Personal Namespace(s). | ; The first Namespace is the Personal Namespace(s). | |||
| ; The second Namespace is the Other Users' | ; The second Namespace is the Other Users' | |||
| ; Namespace(s). | ; Namespace(s). | |||
| ; The third Namespace is the Shared Namespace(s). | ; The third Namespace is the Shared Namespace(s). | |||
| nil = "NIL" | nil = "NIL" | |||
| nstring = string / nil | nstring = string / nil | |||
| number = 1*DIGIT | number = 1*DIGIT | |||
| ; Unsigned 32-bit integer | ; Unsigned 32-bit integer | |||
| ; (0 <= n < 4,294,967,296) | ; (0 <= n < 4,294,967,296) | |||
| number64 = 1*DIGIT | number64 = 1*DIGIT | |||
| skipping to change at line 9057 ¶ | skipping to change at line 8381 ¶ | |||
| ; (0 <= n <= 9,223,372,036,854,775,807) | ; (0 <= n <= 9,223,372,036,854,775,807) | |||
| nz-number = digit-nz *DIGIT | nz-number = digit-nz *DIGIT | |||
| ; Non-zero unsigned 32-bit integer | ; Non-zero unsigned 32-bit integer | |||
| ; (0 < n < 4,294,967,296) | ; (0 < n < 4,294,967,296) | |||
| nz-number64 = digit-nz *DIGIT | nz-number64 = digit-nz *DIGIT | |||
| ; Unsigned 63-bit integer | ; Unsigned 63-bit integer | |||
| ; (0 < n <= 9,223,372,036,854,775,807) | ; (0 < n <= 9,223,372,036,854,775,807) | |||
| obsolete-flag-recent = "\Recent" | ||||
| obsolete-recent-response = number SP "RECENT" | ||||
| obsolete-search-response = "SEARCH" *(SP nz-number) | ||||
| oldname-extended-item = "OLDNAME" SP "(" mailbox ")" | oldname-extended-item = "OLDNAME" SP "(" mailbox ")" | |||
| ; Extended data item (mbox-list-extended-item) | ; Extended data item (mbox-list-extended-item) | |||
| ; returned in a LIST response when a mailbox is | ; returned in a LIST response when a mailbox is | |||
| ; renamed or deleted. Also returned when | ; renamed or deleted. Also returned when | |||
| ; the server canonicalized the provided mailbox | ; the server canonicalized the provided mailbox | |||
| ; name. | ; name. | |||
| ; Note 1: the OLDNAME tag can be returned | ; Note 1: the OLDNAME tag can be returned | |||
| ; with or without surrounding quotes, as per | ; with or without surrounding quotes, as per | |||
| ; mbox-list-extended-item-tag production. | ; mbox-list-extended-item-tag production. | |||
| skipping to change at line 9085 ¶ | skipping to change at line 8415 ¶ | |||
| option-val-comp *(SP option-val-comp) / | option-val-comp *(SP option-val-comp) / | |||
| "(" option-val-comp ")" | "(" option-val-comp ")" | |||
| option-value = "(" option-val-comp ")" | option-value = "(" option-val-comp ")" | |||
| option-vendor-tag = vendor-token "-" atom | option-vendor-tag = vendor-token "-" atom | |||
| ; a vendor-specific option, non-standard | ; a vendor-specific option, non-standard | |||
| partial-range = number64 ["." nz-number64] | partial-range = number64 ["." nz-number64] | |||
| ; Copied from RFC 5092 (IMAP URL) | ; Copied from RFC 5092 (IMAP URL) | |||
| ; and updated to support 64bit sizes. | ; and updated to support 64-bit sizes. | |||
| partial = "<" number64 "." nz-number64 ">" | partial = "<" number64 "." nz-number64 ">" | |||
| ; Partial FETCH request. 0-based offset of | ; Partial FETCH request. 0-based offset of | |||
| ; the first octet, followed by the number of octets | ; the first octet, followed by the number of | |||
| ; in the fragment. | ; octets in the fragment. | |||
| password = astring | password = astring | |||
| patterns = "(" list-mailbox ")" | patterns = "(" list-mailbox ")" | |||
| ; [RFC5258] supports multiple patterns, | ; [RFC5258] supports multiple patterns, | |||
| ; but this document only requires one | ; but this document only requires one | |||
| ; to be supported. | ; to be supported. | |||
| ; If the server is also implementing | ; If the server is also implementing | |||
| ; [RFC5258], "patterns" syntax from that | ; [RFC5258], the "patterns" syntax from | |||
| ; document must be followed. | ; that document must be followed. | |||
| quoted = DQUOTE *QUOTED-CHAR DQUOTE | quoted = DQUOTE *QUOTED-CHAR DQUOTE | |||
| QUOTED-CHAR = <any TEXT-CHAR except quoted-specials> / | QUOTED-CHAR = <any TEXT-CHAR except quoted-specials> / | |||
| "\" quoted-specials / UTF8-2 / UTF8-3 / UTF8-4 | "\" quoted-specials / UTF8-2 / UTF8-3 / UTF8-4 | |||
| quoted-specials = DQUOTE / "\" | quoted-specials = DQUOTE / "\" | |||
| rename = "RENAME" SP mailbox SP mailbox | rename = "RENAME" SP mailbox SP mailbox | |||
| ; Use of INBOX as a destination gives a NO error | ; Use of INBOX as a destination gives a NO error | |||
| response = *(continue-req / response-data) response-done | response = *(continue-req / response-data) response-done | |||
| response-data = "*" SP (resp-cond-state / resp-cond-bye / | response-data = "*" SP (resp-cond-state / resp-cond-bye / | |||
| skipping to change at line 9147 ¶ | skipping to change at line 8477 ¶ | |||
| resp-specials = "]" | resp-specials = "]" | |||
| resp-text = ["[" resp-text-code "]" SP] [text] | resp-text = ["[" resp-text-code "]" SP] [text] | |||
| resp-text-code = "ALERT" / | resp-text-code = "ALERT" / | |||
| "BADCHARSET" [SP "(" charset *(SP charset) ")" ] / | "BADCHARSET" [SP "(" charset *(SP charset) ")" ] / | |||
| capability-data / "PARSE" / | capability-data / "PARSE" / | |||
| "PERMANENTFLAGS" SP | "PERMANENTFLAGS" SP | |||
| "(" [flag-perm *(SP flag-perm)] ")" / | "(" [flag-perm *(SP flag-perm)] ")" / | |||
| "READ-ONLY" / "READ-WRITE" / "TRYCREATE" / | "READ-ONLY" / "READ-WRITE" / "TRYCREATE" / | |||
| "UIDNEXT" SP nz-number / "UIDVALIDITY" SP nz-number / | "UIDNEXT" SP nz-number / | |||
| "UIDVALIDITY" SP nz-number / | ||||
| resp-code-apnd / resp-code-copy / "UIDNOTSTICKY" / | resp-code-apnd / resp-code-copy / "UIDNOTSTICKY" / | |||
| "UNAVAILABLE" / "AUTHENTICATIONFAILED" / | "UNAVAILABLE" / "AUTHENTICATIONFAILED" / | |||
| "AUTHORIZATIONFAILED" / "EXPIRED" / | "AUTHORIZATIONFAILED" / "EXPIRED" / | |||
| "PRIVACYREQUIRED" / "CONTACTADMIN" / "NOPERM" / | "PRIVACYREQUIRED" / "CONTACTADMIN" / "NOPERM" / | |||
| "INUSE" / "EXPUNGEISSUED" / "CORRUPTION" / | "INUSE" / "EXPUNGEISSUED" / "CORRUPTION" / | |||
| "SERVERBUG" / "CLIENTBUG" / "CANNOT" / | "SERVERBUG" / "CLIENTBUG" / "CANNOT" / | |||
| "LIMIT" / "OVERQUOTA" / "ALREADYEXISTS" / | "LIMIT" / "OVERQUOTA" / "ALREADYEXISTS" / | |||
| "NONEXISTENT" / "NOTSAVED" / "HASCHILDREN" / | "NONEXISTENT" / "NOTSAVED" / "HASCHILDREN" / | |||
| "CLOSED" / | "CLOSED" / | |||
| "UNKNOWN-CTE" / | "UNKNOWN-CTE" / | |||
| atom [SP 1*<any TEXT-CHAR except "]">] | atom [SP 1*<any TEXT-CHAR except "]">] | |||
| return-option = "SUBSCRIBED" / "CHILDREN" / status-option / | return-option = "SUBSCRIBED" / "CHILDREN" / status-option / | |||
| option-extension | option-extension | |||
| search = "SEARCH" [search-return-opts] | search = "SEARCH" [search-return-opts] | |||
| SP search-program | SP search-program | |||
| search-correlator = SP "(" "TAG" SP tag-string ")" | search-correlator = SP "(" "TAG" SP tag-string ")" | |||
| search-key = "ALL" / "ANSWERED" / "BCC" SP astring / | search-key = "ALL" / "ANSWERED" / "BCC" SP astring / | |||
| skipping to change at line 9234 ¶ | skipping to change at line 8565 ¶ | |||
| ; Data for the returned search option. | ; Data for the returned search option. | |||
| ; A single "nz-number"/"number"/"number64" value | ; A single "nz-number"/"number"/"number64" value | |||
| ; can be returned as an atom (i.e., without | ; can be returned as an atom (i.e., without | |||
| ; quoting). A sequence-set can be returned | ; quoting). A sequence-set can be returned | |||
| ; as an atom as well. | ; as an atom as well. | |||
| section = "[" [section-spec] "]" | section = "[" [section-spec] "]" | |||
| section-binary = "[" [section-part] "]" | section-binary = "[" [section-part] "]" | |||
| section-msgtext = "HEADER" / "HEADER.FIELDS" [".NOT"] SP header-list / | section-msgtext = "HEADER" / | |||
| "HEADER.FIELDS" [".NOT"] SP header-list / | ||||
| "TEXT" | "TEXT" | |||
| ; top-level or MESSAGE/RFC822 or MESSAGE/GLOBAL part | ; top-level or MESSAGE/RFC822 or | |||
| ; MESSAGE/GLOBAL part | ||||
| section-part = nz-number *("." nz-number) | section-part = nz-number *("." nz-number) | |||
| ; body part reference. | ; body part reference. | |||
| ; Allows for accessing nested body parts. | ; Allows for accessing nested body parts. | |||
| section-spec = section-msgtext / (section-part ["." section-text]) | section-spec = section-msgtext / (section-part ["." section-text]) | |||
| section-text = section-msgtext / "MIME" | section-text = section-msgtext / "MIME" | |||
| ; text other than actual body part (headers, etc.) | ; text other than actual body part (headers, | |||
| ; etc.) | ||||
| select = "SELECT" SP mailbox | select = "SELECT" SP mailbox | |||
| seq-number = nz-number / "*" | seq-number = nz-number / "*" | |||
| ; message sequence number (COPY, FETCH, STORE | ; message sequence number (COPY, FETCH, STORE | |||
| ; commands) or unique identifier (UID COPY, | ; commands) or unique identifier (UID COPY, | |||
| ; UID FETCH, UID STORE commands). | ; UID FETCH, UID STORE commands). | |||
| ; * represents the largest number in use. In | ; * represents the largest number in use. In | |||
| ; the case of message sequence numbers, it is | ; the case of message sequence numbers, it is | |||
| ; the number of messages in a non-empty mailbox. | ; the number of messages in a non-empty mailbox. | |||
| skipping to change at line 9269 ¶ | skipping to change at line 8603 ¶ | |||
| ; mailbox's current UIDNEXT value. | ; mailbox's current UIDNEXT value. | |||
| ; The server should respond with a tagged BAD | ; The server should respond with a tagged BAD | |||
| ; response to a command that uses a message | ; response to a command that uses a message | |||
| ; sequence number greater than the number of | ; sequence number greater than the number of | |||
| ; messages in the selected mailbox. This | ; messages in the selected mailbox. This | |||
| ; includes "*" if the selected mailbox is empty. | ; includes "*" if the selected mailbox is empty. | |||
| seq-range = seq-number ":" seq-number | seq-range = seq-number ":" seq-number | |||
| ; two seq-number values and all values between | ; two seq-number values and all values between | |||
| ; these two regardless of order. | ; these two regardless of order. | |||
| ; Example: 2:4 and 4:2 are equivalent and indicate | ; Example: 2:4 and 4:2 are equivalent and | |||
| ; values 2, 3, and 4. | ; indicate values 2, 3, and 4. | |||
| ; Example: a unique identifier sequence range of | ; Example: a unique identifier sequence range of | |||
| ; 3291:* includes the UID of the last message in | ; 3291:* includes the UID of the last message in | |||
| ; the mailbox, even if that value is less than 3291. | ; the mailbox, even if that value is less than | |||
| ; 3291. | ||||
| sequence-set = (seq-number / seq-range) ["," sequence-set] | sequence-set = (seq-number / seq-range) ["," sequence-set] | |||
| ; set of seq-number values, regardless of order. | ; set of seq-number values, regardless of order. | |||
| ; Servers MAY coalesce overlaps and/or execute the | ; Servers MAY coalesce overlaps and/or execute | |||
| ; sequence in any order. | ; the sequence in any order. | |||
| ; Example: a message sequence number set of | ; Example: a message sequence number set of | |||
| ; 2,4:7,9,12:* for a mailbox with 15 messages is | ; 2,4:7,9,12:* for a mailbox with 15 messages is | |||
| ; equivalent to 2,4,5,6,7,9,12,13,14,15 | ; equivalent to 2,4,5,6,7,9,12,13,14,15 | |||
| ; Example: a message sequence number set of *:4,5:7 | ; Example: a message sequence number set of | |||
| ; for a mailbox with 10 messages is equivalent to | ; *:4,5:7 for a mailbox with 10 messages is | |||
| ; 10,9,8,7,6,5,4,5,6,7 and MAY be reordered and | ; equivalent to 10,9,8,7,6,5,4,5,6,7 and MAY | |||
| ; overlap coalesced to be 4,5,6,7,8,9,10. | ; be reordered and overlap coalesced to be | |||
| ; 4,5,6,7,8,9,10. | ||||
| sequence-set =/ seq-last-command | sequence-set =/ seq-last-command | |||
| ; Allow for "result of the last command" indicator. | ; Allow for "result of the last command" | |||
| ; indicator. | ||||
| seq-last-command = "$" | seq-last-command = "$" | |||
| status = "STATUS" SP mailbox SP | status = "STATUS" SP mailbox SP | |||
| "(" status-att *(SP status-att) ")" | "(" status-att *(SP status-att) ")" | |||
| status-att = "MESSAGES" / "UIDNEXT" / "UIDVALIDITY" / | status-att = "MESSAGES" / "UIDNEXT" / "UIDVALIDITY" / | |||
| "UNSEEN" / "DELETED" / "SIZE" | "UNSEEN" / "DELETED" / "SIZE" | |||
| status-att-val = ("MESSAGES" SP number) / | status-att-val = ("MESSAGES" SP number) / | |||
| skipping to change at line 9324 ¶ | skipping to change at line 8661 ¶ | |||
| store = "STORE" SP sequence-set SP store-att-flags | store = "STORE" SP sequence-set SP store-att-flags | |||
| store-att-flags = (["+" / "-"] "FLAGS" [".SILENT"]) SP | store-att-flags = (["+" / "-"] "FLAGS" [".SILENT"]) SP | |||
| (flag-list / (flag *(SP flag))) | (flag-list / (flag *(SP flag))) | |||
| string = quoted / literal | string = quoted / literal | |||
| subscribe = "SUBSCRIBE" SP mailbox | subscribe = "SUBSCRIBE" SP mailbox | |||
| tag = 1*<any ASTRING-CHAR except "+"> | tag = 1*<any ASTRING-CHAR except "+"> | |||
| tag-string = astring | tag-string = astring | |||
| ; <tag> represented as <astring> | ; <tag> represented as <astring> | |||
| tagged-ext-label = tagged-label-fchar *tagged-label-char | tagged-ext-label = tagged-label-fchar *tagged-label-char | |||
| ; Is a valid RFC 3501 "atom". | ; Is a valid RFC 3501 "atom". | |||
| tagged-label-fchar = ALPHA / "-" / "_" / "." | tagged-label-fchar = ALPHA / "-" / "_" / "." | |||
| tagged-label-char = tagged-label-fchar / DIGIT / ":" | tagged-label-char = tagged-label-fchar / DIGIT / ":" | |||
| tagged-ext-comp = astring / | tagged-ext-comp = astring / | |||
| tagged-ext-comp *(SP tagged-ext-comp) / | tagged-ext-comp *(SP tagged-ext-comp) / | |||
| "(" tagged-ext-comp ")" | "(" tagged-ext-comp ")" | |||
| ; Extensions that follow this general | ; Extensions that follow this general | |||
| ; syntax should use nstring instead of | ; syntax should use nstring instead of | |||
| ; astring when appropriate in the context | ; astring when appropriate in the context | |||
| ; of the extension. | ; of the extension. | |||
| ; Note that a message set or a "number" | ; Note that a message set or a "number" | |||
| ; can always be represented as an "atom". | ; can always be represented as an "atom". | |||
| ; An URL should be represented as | ; A URL should be represented as | |||
| ; a "quoted" string. | ; a "quoted" string. | |||
| tagged-ext-simple = sequence-set / number / number64 | tagged-ext-simple = sequence-set / number / number64 | |||
| tagged-ext-val = tagged-ext-simple / | tagged-ext-val = tagged-ext-simple / | |||
| "(" [tagged-ext-comp] ")" | "(" [tagged-ext-comp] ")" | |||
| text = 1*(TEXT-CHAR / UTF8-2 / UTF8-3 / UTF8-4) | text = 1*(TEXT-CHAR / UTF8-2 / UTF8-3 / UTF8-4) | |||
| ; Non ASCII text can only be returned | ; Non-ASCII text can only be returned | |||
| ; after ENABLE IMAP4rev2 command | ; after ENABLE IMAP4rev2 command | |||
| TEXT-CHAR = <any CHAR except CR and LF> | TEXT-CHAR = <any CHAR except CR and LF> | |||
| time = 2DIGIT ":" 2DIGIT ":" 2DIGIT | time = 2DIGIT ":" 2DIGIT ":" 2DIGIT | |||
| ; Hours minutes seconds | ; Hours minutes seconds | |||
| uid = "UID" SP | uid = "UID" SP | |||
| (copy / move / fetch / search / store / uid-expunge) | (copy / move / fetch / search / store / | |||
| uid-expunge) | ||||
| ; Unique identifiers used instead of message | ; Unique identifiers used instead of message | |||
| ; sequence numbers | ; sequence numbers | |||
| uid-expunge = "EXPUNGE" SP sequence-set | uid-expunge = "EXPUNGE" SP sequence-set | |||
| ; Unique identifiers used instead of message | ; Unique identifiers used instead of message | |||
| ; sequence numbers | ; sequence numbers | |||
| uid-set = (uniqueid / uid-range) *("," uid-set) | uid-set = (uniqueid / uid-range) *("," uid-set) | |||
| uid-range = (uniqueid ":" uniqueid) | uid-range = (uniqueid ":" uniqueid) | |||
| ; two uniqueid values and all values | ; two uniqueid values and all values | |||
| ; between these two regards of order. | ; between these two regardless of order. | |||
| ; Example: 2:4 and 4:2 are equivalent. | ; Example: 2:4 and 4:2 are equivalent. | |||
| uniqueid = nz-number | uniqueid = nz-number | |||
| ; Strictly ascending | ; Strictly ascending | |||
| unsubscribe = "UNSUBSCRIBE" SP mailbox | unsubscribe = "UNSUBSCRIBE" SP mailbox | |||
| userid = astring | userid = astring | |||
| UTF8-CHAR = <Defined in Section 4 of RFC 3629> | UTF8-CHAR = <Defined in Section 4 of RFC 3629> | |||
| UTF8-2 = <Defined in Section 4 of RFC 3629> | UTF8-2 = <Defined in Section 4 of RFC 3629> | |||
| UTF8-3 = <Defined in Section 4 of RFC 3629> | UTF8-3 = <Defined in Section 4 of RFC 3629> | |||
| UTF8-4 = <Defined in Section 4 of RFC 3629> | UTF8-4 = <Defined in Section 4 of RFC 3629> | |||
| vendor-token = "vendor." name-component | vendor-token = "vendor." name-component | |||
| ; Definition copied from RFC 2244. | ; Definition copied from RFC 2244. | |||
| ; MUST be registered with IANA | ; MUST be registered with IANA | |||
| zone = ("+" / "-") 4DIGIT | zone = ("+" / "-") 4DIGIT | |||
| ; Signed four-digit value of hhmm representing | ; Signed four-digit value of hhmm representing | |||
| ; hours and minutes east of Greenwich (that is, | ; hours and minutes east of Greenwich (that is, | |||
| ; the amount that the given time differs from | ; the amount that the given time differs from | |||
| ; Universal Time). Subtracting the timezone | ; Universal Time). Subtracting the timezone | |||
| ; from the given time will give the UT form. | ; from the given time will give the UT form. | |||
| ; The Universal Time zone is "+0000". | ; The Universal Time zone is "+0000". | |||
| </artwork></figure> | </sourcecode> | |||
| </section> | ||||
| </section> | <section numbered="true" toc="default"> | |||
| <name>Author's Note</name> | ||||
| <section title="Author's Note"> | <t> | |||
| This document is a revision or rewrite of earlier documents and | ||||
| <t> | supercedes the protocol specification in those documents: <xref target="RFC35 | |||
| This document is a revision or rewrite of earlier documents, and | 01" format="default"/>, <xref target="RFC2060" format="default"/>, | |||
| supercedes the protocol specification in those documents: RFC 3501, RFC 2060, | <xref target="RFC1730" format="default"/>, unpublished IMAP2bis.TXT document, | |||
| RFC 1730, unpublished IMAP2bis.TXT document, RFC 1176, and RFC 1064. | <xref target="RFC1176" format="default"/>, and <xref target="RFC1064" format="d | |||
| </t> | efault"/>. | |||
| </t> | ||||
| </section> | </section> | |||
| <section anchor="sec-cons" numbered="true" toc="default"> | ||||
| <section title='Security Considerations' anchor='sec-cons'> | <name>Security Considerations</name> | |||
| <t> | ||||
| <t> | ||||
| IMAP4rev2 protocol transactions, including electronic mail data, are | IMAP4rev2 protocol transactions, including electronic mail data, are | |||
| sent in the clear over the network exposing them to possible eavesdropping an d | sent in the clear over the network, exposing them to possible eavesdropping a nd | |||
| manipulation unless protection is negotiated. | manipulation unless protection is negotiated. | |||
| This can be accomplished either by the use of Implicit TLS port, | This can be accomplished by use of the Implicit TLS port, | |||
| STARTTLS command, negotiated confidentiality protection in the AUTHENTICATE c | the STARTTLS command, negotiated confidentiality protection in the AUTHENTICA | |||
| ommand, | TE command, | |||
| or some other protection mechanism. | or some other protection mechanism. | |||
| </t> | </t> | |||
| <section numbered="true" toc="default"> | ||||
| <section title='TLS related Security Considerations'> | <name>TLS-Related Security Considerations</name> | |||
| <t>This section applies to use of both the STARTTLS command and the Impl | ||||
| <t>This section applies to both use of STARTTLS command and Implicit TLS port | icit TLS port.</t> | |||
| .</t> | <t> | |||
| IMAP client and server implementations <bcp14>MUST</bcp14> comply with releva | ||||
| <t> | nt | |||
| IMAP client and server implementations MUST comply with relevant | TLS recommendations from <xref target="RFC8314" format="default"/>. | |||
| TLS recommendations from <xref target='RFC8314'/>. | If recommendations/requirements in this document conflict with recommendation | |||
| <!--Add some specific section references?--> | s | |||
| </t> | from <xref target="RFC8314" format="default"/>, for example in regards to TLS | |||
| ciphersuites, | ||||
| recommendations from this document take precedence. | ||||
| </t> | ||||
| <t> | <t> | |||
| Clients and servers MUST implement <xref target='TLS-1.2'>TLS 1.2</xref> or n | Clients and servers <bcp14>MUST</bcp14> implement <xref target="RFC5246" form | |||
| ewer. | at="default">TLS 1.2</xref> or newer. | |||
| Use of TLS 1.3 <xref target='TLS-1.3'/> is RECOMMENDED. | Use of TLS 1.3 <xref target="RFC8446" format="default"/> is <bcp14>RECOMMENDE | |||
| D</bcp14>. | ||||
| TLS 1.2 may be used only in cases where the other party has not yet implement ed TLS 1.3. | TLS 1.2 may be used only in cases where the other party has not yet implement ed TLS 1.3. | |||
| <!--From RFC8314: | Additionally, when using TLS 1.2, IMAP implementations <bcp14>MUST</bcp14> im | |||
| All Mail Access Servers and Mail Submission Servers SHOULD | plement the | |||
| implement the recommended TLS ciphersuites described in [RFC7525] | ||||
| or a future BCP or Standards Track revision of that document. | ||||
| --> | ||||
| Additionally, when using TLS 1.2, IMAP implementations MUST implement | ||||
| TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 cipher suite. | TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 cipher suite. | |||
| <!--While TLS_RSA_WITH_AES_128_CBC_SHA is mandatory-to-implement in the origi | This is important as it ensures that any two compliant implementations can be | |||
| nal TLS 1.2 RFC, | ||||
| it is not longer "recommended" in the IANA registry. | ||||
| TLS_RSA_WITH_AES_128_CBC_SHA256 is marginally better, but it is still | ||||
| not recommended in the IANA registry.--> | ||||
| This is important as it assures that any two compliant implementations can be | ||||
| configured to interoperate. | configured to interoperate. | |||
| Other TLS cipher suites recommended in RFC 7525 <xref target='RFC7525'/> | Other TLS cipher suites recommended in RFC 7525 <xref target="RFC7525" format | |||
| are RECOMMENDED: | ="default"/> | |||
| TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 and | are <bcp14>RECOMMENDED</bcp14>: | |||
| TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, and | ||||
| TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384. | TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384. | |||
| <!--Mozilla recommends the following TLS 1.2 ciphers for "Intermediate" compatib | All other cipher suites are <bcp14>OPTIONAL</bcp14>. | |||
| ility: | Note that this is a change from <xref target="RFC2595" sectionFormat="of" sec | |||
| tion="2.1"/>. | ||||
| TLS_ECDHE_ECDSA_AES128_GCM_SHA256 | </t> | |||
| TLS_ECDHE_RSA_AES128_GCM_SHA256 | <t>The list of mandatory-to-implement TLS 1.3 cipher suites is described | |||
| TLS_ECDHE_ECDSA_AES256_GCM_SHA384 | in | |||
| TLS_ECDHE_RSA_AES256_GCM_SHA384 | <xref target="RFC8446" sectionFormat="of" section="9.1"/>.</t> | |||
| TLS_ECDHE_ECDSA_CHACHA20_POLY1305 | <t> | |||
| TLS_ECDHE_RSA_CHACHA20_POLY1305 | During the TLS negotiation <xref target="RFC8446" format="default"/> <xref ta | |||
| TLS_DHE_RSA_AES128_GCM_SHA256 | rget="RFC5246" format="default"/>, | |||
| TLS_DHE_RSA_AES256_GCM_SHA384 | the client <bcp14>MUST</bcp14> check its understanding | |||
| --> | ||||
| All other cipher suites are OPTIONAL. | ||||
| Note that this is a change from section 2.1 of <xref target='IMAP-TLS'/>. | ||||
| </t> | ||||
| <t>The list of mandatory-to-implement TLS 1.3 cipher suites is described in | ||||
| Section 9.1 of <xref target='TLS-1.3'/>.</t> | ||||
| <t> | ||||
| During the TLS negotiation <xref target='TLS-1.3'/><xref target='TLS-1.2'/>, | ||||
| the client MUST check its understanding | ||||
| of the server hostname against the server's identity as presented in | of the server hostname against the server's identity as presented in | |||
| the server Certificate message, in order to prevent on-path | the server Certificate message, in order to prevent on-path | |||
| attackers attempting to masquerade as the server. | attackers attempting to masquerade as the server. | |||
| This procedure is described in <xref target='RFC7817'/>. | This procedure is described in <xref target="RFC7817" format="default"/>. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Both the client and server <bcp14>MUST</bcp14> check the result of the STARTT | |||
| Both the client and server MUST check the result of the STARTTLS | LS | |||
| command and subsequent TLS (<xref target='TLS-1.3'/><xref target='TLS-1.2'/>) | command and subsequent TLS <xref target="RFC8446" format="default"/> <xref ta | |||
| rget="RFC5246" format="default"/> | ||||
| negotiation to see whether acceptable | negotiation to see whether acceptable | |||
| authentication and/or privacy was achieved. | authentication and/or privacy was achieved. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section numbered="true" toc="default"> | |||
| <name>STARTTLS Command versus Use of Implicit TLS Port</name> | ||||
| <section title='STARTTLS command versa use of Implicit TLS port'> | ||||
| <!--Arnt wrote: 1. Require of client authors that their clients be able to | ||||
| connect to 993-only servers. | ||||
| This does not impose a complicated new requirement since e.g. gmail ha | ||||
| s been 993-only since the late bronze age. | ||||
| --> | ||||
| <t>For maximum backward compatibility the client MUST implement both TLS n | ||||
| egotiation | ||||
| on implicit TLS port and TLS negotiation using STARTTLS command on clearte | ||||
| xt port.</t> | ||||
| <!--Arnt wrote: 2. Allow servers to be 993-only, and perhaps suggest that | <t>For maximum backward compatibility, the client <bcp14>MUST</bcp14> impl | |||
| this is a good idea | ement both TLS negotiation | |||
| (IMO that doesn't matter, that kind of suggestion goes unread and ignored | on an Implicit TLS port and TLS negotiation using the STARTTLS command on | |||
| in RFCs). | a cleartext port.</t> | |||
| --> | ||||
| <t> | ||||
| The server MUST implement TLS negotiation on implicit TLS port. | ||||
| The server SHOULD also implement IMAP on cleartext port. | ||||
| If the server listens on a cleartext port, it MUST allow STARTTLS comman | ||||
| d on it. | ||||
| </t> | ||||
| <t> | <t> | |||
| The server <bcp14>MUST</bcp14> implement TLS negotiation on an Implicit | ||||
| TLS port. | ||||
| The server <bcp14>SHOULD</bcp14> also implement IMAP on a cleartext port | ||||
| . | ||||
| If the server listens on a cleartext port, it <bcp14>MUST</bcp14> allow | ||||
| the STARTTLS command on it. | ||||
| </t> | ||||
| <t> | ||||
| Some site/firewall maintainers insist on TLS site-wide and prefer not to r ely | Some site/firewall maintainers insist on TLS site-wide and prefer not to r ely | |||
| on a configuration option in each higher-level protocol. For this reason, IMAP4rev2 clients | on a configuration option in each higher-level protocol. For this reason, IMAP4rev2 clients | |||
| SHOULD try both ports 993 and 143 (and both IPv4 and IPv6) concurrently by | <bcp14>SHOULD</bcp14> try both ports 993 and 143 (and both IPv4 and IPv6) | |||
| default, | concurrently by default, | |||
| unless overridden by either user configuration or DNS SRV records <xref ta | unless overridden by either user configuration or DNS SRV records <xref ta | |||
| rget='RFC6186'/>. | rget="RFC6186" format="default"/>. | |||
| A good algorithm for implementing such concurrent connect is described in | A good algorithm for implementing such concurrent connect is described in | |||
| <xref target='RFC8305'/>. | <xref target="RFC8305" format="default"/>. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section numbered="true" toc="default"> | |||
| <name>Client Handling of Unsolicited Responses Not Suitable for the Curr | ||||
| <section title='Client handling of unsolicited responses not suitable for th | ent Connection State</name> | |||
| e current connection state'> | ||||
| <!--Arnt wrote: 3. Add security considerations suggesting that clients di | ||||
| scard most | ||||
| kinds of responses that they receive before successful login. | ||||
| --> | ||||
| <t> | <t> | |||
| Cleartext mail transmission (whether caused by firewall configuration erro rs that result | Cleartext mail transmission (whether caused by firewall configuration erro rs that result | |||
| in TLS stripping or weak security policies in email clients that choose no t to negotiate | in TLS stripping or weak security policies in email clients that choose no t to negotiate | |||
| TLS in the first place) can enable injection of responses that can confuse or | TLS in the first place) can enable injection of responses that can confuse or | |||
| even cause crashes in email clients. The following measures are recommende d to | even cause crashes in email clients. The following measures are recommende d to | |||
| minimize damage from them. | minimize damage from them. | |||
| </t> | ||||
| <list> | <ul spacing="normal"> | |||
| <li>See <xref target="preauth-resp" format="default"/> for special sec | ||||
| <t> | urity considerations related to the PREAUTH response.</li> | |||
| See <xref target='preauth-resp'/> for special security considerations | ||||
| related to PREAUTH response. | ||||
| </t> | ||||
| <t> | <li>Many server responses and response codes are only meaningful in au | |||
| Many server responses and response codes are only meaningful in authen | thenticated or even selected state. | |||
| ticated or even selected state. | ||||
| However, nothing prevents a server (or an on-path attacker) | However, nothing prevents a server (or an on-path attacker) | |||
| from sending such invalid responses in cleartext before STARTTLS/AUTHE NTICATE commands are issued. | from sending such invalid responses in cleartext before STARTTLS/AUTHE NTICATE commands are issued. | |||
| Before authentication clients SHOULD ignore any responses other than C | Before authentication, clients <bcp14>SHOULD</bcp14> ignore any respon | |||
| APABILITY | ses other than CAPABILITY | |||
| and server status responses (<xref target='server-status-responses'/>) | and server status responses (<xref target="server-status-responses" fo | |||
| , | rmat="default"/>), | |||
| as well as any response codes other than CAPABILITY. | as well as any response codes other than CAPABILITY. | |||
| (In particular, some email clients are known to incorrectly process LI ST responses | (In particular, some email clients are known to incorrectly process LI ST responses | |||
| received before authentication.) | received before authentication, or FETCH responses when no mailbox is | |||
| <!--///Alexey: this also need to mention mailbox state response codes bef | selected.) | |||
| ore mailbox selection or authentication!--> | Clients <bcp14>SHOULD</bcp14> ignore the ALERT response code until aft | |||
| Clients SHOULD ignore the ALERT response code until after TLS | er TLS | |||
| (whether using STARTTLS or TLS negotiation on implicit TLS port) | (whether using STARTTLS or TLS negotiation on an Implicit TLS port) | |||
| or SASL security layer with confidentiality protection has been succes | or a SASL security layer with confidentiality protection has been succ | |||
| sfully negotiated. | essfully negotiated. | |||
| Unless explicitly allowed by an IMAP extension, when not in selected s | Unless explicitly allowed by an IMAP extension, when not in selected s | |||
| tate | tate, | |||
| clients MUST ignore responses/response codes related to message and ma | clients <bcp14>MUST</bcp14> ignore responses / response codes related | |||
| ilbox status | to message and mailbox status | |||
| such as FLAGS, EXIST, EXPUNGE and FETCH. | such as FLAGS, EXIST, EXPUNGE, and FETCH. | |||
| </t> | </li></ul> | |||
| </list> | ||||
| </t> | ||||
| </section> | ||||
| <section title='COPYUID and APPENDUID response codes'> | ||||
| <t> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <name>COPYUID and APPENDUID Response Codes</name> | ||||
| <t> | ||||
| The COPYUID and APPENDUID response codes return information about the | The COPYUID and APPENDUID response codes return information about the | |||
| mailbox, which may be considered sensitive if the mailbox has | mailbox, which may be considered sensitive if the mailbox has | |||
| permissions set that permit the client to COPY or APPEND to the | permissions set that permit the client to COPY or APPEND to the | |||
| mailbox, but not SELECT or EXAMINE it. | mailbox, but not SELECT or EXAMINE it. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Consequently, these response codes <bcp14>SHOULD NOT</bcp14> be issued i | |||
| Consequently, these response codes SHOULD NOT be issued if the client | f the client | |||
| does not have access to SELECT or EXAMINE the mailbox. | does not have access to SELECT or EXAMINE the mailbox. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section numbered="true" toc="default"> | |||
| <name>LIST Command and Other Users' Namespace</name> | ||||
| <section title="LIST command and Other Users' namespace"> | <t> | |||
| <t> | ||||
| In response to a LIST command containing an argument of the Other | In response to a LIST command containing an argument of the Other | |||
| Users' Namespace prefix, a server SHOULD NOT list users that have not | Users' Namespace prefix, a server <bcp14>MUST NOT</bcp14> list users tha t have not | |||
| granted list access to their personal mailboxes to the currently | granted list access to their personal mailboxes to the currently | |||
| authenticated user. Providing such a list, could compromise security | authenticated user. Providing such a list could compromise security | |||
| by potentially disclosing confidential information of who is located | by potentially disclosing confidential information of who is located | |||
| on the server, or providing a starting point of a list of user | on the server or providing a starting point for a list of user | |||
| accounts to attack. | accounts to attack. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section numbered="true" toc="default"> | |||
| <name>Use of MD5</name> | ||||
| <section title='Use of MD5'> | <t> | |||
| The BODYSTRUCTURE FETCH data item can contain the MD5 digest of the | ||||
| <t> | ||||
| The BODYSTRUCTURE FETCH Data item can contain a the MD5 digest of the | ||||
| message body in the "body MD5" field (body-fld-md5 ABNF production). | message body in the "body MD5" field (body-fld-md5 ABNF production). | |||
| While MD5 is no longer considered a secure cryptographic hash <xref tar get='RFC6151'/>, | While MD5 is no longer considered a secure cryptographic hash <xref tar get="RFC6151" format="default"/>, | |||
| this field is used solely to expose the value of the Content-MD5 header field | this field is used solely to expose the value of the Content-MD5 header field | |||
| (if present in the original message), which is just a message | (if present in the original message), which is just a message | |||
| integrity check and is not used for cryptographic purposes. | integrity check and is not used for cryptographic purposes. | |||
| Also note that other mechanisms that provide message integrity checks | Also note that other mechanisms that provide message integrity checks | |||
| were defined since RFC 1864 was published and are now more commonly | were defined since RFC 1864 <xref target="RFC1864" format="default"/> w | |||
| used than Content-MD5. Two such mechanisms are | as published and are now more commonly | |||
| DKIM-Signature <xref target='RFC6376'/> header field and | used than Content-MD5. | |||
| S/MIME signing <xref target='RFC8550'/><xref target='RFC8550'/>. | Two such mechanisms are | |||
| </t> | the DKIM-Signature header field <xref target="RFC6376" format="default" | |||
| /> and | ||||
| </section> | S/MIME signing <xref target="RFC8550" format="default"/> <xref target="R | |||
| FC8551"/>. | ||||
| <section title='Other Security Considerations'> | </t> | |||
| </section> | ||||
| <t> | <section numbered="true" toc="default"> | |||
| A server error message for an AUTHENTICATE command which fails due to | <name>Other Security Considerations</name> | |||
| invalid credentials SHOULD NOT detail why the credentials are | <t> | |||
| A server error message for an AUTHENTICATE command that fails due to | ||||
| invalid credentials <bcp14>SHOULD NOT</bcp14> detail why the credentials are | ||||
| invalid. | invalid. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| Use of the LOGIN command sends passwords in the clear. This can be | Use of the LOGIN command sends passwords in the clear. This can be | |||
| avoided by using the AUTHENTICATE command with a <xref target='SASL'/> mechan ism | avoided by using the AUTHENTICATE command with a <xref target="RFC4422" forma t="default"/> mechanism | |||
| that does not use plaintext passwords, by first negotiating | that does not use plaintext passwords, by first negotiating | |||
| encryption via STARTTLS or some other protection mechanism. | encryption via STARTTLS or some other protection mechanism. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | A server implementation <bcp14>MUST</bcp14> implement a configuration that, a | |||
| A server implementation MUST implement a configuration that, at the | t the | |||
| time of authentication, requires:<vspace/> | time of authentication, requires:</t> | |||
| (1) The STARTTLS command has been negotiated or TLS negotia | ||||
| ted on implicit TLS port.<vspace/> | ||||
| OR<vspace/> | ||||
| (2) Some other mechanism that protects the session from pas | ||||
| sword | ||||
| snooping has been provided.<vspace/> | ||||
| OR<vspace/> | ||||
| (3) The following measures are in place:<vspace/> | ||||
| (a) The LOGINDISABLED capability is adver | ||||
| tised, and <xref target='SASL'/> | ||||
| mechanisms (such as PLAIN) using plaintext passwords are NOT | ||||
| advertised in the CAPABILITY list.<vspace/> | ||||
| AND<vspace/> | ||||
| (b) The LOGIN command returns an error ev | ||||
| en if the password is | ||||
| correct.<vspace/> | ||||
| AND<vspace/> | ||||
| (c) The AUTHENTICATE command returns an e | ||||
| rror with all <xref target='SASL'/> | ||||
| mechanisms that use plaintext passwords, even if the password | ||||
| is correct. | ||||
| </t> | ||||
| <t> | ||||
| A server error message for a failing LOGIN command SHOULD NOT specify | ||||
| that the user name, as opposed to the password, is invalid. | ||||
| </t> | ||||
| <t> | ||||
| A server SHOULD have mechanisms in place to limit or delay failed | ||||
| AUTHENTICATE/LOGIN attempts. | ||||
| </t> | ||||
| <t> | ||||
| A server SHOULD report any authentication failure and analyze | ||||
| such authentication failure attempt with regard to a password | ||||
| brute force attack as well as a password spraying attack. | ||||
| <!--RFC Editor: can we add an informative reference for password spraying above? | ||||
| One example is | ||||
| https://www.ncsc.gov.uk/blog-post/spray-you-spray-me-defending-against-password- | ||||
| spraying-attacks | ||||
| but it might not be the best one. | ||||
| <!--Note that the following MUST is conditional on the previous SHOULD.--> | ||||
| Accounts with passwords that match well known passwords from spraying attacks | ||||
| MUST be blocked and users associated with such accounts must be requested to | ||||
| change | ||||
| their passwords. Only password with significant strength SHOULD be accepted. | ||||
| </t> | ||||
| <t> | ||||
| Additional security considerations are discussed in the section | ||||
| discussing the AUTHENTICATE (see <xref target='authenticate'/>) | ||||
| and LOGIN (see <xref target='login'/>) commands. | ||||
| </t> | ||||
| </section> | ||||
| </section> | ||||
| <section title='IANA Considerations'> | ||||
| <t>IANA is requested to update "Service Names and Transport Protocol Port N | ||||
| umbers" registry as follows: | ||||
| <list style='numbers'> | ||||
| <t>Registration for TCP port 143 and the corresponding "imap" service n | ||||
| ame should be updated to point to this document and RFC 3501.</t> | ||||
| <t>Registration for TCP port 993 and the corresponding "imaps" service | ||||
| name should be updated to point to this document, RFC 8314 and RFC 3501.</t> | ||||
| <t>Both UDP port 143 and UDP port 993 should be marked as "Reserved" in | ||||
| the registry.</t> | ||||
| <!--What about the following: | ||||
| imap2 Interim Mail Access Protocol version 2 | ||||
| ? | ||||
| --> | ||||
| </list> | ||||
| </t> | ||||
| <t>Additional IANA actions are specified in subsection of this section.</t> | ||||
| <section title='Updates to IMAP4 Capabilities registry'> | ||||
| <t> | ||||
| IMAP4 capabilities are registered by publishing a standards track or | ||||
| IESG approved informational or experimental RFC. The registry is currently l | ||||
| ocated | ||||
| at: | ||||
| https://www.iana.org/assignments/imap4-capabilities | ||||
| </t> | ||||
| <t> | ||||
| As this specification revises the AUTH= prefix, STARTTLS and LOGINDISABLED | ||||
| extensions, IANA is requested to update registry entries for these 3 extensio | ||||
| ns | ||||
| to point to this document and RFC 3501. | ||||
| </t> | ||||
| </section> | ||||
| <section title='GSSAPI/SASL service name'> | ||||
| <t>GSSAPI/Kerberos/SASL service names are registered by publishing a | ||||
| standards track or IESG approved experimental RFC. The registry | ||||
| is currently located at: | ||||
| https://www.iana.org/assignments/gssapi-service-names | ||||
| </t> | ||||
| <t> | ||||
| IANA is requested to update the "imap" service name previously | ||||
| registered in RFC 3501, to point to both this document and RFC 3501. | ||||
| </t> | ||||
| </section> | ||||
| <section title='LIST Selection Options, LIST Return Options, LIST extended | ||||
| data items'> | ||||
| <t> | ||||
| <xref target="RFC5258"/> specifies IANA registration procedures for | ||||
| LIST Selection Options, LIST Return Options, LIST extended data items. | ||||
| This document doesn't change these registration procedures. | ||||
| In particular LIST selection options (<xref target='list-select-options'/ | ||||
| >) | ||||
| and LIST return options (<xref target='list-return-options'/>) are regist | ||||
| ered | ||||
| using the procedure specified in Section 9 of <xref target="RFC5258"/> | ||||
| (and using the registration template from Section 9.3 of <xref target="RF | ||||
| C5258"/>). | ||||
| LIST Extended Data Items are registered using the registration template f | ||||
| rom Section | ||||
| 9.6 of <xref target="RFC5258"/>). | ||||
| </t> | ||||
| <t>IANA is requested to add a reference to [RFCXXXX] for the "OLDNAME" | ||||
| LIST-EXTENDED extended data item entry. This is in addition to | ||||
| the existing reference to <xref target="RFC5465"/>.</t> | ||||
| </section> | ||||
| <section title='IMAP Mailbox Name Attributes and IMAP Response Codes'> | ||||
| <t> | ||||
| IANA is requested to update the "IMAP Mailbox Name Attributes" registry | ||||
| to point to this document in addition to RFC 3501. | ||||
| </t> | ||||
| <t> | ||||
| IANA is requested to update the "IMAP Response Codes" registry | ||||
| to point to this document in addition to RFC 3501. | ||||
| </t> | ||||
| </section> | ||||
| </section> | ||||
| </middle> | ||||
| <back> | ||||
| <references title='Normative References'> | ||||
| <!--///Explanatory text can't be accomodated by xml2rfc format. Hacks required. | ||||
| <t> | ||||
| The following documents contain definitions or specifications that | ||||
| are necessary to understand this document properly: | ||||
| </t> | ||||
| <?rfc include="reference.RFC.4752"?> <!-- Kerberos GSSAPI SASL mechanism. --> | ||||
| <?rfc include="reference.RFC.5258"?> <!-- List Extended. This reference is only | ||||
| normative due to IANA registration procedure. --> | ||||
| <?rfc include="reference.RFC.5788"?> <!-- IMAP/JMAP Keyword registry --> | ||||
| <reference anchor="ABNF" target="https://www.rfc-editor.org/info/rfc5234"> | ||||
| <front> | ||||
| <title>Augmented BNF for Syntax Specifications: ABNF</title> | ||||
| <author initials="D." surname="Crocker" fullname="D. Crocker" role="editor"> | ||||
| <organization/> | ||||
| </author> | ||||
| <author initials="P." surname="Overell" fullname="P. Overell"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="2008" month="January"/> | ||||
| </front> | ||||
| <seriesInfo name="STD" value="68"/> | ||||
| <seriesInfo name="RFC" value="5234"/> | ||||
| <format type="ASCII" octets="26359"/> | ||||
| </reference> | ||||
| <reference anchor="CHARSET" target="https://www.rfc-editor.org/info/rfc2978"> | ||||
| <front> | ||||
| <title>IANA Charset Registration Procedures</title> | ||||
| <author initials="N." surname="Freed" fullname="N. Freed"> | ||||
| <organization/> | ||||
| </author> | ||||
| <author initials="J." surname="Postel" fullname="J. Postel"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="2000" month="October"/> | ||||
| </front> | ||||
| <seriesInfo name="BCP" value="19"/> | ||||
| <seriesInfo name="RFC" value="2978"/> | ||||
| <format type="ASCII" octets="21615"/> | ||||
| </reference> | ||||
| <reference anchor="SCRAM-SHA-256" target="https://www.rfc-editor.org/info/rfc767 | <ol spacing="compact" type="1"> | |||
| 7"> | <li><t>The STARTTLS command has been negotiated or TLS negotiated on an Imp | |||
| <front> | licit TLS port</t> | |||
| <title> | ||||
| SCRAM-SHA-256 and SCRAM-SHA-256-PLUS Simple Authentication and Security Layer (S | ||||
| ASL) Mechanisms | ||||
| </title> | ||||
| <author initials="T." surname="Hansen" fullname="T. Hansen"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="2015" month="November"/> | ||||
| <abstract> | ||||
| <t> | <t> | |||
| This document registers the Simple Authentication and Security Layer (SASL) mech | OR</t></li> | |||
| anisms SCRAM-SHA-256 and SCRAM-SHA-256-PLUS, provides guidance for secure implem | ||||
| entation of the original SCRAM-SHA-1-PLUS mechanism, and updates the SCRAM regis | ||||
| tration procedures of RFC 5802. | ||||
| </t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="7677"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC7677"/> | ||||
| </reference> | ||||
| <reference anchor="DISPOSITION" target="https://www.rfc-editor.org/info/rfc2183" | ||||
| > | ||||
| <front> | ||||
| <title> | ||||
| Communicating Presentation Information in Internet Messages: The Content-Disposi | ||||
| tion Header Field | ||||
| </title> | ||||
| <author initials="R." surname="Troost" fullname="R. Troost"> | ||||
| <organization/> | ||||
| </author> | ||||
| <author initials="S." surname="Dorner" fullname="S. Dorner"> | ||||
| <organization/> | ||||
| </author> | ||||
| <author initials="K." surname="Moore" fullname="K. Moore" role="editor"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="1997" month="August"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="2183"/> | ||||
| <format type="ASCII" octets="23150"/> | ||||
| </reference> | ||||
| <reference anchor="PLAIN" target="https://www.rfc-editor.org/info/rfc4616"> | ||||
| <front> | ||||
| <title> | ||||
| The PLAIN Simple Authentication and Security Layer (SASL) Mechanism | ||||
| </title> | ||||
| <author initials="K." surname="Zeilenga" fullname="K. Zeilenga" role="editor"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="2006" month="August"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="4616"/> | ||||
| <format type="ASCII" octets="20270"/> | ||||
| </reference> | ||||
| <?rfc include="reference.RFC.2119"?> <!-- Key Words (BCP 14) --> | ||||
| <?rfc include="reference.RFC.8174"?> <!-- 2119 update (BCP 14) --> | ||||
| <reference anchor="LANGUAGE-TAGS" target="https://www.rfc-editor.org/info/rfc328 | ||||
| 2"> | ||||
| <front> | ||||
| <title>Content Language Headers</title> | ||||
| <author initials="H." surname="Alvestrand" fullname="H. Alvestrand"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="2002" month="May"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="3282"/> | ||||
| <format type="ASCII" octets="14022"/> | ||||
| </reference> | ||||
| <!--[LANGUAGE-TAGS] BCP 47--> | ||||
| <!-- | ||||
| <reference anchor="LANGUAGE-TAGS" target="https://www.rfc-editor.org/info/rfc564 | ||||
| 6"> | ||||
| <front> | ||||
| <title>Tags for Identifying Languages</title> | ||||
| <author initials="A." surname="Phillips" fullname="A. Phillips" role="editor"> | ||||
| <organization/> | ||||
| </author> | ||||
| <author initials="M." surname="Davis" fullname="M. Davis" role="editor"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="2009" month="September"/> | ||||
| </front> | ||||
| <seriesInfo name="BCP" value="47"/> | ||||
| <seriesInfo name="RFC" value="5646"/> | ||||
| <format type="ASCII" octets="208592"/> | ||||
| </reference> | ||||
| <reference anchor="LOCATION" target="https://www.rfc-editor.org/info/rfc2557"> | ||||
| <front> | ||||
| <title> | ||||
| MIME Encapsulation of Aggregate Documents, such as HTML (MHTML) | ||||
| </title> | ||||
| <author initials="J." surname="Palme" fullname="J. Palme"> | ||||
| <organization/> | ||||
| </author> | ||||
| <author initials="A." surname="Hopmann" fullname="A. Hopmann"> | ||||
| <organization/> | ||||
| </author> | ||||
| <author initials="N." surname="Shelness" fullname="N. Shelness"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="1999" month="March"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="2557"/> | ||||
| <format type="ASCII" octets="61854"/> | ||||
| </reference> | ||||
| <reference anchor="MD5" target="https://www.rfc-editor.org/info/rfc1864"> | ||||
| <front> | ||||
| <title>The Content-MD5 Header Field</title> | ||||
| <author initials="J." surname="Myers" fullname="J. Myers"> | ||||
| <organization/> | ||||
| </author> | ||||
| <author initials="M." surname="Rose" fullname="M. Rose"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="1995" month="October"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="1864"/> | ||||
| <format type="ASCII" octets="7216"/> | ||||
| </reference> | ||||
| <reference anchor="MIME-HDRS" target="https://www.rfc-editor.org/info/rfc2047"> | ||||
| <front> | ||||
| <title> | ||||
| MIME (Multipurpose Internet Mail Extensions) Part Three: Message Header Extensio | ||||
| ns for Non-ASCII Text | ||||
| </title> | ||||
| <author initials="K." surname="Moore" fullname="K. Moore"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="1996" month="November"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="2047"/> | ||||
| <format type="ASCII" octets="33262"/> | ||||
| </reference> | ||||
| <reference anchor="MIME-IMB" target="https://www.rfc-editor.org/info/rfc2045"> | ||||
| <front> | ||||
| <title> | ||||
| Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Messag | ||||
| e Bodies | ||||
| </title> | ||||
| <author initials="N." surname="Freed" fullname="N. Freed"> | ||||
| <organization/> | ||||
| </author> | ||||
| <author initials="N." surname="Borenstein" fullname="N. Borenstein"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="1996" month="November"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="2045"/> | ||||
| <format type="ASCII" octets="72932"/> | ||||
| </reference> | ||||
| <reference anchor="MIME-IMT" target="https://www.rfc-editor.org/info/rfc2046"> | ||||
| <front> | ||||
| <title> | ||||
| Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types | ||||
| </title> | ||||
| <author initials="N." surname="Freed" fullname="N. Freed"> | ||||
| <organization/> | ||||
| </author> | ||||
| <author initials="N." surname="Borenstein" fullname="N. Borenstein"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="1996" month="November"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="2046"/> | ||||
| <format type="ASCII" octets="105854"/> | ||||
| </reference> | ||||
| <reference anchor="RFC2231" target="https://www.rfc-editor.org/info/rfc2231"> | ||||
| <front> | ||||
| <title> | ||||
| MIME Parameter Value and Encoded Word Extensions: Character Sets, Language | ||||
| s, and Continuations | ||||
| </title> | ||||
| <author initials="N." surname="Freed" fullname="N. Freed"> | ||||
| <organization/> | ||||
| </author> | ||||
| <author initials="K." surname="Moore" fullname="K. Moore"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="1997" month="November"/> | ||||
| <abstract> | ||||
| <t> | ||||
| This memo defines extensions to the RFC 2045 media type and RFC 2183 dis | ||||
| position parameter value mechanisms. This memo also defines an extension to the | ||||
| encoded words defined in RFC 2047 to allow the specification of the language to | ||||
| be used for display as well as the character set. [STANDARDS-TRACK] | ||||
| </t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="2231"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC2231"/> | ||||
| </reference> | ||||
| <reference anchor="RFC-5322" target="https://www.rfc-editor.org/info/rfc5322"> | ||||
| <front> | ||||
| <title>Internet Message Format</title> | ||||
| <author initials="P." surname="Resnick" fullname="P. Resnick" role="editor"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="2008" month="October"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="5322"/> | ||||
| <format type="ASCII" octets="122322"/> | ||||
| </reference> | ||||
| <reference anchor="SASL" target="https://www.rfc-editor.org/info/rfc4422"> | ||||
| <front> | ||||
| <title>Simple Authentication and Security Layer (SASL)</title> | ||||
| <author initials="A." surname="Melnikov" fullname="A. Melnikov" role="editor"> | ||||
| <organization/> | ||||
| </author> | ||||
| <author initials="K." surname="Zeilenga" fullname="K. Zeilenga" role="editor"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="2006" month="June"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="4422"/> | ||||
| <format type="ASCII" octets="73206"/> | ||||
| </reference> | ||||
| <reference anchor="TLS-1.2" target="https://www.rfc-editor.org/info/rfc5246"> | ||||
| <front> | ||||
| <title> | ||||
| The Transport Layer Security (TLS) Protocol Version 1.2 | ||||
| </title> | ||||
| <author initials="T." surname="Dierks" fullname="T. Dierks"> | ||||
| <organization/> | ||||
| </author> | ||||
| <author initials="E." surname="Rescorla" fullname="E. Rescorla"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="2008" month="August"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="5246"/> | ||||
| <format type="ASCII" octets="222395"/> | ||||
| </reference> | ||||
| <reference anchor="TLS-1.3" target="https://www.rfc-editor.org/info/rfc8446"> | ||||
| <front> | ||||
| <title>The Transport Layer Security (TLS) Protocol Version 1.3</title> | ||||
| <author initials="E." surname="Rescorla" fullname="E. Rescorla"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="2018" month="August"/> | ||||
| <abstract> | ||||
| <t>This document specifies version 1.3 of the Transport Layer Security (TLS) pro | ||||
| tocol. TLS allows client/server applications to communicate over the Internet in | ||||
| a way that is designed to prevent eavesdropping, tampering, and message forgery | ||||
| .</t> | ||||
| <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and | ||||
| 6961. This document also specifies new requirements for TLS 1.2 implementations. | ||||
| </t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="8446"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8446"/> | ||||
| </reference> | ||||
| <reference anchor="UTF-7" target="https://www.rfc-editor.org/info/rfc2152"> | ||||
| <front> | ||||
| <title>UTF-7 A Mail-Safe Transformation Format of Unicode</title> | ||||
| <author initials="D." surname="Goldsmith" fullname="D. Goldsmith"> | ||||
| <organization/> | ||||
| </author> | ||||
| <author initials="M." surname="Davis" fullname="M. Davis"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="1997" month="May"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="2152"/> | ||||
| <format type="ASCII" octets="28065"/> | ||||
| </reference> | ||||
| <reference anchor='UTF-8' target='https://www.rfc-editor.org/info/rfc3629'> | ||||
| <front> | ||||
| <title>UTF-8, a transformation format of ISO 10646</title> | ||||
| <author initials='F.' surname='Yergeau' fullname='F. Yergeau'><organization /></ | ||||
| author> | ||||
| <date year='2003' month='November' /> | ||||
| <abstract><t>ISO/IEC 10646-1 defines a large character set called the Universal | ||||
| Character Set (UCS) which encompasses most of the world's writing systems. The | ||||
| originally proposed encodings of the UCS, however, were not compatible with many | ||||
| current applications and protocols, and this has led to the development of UTF- | ||||
| 8, the object of this memo. UTF-8 has the characteristic of preserving the full | ||||
| US-ASCII range, providing compatibility with file systems, parsers and other so | ||||
| ftware that rely on US-ASCII values but are transparent to other values. This m | ||||
| emo obsoletes and replaces RFC 2279.</t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='STD' value='63'/> | ||||
| <seriesInfo name='RFC' value='3629'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC3629'/> | ||||
| </reference> | ||||
| <reference anchor="MULTIAPPEND" target="https://www.rfc-editor.org/info/rfc3502" | ||||
| > | ||||
| <front> | ||||
| <title> | ||||
| Internet Message Access Protocol (IMAP) - MULTIAPPEND Extension | ||||
| </title> | ||||
| <author initials="M." surname="Crispin" fullname="M. Crispin"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="2003" month="March"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="3502"/> | ||||
| <format type="ASCII" octets="13379"/> | ||||
| </reference> | ||||
| <reference anchor="NET-UNICODE" target="https://www.rfc-editor.org/info/rfc5198" | <li><t>Some other mechanism that protects the session from password | |||
| > | snooping has been provided</t> | |||
| <front> | ||||
| <title>Unicode Format for Network Interchange</title> | ||||
| <author initials="J." surname="Klensin" fullname="J. Klensin"> | ||||
| <organization/> | ||||
| </author> | ||||
| <author initials="M." surname="Padlipsky" fullname="M. Padlipsky"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="2008" month="March"/> | ||||
| <abstract> | ||||
| <t> | <t> | |||
| The Internet today is in need of a standardized form for the transmission of int | OR | |||
| ernationalized "text" information, paralleling the specifications for the use of | </t></li> | |||
| ASCII that date from the early days of the ARPANET. This document specifies tha | <li><t>The following measures are in place:</t> | |||
| t format, using UTF-8 with normalization and specific line-ending sequences. [ST | ||||
| ANDARDS-TRACK] | ||||
| </t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="5198"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC5198"/> | ||||
| </reference> | ||||
| <reference anchor="I18N-HDRS" target="https://www.rfc-editor.org/info/rfc6532"> | <ol spacing="compact" type="%c)"> | |||
| <front> | <li><t>The LOGINDISABLED capability is advertised, and <xref target="RFC442 | |||
| <title>Internationalized Email Headers</title> | 2" format="default"/> mechanisms | |||
| <author initials="A." surname="Yang" fullname="A. Yang"> | (such as PLAIN) using plaintext passwords are NOT advertised in the | |||
| <organization/> | CAPABILITY list.</t> | |||
| </author> | ||||
| <author initials="S." surname="Steele" fullname="S. Steele"> | ||||
| <organization/> | ||||
| </author> | ||||
| <author initials="N." surname="Freed" fullname="N. Freed"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="2012" month="February"/> | ||||
| <abstract> | ||||
| <t> | ||||
| Internet mail was originally limited to 7-bit ASCII. MIME added support for the | ||||
| use of 8-bit character sets in body parts, and also defined an encoded-word cons | ||||
| truct so other character sets could be used in certain header field values. Howe | ||||
| ver, full internationalization of electronic mail requires additional enhancemen | ||||
| ts to allow the use of Unicode, including characters outside the ASCII repertoir | ||||
| e, in mail addresses as well as direct use of Unicode in header fields like "Fro | ||||
| m:", "To:", and "Subject:", without requiring the use of complex encoded-word co | ||||
| nstructs. This document specifies an enhancement to the Internet Message Format | ||||
| and to MIME that allows use of Unicode in mail addresses and most header field c | ||||
| ontent. | ||||
| </t> | ||||
| <t> | <t> | |||
| This specification updates Section 6.4 of RFC 2045 to eliminate the restriction | ||||
| prohibiting the use of non-identity content-transfer- encodings on subtypes of " | ||||
| message/". [STANDARDS-TRACK] | ||||
| </t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="6532"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC6532"/> | ||||
| </reference> | ||||
| <?rfc include="reference.RFC.3503"?> <!-- $MDNSent --> | ||||
| <?rfc include="reference.RFC.4648"?> <!-- BASE64 --> | ||||
| <?rfc include="reference.RFC.7525"?> <!-- Recommendations for Secure Use of TLS | ||||
| and DTLS --> | ||||
| <?rfc include="reference.RFC.7817"?> <!-- Email TLS server identity verification | ||||
| procedure. --> | ||||
| <?rfc include="reference.RFC.8098"?> <!-- MDN --> | ||||
| <?rfc include="reference.RFC.8314"?> <!-- Updated TLS use in Email recommendatio | ||||
| ns. --> | ||||
| <!--///Explanatory text can't be accomodated by xml2rfc format. Hacks required. | ||||
| <t>The following documents describe quality-of-implementation issues | ||||
| that should be carefully considered when implementing this protocol:</t | ||||
| > | ||||
| <reference anchor="IMAP-IMPLEMENTATION" target="https://www.rfc-editor.org/info/ | ||||
| rfc2683"> | ||||
| <front> | ||||
| <title>IMAP4 Implementation Recommendations</title> | ||||
| <author initials="B." surname="Leiba" fullname="B. Leiba"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="1999" month="September"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="2683"/> | ||||
| <format type="ASCII" octets="56300"/> | ||||
| </reference> | ||||
| <reference anchor="IMAP-MULTIACCESS" target="https://www.rfc-editor.org/info/rfc | ||||
| 2180"> | ||||
| <front> | ||||
| <title>IMAP4 Multi-Accessed Mailbox Practice</title> | ||||
| <author initials="M." surname="Gahrns" fullname="M. Gahrns"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="1997" month="July"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="2180"/> | ||||
| <format type="ASCII" octets="24750"/> | ||||
| </reference> | ||||
| </references> | ||||
| <references title='Informative References (related protocols)'> | ||||
| <!--/// | ||||
| <t> | ||||
| The following documents describe related protocols: | ||||
| </t> | ||||
| <reference anchor="CERT-555316" target="https://www.kb.cert.org/vuls/id/555316"> | ||||
| <front> | ||||
| <title> | ||||
| Vulnerability Note VU#555316: STARTTLS plaintext command injection vulnerabili | ||||
| ty | ||||
| </title> | ||||
| <author fullname="CERT"> | ||||
| <organization>Carnegie Mellon University Software Engineering Institute</organiz | ||||
| ation> | ||||
| </author> | ||||
| <date year="2011" month="September"/> | ||||
| </front> | ||||
| </reference> | ||||
| <?rfc include="reference.RFC.6151"?> <!-- Updated Security Considerations for MD | ||||
| 5 --> | ||||
| <?rfc include="reference.RFC.2193"?> <!-- Referrals --> | ||||
| <?rfc include="reference.RFC.3348"?> <!-- Child mailboxes --> | ||||
| <?rfc include="reference.RFC.5256"?> <!-- SORT and THREAD --> | ||||
| <?rfc include="reference.RFC.5465"?> <!-- IMAP NOTIFY extension --> | ||||
| <?rfc include="reference.RFC.6186"?> <!-- Use of SRV Records for Locating Email | ||||
| Submission/Access Services --> | ||||
| <?rfc include="reference.RFC.7162"?> <!-- CONDSTORE/QRESYNC --> | ||||
| <?rfc include="reference.RFC.7888"?> <!-- LITERAL+ and LITERAL- --> | ||||
| <?rfc include="reference.RFC.8474"?> <!-- OBJECTID --> | ||||
| <reference anchor="IMAP-DISC" target="https://www.rfc-editor.org/info/rfc4549"> | ||||
| <front> | ||||
| <title> | ||||
| Synchronization Operations for Disconnected IMAP4 Clients | ||||
| </title> | ||||
| <author initials="A." surname="Melnikov" fullname="A. Melnikov" role="editor"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="2006" month="June"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="4549"/> | ||||
| <format type="ASCII" octets="75417"/> | ||||
| </reference> | ||||
| <reference anchor='IMAP-I18N' target='https://www.rfc-editor.org/info/rfc5255'> | ||||
| <front> | ||||
| <title>Internet Message Access Protocol Internationalization</title> | ||||
| <author initials='C.' surname='Newman' fullname='C. Newman'><organization /></au | ||||
| thor> | ||||
| <author initials='A.' surname='Gulbrandsen' fullname='A. Gulbrandsen'><organizat | ||||
| ion /></author> | ||||
| <author initials='A.' surname='Melnikov' fullname='A. Melnikov'><organization /> | ||||
| </author> | ||||
| <date year='2008' month='June' /> | ||||
| <abstract><t>Internet Message Access Protocol (IMAP) version 4rev1 has basic sup | ||||
| port for non-ASCII characters in mailbox names and search substrings. It also s | ||||
| upports non-ASCII message headers and content encoded as specified by Multipurpo | ||||
| se Internet Mail Extensions (MIME). This specification defines a collection of | ||||
| IMAP extensions that improve international support including language negotiatio | ||||
| n for international error text, translations for namespace prefixes, and compa | ||||
| rator negotiation for search, sort, and thread. [STANDARDS-TRACK]</t></abstract | ||||
| > | ||||
| </front> | ||||
| <seriesInfo name='RFC' value='5255'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC5255'/> | ||||
| </reference> | ||||
| <reference anchor="IMAP-MODEL" target="https://www.rfc-editor.org/info/rfc1733"> | AND</t></li> | |||
| <front> | ||||
| <title>Distributed Electronic Mail Models in IMAP4</title> | ||||
| <author initials="M." surname="Crispin" fullname="M. Crispin"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="1994" month="December"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="1733"/> | ||||
| <format type="ASCII" octets="6205"/> | ||||
| </reference> | ||||
| <reference anchor='IMAP-UTF-8' target='https://www.rfc-editor.org/info/rfc6855' | ||||
| > | ||||
| <front> | ||||
| <title>IMAP Support for UTF-8</title> | ||||
| <author initials='P.' surname='Resnick' fullname='P. Resnick' role='editor'><org | ||||
| anization /></author> | ||||
| <author initials='C.' surname='Newman' fullname='C. Newman' role='editor'><organ | ||||
| ization /></author> | ||||
| <author initials='S.' surname='Shen' fullname='S. Shen' role='editor'><organizat | ||||
| ion /></author> | ||||
| <date year='2013' month='March' /> | ||||
| <abstract><t>This specification extends the Internet Message Access Protocol (IM | ||||
| AP) to support UTF-8 encoded international characters in user names, mail addres | ||||
| ses, and message headers. This specification replaces RFC 5738.</t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='RFC' value='6855'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC6855'/> | ||||
| </reference> | ||||
| <reference anchor="ANONYMOUS" target="https://www.rfc-editor.org/info/rfc4505"> | ||||
| <front> | ||||
| <title> | ||||
| Anonymous Simple Authentication and Security Layer (SASL) Mechanism | ||||
| </title> | ||||
| <author initials="K." surname="Zeilenga" fullname="K. Zeilenga"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="2006" month="June"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="4505"/> | ||||
| <format type="ASCII" octets="16599"/> | ||||
| </reference> | ||||
| <!-- | ||||
| <reference anchor="ACAP" target="https://www.rfc-editor.org/info/rfc2244"> | ||||
| <front> | ||||
| <title>ACAP ‐- Application Configuration Access Protocol</title> | ||||
| <author initials="C." surname="Newman" fullname="C. Newman"> | ||||
| <organization/> | ||||
| </author> | ||||
| <author initials="J." surname="G. Myers" fullname="J. G. Myers"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="1997" month="November"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="2244"/> | ||||
| <format type="ASCII" octets="154610"/> | ||||
| </reference> | ||||
| <reference anchor="SMTP" target="https://www.rfc-editor.org/info/rfc5321"> | ||||
| <front> | ||||
| <title>Simple Mail Transfer Protocol</title> | ||||
| <author initials="J." surname="Klensin" fullname="J. Klensin"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="2008" month="October"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="5321"/> | ||||
| <format type="ASCII" octets="225929"/> | ||||
| </reference> | ||||
| <reference anchor="RFC3516" target="https://www.rfc-editor.org/info/rfc3516"> | <li><t>The LOGIN command returns an error even if the password is | |||
| <front> | correct</t> | |||
| <title>IMAP4 Binary Content Extension</title> | ||||
| <author initials="L." surname="Nerenberg" fullname="L. Nerenberg"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="2003" month="April"/> | ||||
| <abstract> | ||||
| <t> | <t> | |||
| This memo defines the Binary extension to the Internet Message Access Protocol ( | AND</t></li> | |||
| IMAP4). It provides a mechanism for IMAP4 clients and servers to exchange messag | ||||
| e body data without using a MIME content-transfer- encoding. [STANDARDS-TRACK] | ||||
| </t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="3516"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC3516"/> | ||||
| </reference> | ||||
| <reference anchor="RFC4314" target="https://www.rfc-editor.org/info/rfc4314"> | ||||
| <front> | ||||
| <title>IMAP4 Access Control List (ACL) Extension</title> | ||||
| <author initials="A." surname="Melnikov" fullname="A. Melnikov"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="2005" month="December"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="4314"/> | ||||
| <format type="ASCII" octets="56599"/> | ||||
| </reference> | ||||
| <reference anchor="RFC2087" target="https://www.rfc-editor.org/info/rfc2087"> | <li><t>The AUTHENTICATE command returns an error with all <xref target="RFC44 | |||
| <front> | 22" format="default"/> | |||
| <title>IMAP4 QUOTA extension</title> | mechanisms that use plaintext passwords, even if the password | |||
| <author initials="J." surname="Myers" fullname="J. Myers"> | is correct.</t> | |||
| <organization/> | </li></ol></li></ol> | |||
| </author> | ||||
| <date year="1997" month="January"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="2087"/> | ||||
| <format type="ASCII" octets="8542"/> | ||||
| </reference> | ||||
| <reference anchor="IMAP-URL" target="https://www.rfc-editor.org/info/rfc5092"> | <t> | |||
| <front> | A server error message for a failing LOGIN command <bcp14>SHOULD NOT</bcp14> | |||
| <title>IMAP URL Scheme</title> | specify | |||
| <author initials="A." surname="Melnikov" fullname="A. Melnikov" role="editor | that the user name, as opposed to the password, is invalid. | |||
| "> | </t> | |||
| <organization/> | <t> | |||
| </author> | A server <bcp14>SHOULD</bcp14> have mechanisms in place to limit or delay fai | |||
| <author initials="C." surname="Newman" fullname="C. Newman"> | led | |||
| <organization/> | AUTHENTICATE/LOGIN attempts. | |||
| </author> | </t> | |||
| <date year="2007" month="November"/> | <t> | |||
| <abstract> | A server <bcp14>SHOULD</bcp14> report any authentication failure and analyze | |||
| <t> | such authentication failure attempts with regard to a password | |||
| IMAP (RFC 3501) is a rich protocol for accessing remote message stores. | brute-force attack as well as a password spraying attack <xref target="NCSC"/ | |||
| It provides an ideal mechanism for accessing public mailing list archives as wel | >. | |||
| l as private and shared message stores. This document defines a URL scheme for r | Accounts with passwords that match well-known passwords from spraying attacks | |||
| eferencing objects on an IMAP server. | <bcp14>MUST</bcp14> be blocked, and users associated with such accounts must | |||
| </t> | be requested to change | |||
| <t> | their passwords. Only a password with significant strength <bcp14>SHOULD</bcp | |||
| This document obsoletes RFC 2192. It also updates RFC 4467. [STANDARDS-T | 14> be accepted. | |||
| RACK] | </t> | |||
| <t> | ||||
| Additional security considerations are discussed in the sections that d | ||||
| efine the AUTHENTICATE and LOGIN commands (see Sections <xref target="authentica | ||||
| te" format="counter"/> and <xref target="login" format="counter"/>, respectively | ||||
| ). | ||||
| </t> | ||||
| </section> | ||||
| </section> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>IANA Considerations</name> | ||||
| <t>IANA has updated the "Service Names and Transport Protocol Port Numbers | ||||
| " registry as follows: | ||||
| </t> | </t> | |||
| </abstract> | <ol spacing="normal" type="1"><li>Registration for TCP port 143 and the co | |||
| </front> | rresponding "imap" service name have been updated to point to this document and | |||
| <seriesInfo name="RFC" value="5092"/> | <xref target="RFC3501" format="default"/>.</li> | |||
| <seriesInfo name="DOI" value="10.17487/RFC5092"/> | <li>Registration for TCP port 993 and the corresponding "imaps" service | |||
| <format type="ASCII" octets="65197"/> | name have been updated to point to this document, <xref target="RFC8314" format= | |||
| </reference> | "default"/>, and <xref target="RFC3501" format="default"/>.</li> | |||
| <li>UDP ports 143 and 993 have both been marked as "Reserved" in the reg | ||||
| <?rfc include="reference.RFC.8305"?> <!-- Happy Eyeballs v2 --> | istry.</li> | |||
| </ol> | ||||
| <?rfc include="reference.RFC.6376"?> <!-- DKIM --> | <t>Additional IANA actions are specified in the subsections that follow.</ | |||
| t> | ||||
| <?rfc include="reference.RFC.8550"?> <!-- S/MIME 4.0: Certificate Handling --> | <section numbered="true" toc="default"> | |||
| <?rfc include="reference.RFC.8551"?> <!-- S/MIME 4.0: Message Specification --> | <name>Updates to IMAP Capabilities Registry</name> | |||
| <t> | ||||
| <reference anchor="IMAP-KEYWORDS-REG" target="https://www.iana.org/assignments/i | IMAP4 capabilities are registered by publishing a Standards Track or | |||
| map-jmap-keywords/imap-jmap-keywords.xhtml"> | IESG-approved Informational or Experimental RFC. The registry is currently l | |||
| <front> | ocated | |||
| <title> | at: <https://www.iana.org/assignments/imap4-capabilities> | |||
| IMAP and JMAP Keywords | </t> | |||
| </title> | <t> | |||
| As this specification revises the AUTH= prefix, STARTTLS, and LOGINDISABLED | ||||
| <author fullname="IANA"> | extensions, IANA has updated registry entries for these 3 extensions | |||
| <organization/> | to point to this document and <xref target="RFC3501" format="default"/>. | |||
| </author> | </t> | |||
| </section> | ||||
| <!--Used registry creation date--> | <section numbered="true" toc="default"> | |||
| <date year="2009" month="December"/> | <name>GSSAPI/SASL Service Name</name> | |||
| </front> | <t>GSSAPI/Kerberos/SASL service names are registered by publishing a | |||
| </reference> | Standards Track or IESG-approved Experimental RFC. The registry | |||
| is currently located at: <https://www.iana.org/assignments/gssapi-serv | ||||
| <reference anchor="IMAP-MAILBOX-NAME-ATTRS-REG" target="https://www.iana.org/ass | ice-names> | |||
| ignments/imap-mailbox-name-attributes/imap-mailbox-name-attributes.xhtml"> | </t> | |||
| <front> | <t> | |||
| <title> | IANA has updated the "imap" service name previously | |||
| IMAP Mailbox Name Attributes | registered in <xref target="RFC3501" format="default"/> to point to both | |||
| </title> | this document and <xref target="RFC3501" format="default"/>. | |||
| </t> | ||||
| <author fullname="IANA"> | </section> | |||
| <organization/> | <section numbered="true" toc="default"> | |||
| </author> | <name>LIST Selection Options, LIST Return Options, and LIST Extended Dat | |||
| a Items</name> | ||||
| <!--Used registry creation date: 2018-06-14--> | <t> | |||
| <date year="2018" month="June"/> | <xref target="RFC5258" format="default"/> specifies IANA registration pro | |||
| </front> | cedures for | |||
| </reference> | LIST selection options, LIST return options, and LIST extended data items | |||
| . | ||||
| This document doesn't change these registration procedures. | ||||
| In particular, LIST selection options (<xref target="list-select-options" | ||||
| format="default"/>) | ||||
| and LIST return options (<xref target="list-return-options" format="defau | ||||
| lt"/>) are registered | ||||
| using the procedure specified in <xref target="RFC5258" sectionFormat="of | ||||
| " section="9"/> | ||||
| (and using the registration template from <xref target="RFC5258" sectionF | ||||
| ormat="of" section="9.3"/>). | ||||
| LIST extended data items are registered using the registration template f | ||||
| rom | ||||
| <xref target="RFC5258" sectionFormat="of" section="9.6"/>). | ||||
| </t> | ||||
| <t>IANA has added a reference to RFC 9051 for the "OLDNAME" | ||||
| LIST-EXTENDED extended data item entry. This is in addition to | ||||
| the existing reference to <xref target="RFC5465" format="default"/>.</t> | ||||
| </section> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>IMAP Mailbox Name Attributes and IMAP Response Codes</name> | ||||
| <t> | ||||
| IANA has updated the "IMAP Mailbox Name Attributes" registry | ||||
| to point to this document in addition to <xref target="RFC3501" format="d | ||||
| efault"/>. | ||||
| </t> | ||||
| <t> | ||||
| IANA has updated the "IMAP Response Codes" registry | ||||
| to point to this document in addition to <xref target="RFC3501" format="d | ||||
| efault"/>. | ||||
| </t> | ||||
| </section> | ||||
| </section> | ||||
| </middle> | ||||
| <back> | ||||
| <reference anchor="CHARSET-REG" target="https://www.iana.org/assignments/charset | <displayreference target="RFC2045" to="MIME-IMB"/> | |||
| -reg/charset-reg.xhtml"> | <displayreference target="RFC8446" to="TLS-1.3"/> | |||
| <front> | <displayreference target="RFC4422" to="SASL"/> | |||
| <title> | <displayreference target="RFC5321" to="SMTP"/> | |||
| Character Set Registrations | <displayreference target="RFC2978" to="CHARSET"/> | |||
| </title> | <displayreference target="RFC4616" to="PLAIN"/> | |||
| <displayreference target="RFC2557" to="LOCATION"/> | ||||
| <displayreference target="RFC4549" to="IMAP-DISC"/> | ||||
| <displayreference target="RFC2595" to="IMAP-TLS"/> | ||||
| <displayreference target="RFC1733" to="IMAP-MODEL"/> | ||||
| <displayreference target="RFC5198" to="NET-UNICODE"/> | ||||
| <displayreference target="RFC2183" to="DISPOSITION"/> | ||||
| <displayreference target="RFC3502" to="MULTIAPPEND"/> | ||||
| <displayreference target="RFC2047" to="MIME-HDRS"/> | ||||
| <displayreference target="RFC5246" to="TLS-1.2"/> | ||||
| <displayreference target="RFC2180" to="IMAP-MULTIACCESS"/> | ||||
| <displayreference target="RFC4505" to="ANONYMOUS"/> | ||||
| <displayreference target="RFC6855" to="IMAP-UTF-8"/> | ||||
| <displayreference target="RFC3282" to="LANGUAGE-TAGS"/> | ||||
| <displayreference target="RFC2062" to="IMAP-OBSOLETE"/> | ||||
| <displayreference target="RFC1176" to="IMAP2"/> | ||||
| <displayreference target="RFC1732" to="IMAP-HISTORICAL"/> | ||||
| <displayreference target="RFC3629" to="UTF-8"/> | ||||
| <displayreference target="RFC5092" to="IMAP-URL"/> | ||||
| <displayreference target="I-D.ietf-imap-imap2bis" to="IMAP2BIS"/> | ||||
| <displayreference target="RFC5255" to="IMAP-I18N"/> | ||||
| <displayreference target="RFC2152" to="UTF-7"/> | ||||
| <displayreference target="RFC2683" to="IMAP-IMPLEMENTATION"/> | ||||
| <displayreference target="RFC7677" to="SCRAM-SHA-256"/> | ||||
| <displayreference target="RFC2061" to="IMAP-COMPAT"/> | ||||
| <displayreference target="RFC2046" to="MIME-IMT"/> | ||||
| <displayreference target="RFC5234" to="ABNF"/> | ||||
| <displayreference target="RFC1864" to="MD5"/> | ||||
| <displayreference target="RFC0822" to="RFC822"/> | ||||
| <displayreference target="RFC6532" to="I18N-HDRS"/> | ||||
| <references> | ||||
| <name>References</name> | ||||
| <references> | ||||
| <author fullname="IANA"> | <name>Normative References</name> | |||
| <organization/> | ||||
| </author> | ||||
| <!--Used last updated at the time of editing: 2015-05-11--> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | |||
| <date year="2015" month="May"/> | C.4752.xml"/> | |||
| </front> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | |||
| </reference> | C.5258.xml"/> | |||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.5788.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.5234.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.2077.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.2978.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.7677.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.2183.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.4616.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.2119.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.8174.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.3282.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.2557.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.1864.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.2047.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.2045.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.2046.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.2231.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.5322.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.4422.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.5246.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.8446.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.2152.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.3629.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.3502.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.5198.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.6532.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.3503.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.4648.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.7525.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.7817.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.8081.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.8098.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.8314.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.2683.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.2180.xml"/> | ||||
| <referencegroup anchor="BCP178" target="https://www.rfc-editor.org/info/ | ||||
| bcp178"> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.6648.xml"/> | ||||
| </references> | </referencegroup> | |||
| </references> | ||||
| <references title='Informative References (historical aspects of IMAP and | <references> | |||
| related protocols)'> | <name>Informative References</name> | |||
| <references> | ||||
| <name>Related Protocols</name> | ||||
| <!--/// | <reference anchor="NCSC" target="https://www.ncsc.gov.uk/blog-post/spra | |||
| <t>The following documents are historical or describe historical aspect | y-you-spray-me-defending-against-password-spraying-attacks"> | |||
| s | <front> | |||
| of this protocol:</t> | <title>Spray you, spray me: defending against password spraying atta | |||
| cks</title> | ||||
| <author> | ||||
| <organization>NCSC</organization> | ||||
| </author> | ||||
| <date year="2018" month="May"/> | ||||
| </front> | ||||
| </reference> | ||||
| <?rfc include="reference.RFC.3501"?> <!-- IMAP4rev1 --> | <reference anchor="CERT-555316" target="https://www.kb.cert.org/vuls/id/5 | |||
| 55316"> | ||||
| <front> | ||||
| <title>STARTTLS plaintext command injection vulnerability</title> | ||||
| <author> | ||||
| <organization>Carnegie Mellon University</organization> | ||||
| </author> | ||||
| <date year="2011" month="September"/> | ||||
| </front> | ||||
| <refcontent>Software Engineering Institute</refcontent> | ||||
| <refcontent>CERT Coordination Center</refcontent> | ||||
| <refcontent>Vulnerability Note VU#555316</refcontent> | ||||
| </reference> | ||||
| <reference anchor="IMAP-COMPAT" target="https://www.rfc-editor.org/info/rfc2061" | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
| > | FC.6151.xml"/> | |||
| <front> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | |||
| <title>IMAP4 Compatibility with IMAP2bis</title> | C.2193.xml"/> | |||
| <author initials="M." surname="Crispin" fullname="M. Crispin"> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | |||
| <organization/> | C.3348.xml"/> | |||
| </author> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | |||
| <date year="1996" month="December"/> | C.5256.xml"/> | |||
| </front> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | |||
| <seriesInfo name="RFC" value="2061"/> | C.5465.xml"/> | |||
| <format type="ASCII" octets="5867"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | |||
| </reference> | C.6186.xml"/> | |||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.7162.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.7888.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.8474.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.4549.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.5255.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.1733.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.6855.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.4505.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.5321.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.3516.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.4314.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.2087.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.5092.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.8126.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.8305.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.6376.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.8550.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.8551.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.2177.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.2342.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.3691.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.4315.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.4466.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.4731.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.4959.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.5161.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.5182.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.5530.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.5819.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.6154.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.6409.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.6851.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
| C.8438.xml"/> | ||||
| <reference anchor="IMAP-HISTORICAL" target="https://www.rfc-editor.org/info/rfc1 | <reference anchor="IMAP-KEYWORDS-REG" target="https://www.iana.org/assig | |||
| 732"> | nments/imap-jmap-keywords/"> | |||
| <front> | <front> | |||
| <title>IMAP4 Compatibility with IMAP2 and IMAP2bis</title> | <title>IMAP and JMAP Keywords</title> | |||
| <author initials="M." surname="Crispin" fullname="M. Crispin"> | <author fullname="IANA"> | |||
| <organization/> | <organization/> | |||
| </author> | </author> | |||
| <date year="1994" month="December"/> | <date/> | |||
| </front> | </front> | |||
| <seriesInfo name="RFC" value="1732"/> | </reference> | |||
| <format type="ASCII" octets="9276"/> | ||||
| </reference> | ||||
| <reference anchor="IMAP2BIS" target="https://www.ietf.org/archive/id/draft-ietf- | <reference anchor="IMAP-MAILBOX-NAME-ATTRS-REG" target="https://www.iana | |||
| imap-imap2bis-02.txt"> | .org/assignments/imap-mailbox-name-attributes/"> | |||
| <front> | <front> | |||
| <title>INTERACTIVE MAIL ACCESS PROTOCOL - VERSION 2bis</title> | <title>IMAP Mailbox Name Attributes</title> | |||
| <author initials="M." surname="Crispin" fullname="M. Crispin"> | <author fullname="IANA"> | |||
| <organization/> | <organization/> | |||
| </author> | </author> | |||
| <date year="1993" month="October"/> | <date/> | |||
| </front> | </front> | |||
| <seriesInfo name="Internet-Draft" value="draft-ietf-imap-imap2bis-02"/> | </reference> | |||
| <format type="ASCII"/> | ||||
| </reference> | ||||
| <reference anchor="IMAP-OBSOLETE" target="https://www.rfc-editor.org/info/rfc206 | <reference anchor="CHARSET-REG" target="https://www.iana.org/assignments | |||
| 2"> | /charset-reg/"> | |||
| <front> | <front> | |||
| <title>Internet Message Access Protocol - Obsolete Syntax</title> | <title>Character Set Registrations</title> | |||
| <author initials="M." surname="Crispin" fullname="M. Crispin"> | <author fullname="IANA"> | |||
| <organization/> | <organization/> | |||
| </author> | </author> | |||
| <date year="1996" month="December"/> | <date/> | |||
| </front> | </front> | |||
| <seriesInfo name="RFC" value="2062"/> | </reference> | |||
| <format type="ASCII" octets="14222"/> | </references> | |||
| </reference> | ||||
| <reference anchor="IMAP2" target="https://www.rfc-editor.org/info/rfc1176"> | <references> | |||
| <front> | <name>Historical Aspects of IMAP and Related Protocols</name> | |||
| <title>Interactive Mail Access Protocol: Version 2</title> | ||||
| <author initials="M.R." surname="Crispin" fullname="M.R. Crispin"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="1990" month="August"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="1176"/> | ||||
| <format type="ASCII" octets="67330"/> | ||||
| </reference> | ||||
| <reference anchor="RFC-822" target="https://www.rfc-editor.org/info/rfc822"> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/refere | |||
| <front> | nce.RFC.1064.xml"/> | |||
| <title> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/refere | |||
| STANDARD FOR THE FORMAT OF ARPA INTERNET TEXT MESSAGES | nce.RFC.1732.xml"/> | |||
| </title> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/refere | |||
| <author initials="D." surname="Crocker" fullname="D. Crocker"> | nce.RFC.1730.xml"/> | |||
| <organization/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/refere | |||
| </author> | nce.RFC.2060.xml"/> | |||
| <date year="1982" month="August"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/refer | |||
| </front> | ence.RFC.2061.xml"/> | |||
| <seriesInfo name="STD" value="11"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/refere | |||
| <seriesInfo name="RFC" value="822"/> | nce.RFC.3501.xml"/> | |||
| <format type="ASCII" octets="106299"/> | ||||
| </reference> | ||||
| <reference anchor="IMAP-TLS" target="https://www.rfc-editor.org/info/rfc2595"> | <!--ietf-imap-imap2bis-02; Expired--> | |||
| <front> | <xi:include href="https://datatracker.ietf.org/doc/bibxml3/referen | |||
| <title>Using TLS with IMAP, POP3 and ACAP</title> | ce.I-D.ietf-imap-imap2bis-02.xml"/> | |||
| <author initials="C." surname="Newman" fullname="C. Newman"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date year="1999" month="June"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="2595"/> | ||||
| <format type="ASCII" octets="32440"/> | ||||
| </reference> | ||||
| </references> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
| FC.2062.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.1176.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.0822.xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
| FC.2595.xml"/> | ||||
| <section title='Backward compatibility with IMAP4rev1' anchor="IMAP4rev1- | </references> | |||
| compat"> | </references> | |||
| </references> | ||||
| <t>An implementation that wants to remain compatible with IMAP4rev1 can | <section anchor="IMAP4rev1-compat" numbered="true" toc="default"> | |||
| advertise both IMAP4rev1 | <name>Backward Compatibility with IMAP4rev1</name> | |||
| and IMAP4rev2 in its CAPABILITY response/response code. | <t>An implementation that wants to remain compatible with IMAP4rev1 can ad | |||
| vertise both IMAP4rev1 | ||||
| and IMAP4rev2 in its CAPABILITY response / response code. | ||||
| (Such server implementation is likely to also want to advertise other I MAP4rev1 extensions that | (Such server implementation is likely to also want to advertise other I MAP4rev1 extensions that | |||
| were folded into IMAP4rev2. See <xref target="changesFromIMAP4rev1"/>.) | were folded into IMAP4rev2; see <xref target="changesFromIMAP4rev1" for | |||
| <!--///Alexey: Is the following statement actually true, considering | mat="default"/>.) | |||
| that removed responses are not listed in the ABNF?--> | ||||
| While some IMAP4rev1 responses were removed in IMAP4rev2, | While some IMAP4rev1 responses were removed in IMAP4rev2, | |||
| their presence will not break IMAP4rev2-only clients.</t> | their presence will not break IMAP4rev2-only clients.</t> | |||
| <t>If both IMAP4rev1 and IMAP4rev2 are advertised, an IMAP client that | <t>If both IMAP4rev1 and IMAP4rev2 are advertised, an IMAP client | |||
| wants to use IMAP4rev2 MUST | that wants to use IMAP4rev2 <bcp14>MUST</bcp14> | |||
| issue an "ENABLE IMAP4rev2" command.</t> | issue an "ENABLE IMAP4rev2" command.</t> | |||
| <t>Servers advertising both IMAP4rev1 and IMAP4rev2 MUST NOT | <t>When compared to IMAP4rev1, some request data items, | |||
| generate UTF-8 quoted strings unless the client has issued | corresponding response data items, and responses were removed in IMAP4r | |||
| ev2. | ||||
| See <xref target="changesFromIMAP4rev1" format="default"/> for more det | ||||
| ails. | ||||
| With the exception of obsolete SEARCH and RECENT responses, | ||||
| servers advertising both IMAP4rev1 and IMAP4rev2 would never return | ||||
| such removed response data items/responses unless explicitly requested | ||||
| by an IMAPrev1 client. | ||||
| </t> | ||||
| <t>Servers advertising both IMAP4rev1 and IMAP4rev2 <bcp14>MUST NOT</bc | ||||
| p14> | ||||
| generate UTF-8-quoted strings unless the client has issued | ||||
| "ENABLE IMAP4rev2". Consider implementation of mechanisms | "ENABLE IMAP4rev2". Consider implementation of mechanisms | |||
| described or referenced in <xref target="IMAP-UTF-8"/> to | described or referenced in <xref target="RFC6855" format="default"/> to | |||
| achieve this goal.</t> | achieve this goal.</t> | |||
| <!--///Alexey: talk about other breaking changes, like SEARCH NEW, ESEA | ||||
| RCH response and LSUB removal here?--> | ||||
| <t>Servers advertising both IMAP4rev1 and IMAP4rev2, and | <t>Servers advertising both IMAP4rev1 and IMAP4rev2, and | |||
| clients intending to be compatible with IMAP4rev1 servers MUST | clients intending to be compatible with IMAP4rev1 servers, <bcp14>MUST< | |||
| be compatible with the international mailbox naming convention | /bcp14> | |||
| described in <xref target='mailbox-i18n'/>.</t> | be compatible with the Mailbox International Naming Convention | |||
| described in <xref target="mailbox-i18n" format="default"/>.</t> | ||||
| <t>Also see <xref target="body-part-64bit"/> for special considerations | <t>Also see <xref target="body-part-64bit" format="default"/> for speci | |||
| for servers that support 63 bit body part/message sizes and want | al considerations | |||
| for servers that support 63-bit body part / message sizes and want | ||||
| to advertise support for both IMAP4rev1 and IMAP4rev2.</t> | to advertise support for both IMAP4rev1 and IMAP4rev2.</t> | |||
| <section title='Mailbox International Naming Convention for compatibili | <section anchor="mailbox-i18n" numbered="true" toc="default"> | |||
| ty with IMAP4rev1' anchor='mailbox-i18n'> | <name>Mailbox International Naming Convention for Compatibility with IMA | |||
| P4rev1</name> | ||||
| <t>Support for the Mailbox International Naming Convention described in this | <t>Support for the Mailbox International Naming Convention described in | |||
| section | this section | |||
| is not required for IMAP4rev2-only clients and servers. It is only used for b ackward | is not required for IMAP4rev2-only clients and servers. It is only used for b ackward | |||
| compatibility with IMAP4rev1 implementations. | compatibility with IMAP4rev1 implementations. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| By convention, international mailbox names in IMAP4rev1 are specified | By convention, international mailbox names in IMAP4rev1 are specified | |||
| using a modified version of the UTF-7 encoding described in <xref target='UTF -7'/>. | using a modified version of the UTF-7 encoding described in <xref target="RFC 2152" format="default"/>. | |||
| Modified UTF-7 may also be usable in servers that implement an | Modified UTF-7 may also be usable in servers that implement an | |||
| earlier version of this protocol. | earlier version of this protocol. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| In modified UTF-7, printable US-ASCII characters, except for "&", | In modified UTF-7, printable US-ASCII characters, except for "&", | |||
| represent themselves; that is, characters with octet values 0x20-0x25 | represent themselves; that is, characters with octet values 0x20-0x25 | |||
| and 0x27-0x7e. The character "&" (0x26) is represented by the | and 0x27-0x7e. The character "&" (0x26) is represented by the | |||
| two-octet sequence "&-". | 2-octet sequence "&-". | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| All other characters (octet values 0x00-0x1f and 0x7f-0xff) are | All other characters (octet values 0x00-0x1f and 0x7f-0xff) are | |||
| represented in modified BASE64, with a further modification from | represented in modified base64, with a further modification from | |||
| <xref target='UTF-7'/> that "," is used instead of "/". Modified BASE64 MUST | <xref target="RFC2152" format="default"/> that "," is used instead of "/". M | |||
| NOT be | odified base64 <bcp14>MUST NOT</bcp14> be | |||
| used to represent any printing US-ASCII character which can represent | used to represent any printing of a US-ASCII character that can represent | |||
| itself. Only characters inside the modified BASE64 alphabet are | itself. Only characters inside the modified base64 alphabet are | |||
| permitted in modified BASE64 text. | permitted in modified base64 text. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | "&" is used to shift to modified base64 and "-" to shift back to | |||
| "&" is used to shift to modified BASE64 and "-" to shift back to | US-ASCII. There is no implicit shift from base64 to US-ASCII, and | |||
| US-ASCII. There is no implicit shift from BASE64 to US-ASCII, and | null shifts ("-&" while in base64; note that "&-" while in US-ASCII | |||
| null shifts ("-&" while in BASE64; note that "&-" while in US-ASCII | means "&") are not permitted. However, all names start in US-ASCII | |||
| means "&") are not permitted. However, all names start in US-ASCII, | and <bcp14>MUST</bcp14> end in US-ASCII; that is, a name that ends with a non | |||
| and MUST end in US-ASCII; that is, a name that ends with a non-ASCII | -ASCII | |||
| ISO-10646 character MUST end with a "-"). | ISO-10646 character <bcp14>MUST</bcp14> end with a "-". | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| The purpose of these modifications is to correct the following | The purpose of these modifications is to correct the following | |||
| problems with UTF-7: | problems with UTF-7: | |||
| <list style='numbers'> | </t> | |||
| <t> | <ol spacing="normal" type="1"><li> | |||
| UTF-7 uses the "+" character for shifting; this conflicts with | UTF-7 uses the "+" character for shifting; this conflicts with | |||
| the common use of "+" in mailbox names, in particular USENET | the common use of "+" in mailbox names, in particular USENET | |||
| newsgroup names. | newsgroup names. | |||
| </t> | </li> | |||
| <li> | ||||
| <t> | UTF-7's encoding is base64, which uses the "/" character; this | |||
| UTF-7's encoding is BASE64 which uses the "/" character; this | ||||
| conflicts with the use of "/" as a popular hierarchy delimiter. | conflicts with the use of "/" as a popular hierarchy delimiter. | |||
| </t> | </li> | |||
| <li> | ||||
| <t> | ||||
| UTF-7 prohibits the unencoded usage of "\"; this conflicts with | UTF-7 prohibits the unencoded usage of "\"; this conflicts with | |||
| the use of "\" as a popular hierarchy delimiter. | the use of "\" as a popular hierarchy delimiter. | |||
| </t> | </li> | |||
| <li> | ||||
| <t> | ||||
| UTF-7 prohibits the unencoded usage of "~"; this conflicts with | UTF-7 prohibits the unencoded usage of "~"; this conflicts with | |||
| the use of "~" in some servers as a home directory indicator. | the use of "~" in some servers as a home directory indicator. | |||
| </t> | </li> | |||
| <li> | ||||
| <t> | ||||
| UTF-7 permits multiple alternate forms to represent the same | UTF-7 permits multiple alternate forms to represent the same | |||
| string; in particular, printable US-ASCII characters can be | string; in particular, printable US-ASCII characters can be | |||
| represented in encoded form. | represented in encoded form. | |||
| </t> | </li> | |||
| </ol> | ||||
| </list> | <t> | |||
| </t> | ||||
| <t> | ||||
| Although modified UTF-7 is a convention, it establishes certain | Although modified UTF-7 is a convention, it establishes certain | |||
| requirements on server handling of any mailbox name with an | requirements on the server handling of any mailbox name with an | |||
| embedded "&" character. In particular, server implementations | embedded "&" character. In particular, server implementations | |||
| MUST preserve the exact form of the modified BASE64 portion of a | <bcp14>MUST</bcp14> preserve the exact form of the modified base64 portion | |||
| modified UTF-7 name and treat that text as case-sensitive, even if | of a | |||
| names are otherwise case-insensitive or case-folded. | modified UTF-7 name and treat that text as case sensitive, even if | |||
| </t> | names are otherwise case insensitive or case folded. | |||
| </t> | ||||
| <t> | <t> | |||
| Server implementations SHOULD verify that any mailbox name with an | Server implementations <bcp14>SHOULD</bcp14> verify that any mailbox name | |||
| with an | ||||
| embedded "&" character, used as an argument to CREATE, is: in the | embedded "&" character, used as an argument to CREATE, is: in the | |||
| correctly modified UTF-7 syntax, has no superfluous shifts, and | correctly modified UTF-7 syntax; has no superfluous shifts; and | |||
| has no encoding in modified BASE64 of any printing US-ASCII | has no encoding in modified base64 of any printing US-ASCII | |||
| character which can represent itself. However, client | character that can represent itself. However, client | |||
| implementations MUST NOT depend upon the server doing this, and | implementations <bcp14>MUST NOT</bcp14> depend upon the server doing this | |||
| SHOULD NOT attempt to create a mailbox name with an embedded "&" | and | |||
| <bcp14>SHOULD NOT</bcp14> attempt to create a mailbox name with an embedde | ||||
| d "&" | ||||
| character unless it complies with the modified UTF-7 syntax. | character unless it complies with the modified UTF-7 syntax. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | Server implementations that export a mail store that does not | |||
| Server implementations which export a mail store that does not | follow the modified UTF-7 convention <bcp14>MUST</bcp14> convert any mailb | |||
| follow the modified UTF-7 convention MUST convert to modified | ox name | |||
| UTF-7 any mailbox name that contains either non-ASCII characters | that contains either non-ASCII characters | |||
| or the "&" character. | or the "&" character to modified | |||
| UTF-7. | ||||
| <list> | </t> | |||
| <t> | <ul empty="true" spacing="normal"> | |||
| For example, here is a mailbox name which mixes English, | <li> | |||
| For example, here is a mailbox name that mixes English, | ||||
| Chinese, and Japanese text: | Chinese, and Japanese text: | |||
| ~peter/mail/&U,BTFw-/&ZeVnLIqe- | ~peter/mail/&U,BTFw-/&ZeVnLIqe- | |||
| </t> | </li> | |||
| <li> | ||||
| <t> | ||||
| For example, the string "&Jjo!" is not a valid mailbox | For example, the string "&Jjo!" is not a valid mailbox | |||
| name because it does not contain a shift to US-ASCII | name because it does not contain a shift to US-ASCII | |||
| before the "!". The correct form is "&Jjo-!". The | before the "!". The correct form is "&Jjo-!". The | |||
| string "&U,BTFw-&ZeVnLIqe-" is not permitted because it | string "&U,BTFw-&ZeVnLIqe-" is not permitted because it | |||
| contains a superfluous shift. The correct form is | contains a superfluous shift. The correct form is | |||
| "&U,BTF2XlZyyKng-". | "&U,BTF2XlZyyKng-". | |||
| </t> | </li> | |||
| </list> | </ul> | |||
| </t> | </section> | |||
| </section> | </section> | |||
| <section anchor="BINARY-compat" numbered="true" toc="default"> | ||||
| </section> | <name>Backward Compatibility with BINARY Extension</name> | |||
| <t>IMAP4rev2 incorporates a subset of functionality provided by | ||||
| <section title='Backward compatibility with BINARY extension' anchor="BIN | the BINARY extension <xref target="RFC3516" format="default"/>; in part | |||
| ARY-compat"> | icular, it includes | |||
| additional FETCH items (BINARY, BINARY.PEEK, and BINARY.SIZE) | ||||
| <t>IMAP4rev2 incorporates subset of functionality provided by | but not extensions to the APPEND command. | |||
| the BINARY extension <xref target='RFC3516'/>, in particular it include | IMAP4rev2 implementations | |||
| s | that support full <xref target="RFC3516" format="default"/> | |||
| additional FETCH items (BINARY, BINARY.PEEK and BINARY.SIZE), | functionality need to also advertise the BINARY | |||
| but not extensions to the APPEND command. IMAP4rev2 implementations | capability in the CAPABILITY response / response code. | |||
| that supports full RFC 3516 functionality need to also advertise the BI | </t> | |||
| NARY | </section> | |||
| capability in the CAPABILITY response/response code. | <section anchor="LIST-EXTENDED-compat" numbered="true" toc="default"> | |||
| </t> | <name>Backward Compatibility with LIST-EXTENDED Extension</name> | |||
| <t> | ||||
| </section> | IMAP4rev2 incorporates most of the functionality provided by | |||
| the LIST-EXTENDED extension <xref target="RFC5258" format="default"/> | ||||
| <section title='Backward compatibility with LIST-EXTENDED extension' anch | . | |||
| or="LIST-EXTENDED-compat"> | In particular, the syntax for multiple mailbox patterns is not suppor | |||
| ted | ||||
| <t> | ||||
| IMAP4rev2 incorporates most of functionality provided by | ||||
| the LIST-EXTENDED extension <xref target='RFC5258'/>. | ||||
| In particular, multiple mailbox patterns syntax is not supported | ||||
| in IMAP4rev2, unless LIST-EXTENDED capability is also advertised | in IMAP4rev2, unless LIST-EXTENDED capability is also advertised | |||
| in the CAPABILITY response/response code. | in the CAPABILITY response / response code. | |||
| </t> | </t> | |||
| </section> | ||||
| </section> | <section anchor="body-part-64bit" numbered="true" toc="default"> | |||
| <name>63-Bit Body Part and Message Sizes</name> | ||||
| <section title='63 bit body part and message sizes' anchor="body-part-64b | <t> | |||
| it"> | ||||
| <t> | ||||
| IMAP4rev2 increases allowed body part and message sizes that servers | IMAP4rev2 increases allowed body part and message sizes that servers | |||
| can support from 32 to 63 bits. | can support from 32 to 63 bits. | |||
| Server implementations don't have to support 63 bit long body parts/m | Server implementations don't have to support 63-bit-long body parts/m | |||
| essage | essage | |||
| sizes, however client implementations have to expect them. | sizes; however, client implementations have to expect them. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | As IMAP4rev1 didn't support 63-bit-long body part / message sizes, | |||
| As IMAP4rev1 didn't support 63 bit long body part/message sizes, | there is an interoperability issue exposed by 63-bit-capable | |||
| there is an interoperability issue exposed by 63 bit capable | servers/mailboxes that are accessible by both IMAP4rev1 and IMAP4rev2 | |||
| servers<!--mailstores?--> that are accessible by both IMAP4rev1 and I | email clients. As IMAP4rev1 would be unable to retrieve the full cont | |||
| MAP4rev2 | ent | |||
| email clients. As IMAP4rev1 would be unable to retrieve full content | of messages bigger than 4 Gb, such servers either need to replace | |||
| of messages bigger than 4Gb, such servers either need to replace | messages bigger that 4 Gb with messages under 4 Gb or hide them | |||
| messages bigger that 4Gb with messages under 4Gb or hide them | ||||
| from IMAP4rev1 clients. This document doesn't prescribe any implement ation | from IMAP4rev1 clients. This document doesn't prescribe any implement ation | |||
| strategy to address this issue. | strategy to address this issue. | |||
| </t> | </t> | |||
| <!--Timo suggested that maybe hiding such messages is not the best strategy: | ||||
| <t> | ||||
| For example, imagine that a mailbox has 3 messages with UIDs 1, 17, 2 | ||||
| 1. | ||||
| These messages have the following sizes (respectively): 32Kb, 5Gb, 60 | ||||
| Mb. | ||||
| When such mailbox is accessed by an IMAP4rev2 client that issued "ENA | ||||
| BLE IMAP4rev2", | ||||
| it will see all 3 messages. When such mailbox is accessed by an IMAP4 | ||||
| rev1 client, | ||||
| it will only see messages with UIDs 1 and 21. | ||||
| </t> | ||||
| --> | ||||
| </section> | </section> | |||
| <section anchor="changesFromIMAP4rev1" numbered="true" toc="default"> | ||||
| <name>Changes from RFC 3501 / IMAP4rev1</name> | ||||
| <t>Below is the summary of changes since RFC 3501: | ||||
| </t> | ||||
| <ol spacing="normal" type="1"> | ||||
| <li>Support for 64-bit message and body part sizes.</li> | ||||
| <li> | ||||
| Folded in IMAP NAMESPACE <xref target="RFC2342"/>, UNSELECT <xref targ | ||||
| et="RFC3691"/>, | ||||
| UIDPLUS <xref target="RFC4315"/>, | ||||
| ESEARCH <xref target="RFC4731"/>, SEARCHRES <xref target="RFC5182"/> | ||||
| , ENABLE <xref target="RFC5161"/>, IDLE <xref target="RFC2177"/>, | ||||
| SASL-IR <xref target="RFC4959"/>, LIST-EXTENDED <xref target="RFC525 | ||||
| 8"/>, LIST-STATUS <xref target="RFC5819"/>, MOVE <xref target="RFC6851"/>, | ||||
| and LITERAL- extensions <xref target="RFC7888"/>. | ||||
| Also folded in IMAP ABNF extensions <xref target="RFC4466"/>, respon | ||||
| se codes <xref target="RFC5530"/>, | ||||
| the FETCH side of the BINARY extension <xref target="RFC3516"/>, and | ||||
| the list of new mailbox attributes from SPECIAL-USE <xref target="RF | ||||
| C6154"/>.</li> | ||||
| <li>Added STATUS SIZE <xref target="RFC8438"/> and STATUS DELETED.</li> | ||||
| <li>SEARCH command now requires to return the ESEARCH response (SEARCH r | ||||
| esponse is now deprecated).</li> | ||||
| <li>Clarified which SEARCH keys have to use substring match and which do | ||||
| n't.</li> | ||||
| <li>Clarified that the server should decode parameter value continuation | ||||
| s as described in <xref target="RFC2231" format="default"/>. | ||||
| This requirement was hidden in <xref target="RFC2231"/> itself.</li> | ||||
| <li>Clarified that the COPYUID response code is returned for both MOVE a | ||||
| nd UID MOVE.</li> | ||||
| <li>Tightened requirements about COPY/MOVE commands not creating a targe | ||||
| t mailbox. | ||||
| Also required them to return the TRYCREATE response code, if the tar | ||||
| get mailbox | ||||
| doesn't exist and can be created.</li> | ||||
| <li>Added the CLOSED response code from <xref target="RFC7162"/>. SELECT | ||||
| /EXAMINE when a mailbox is | ||||
| already selected now requires a CLOSED response code to be returned. | ||||
| </li> | ||||
| <li>SELECT/EXAMINE are now required to return an untagged LIST response. | ||||
| </li> | ||||
| <li>UNSEEN response code on SELECT/EXAMINE is now deprecated.</li> | ||||
| <section title='Changes from RFC 3501 / IMAP4rev1' anchor="changesFromIMA | <li>RECENT response on SELECT/EXAMINE, \Recent flag, RECENT STATUS, and | |||
| P4rev1"> | SEARCH NEW items are now deprecated.</li> | |||
| <li>Clarified that the server doesn't need to send a new PERMANENTFLAGS | ||||
| <t>Below is the summary of changes since RFC 3501: | response code when a new | |||
| <list style='numbers'> | keyword was successfully added and the server advertised \* earlier for | |||
| the same mailbox.</li> | ||||
| <!--////Chris Newman suggested to expand this to list every element | ||||
| added/changed, e.g. UIDSTICKY --> | ||||
| <t>Support for 64bit message and body part sizes.</t> | ||||
| <t> | ||||
| Folded in IMAP NAMESPACE (RFC 2342), UNSELECT (RFC 3691), UIDPLUS (R | ||||
| FC 4315), | ||||
| ESEARCH (RFC 4731), SEARCHRES (RFC 5182), ENABLE (RFC 5161), IDLE (R | ||||
| FC 2177), | ||||
| SASL-IR (RFC 4959), LIST-EXTENDED (RFC 5258), LIST-STATUS (RFC 5819) | ||||
| , MOVE (RFC 6851) | ||||
| and LITERAL- (RFC 7888) extensions. | ||||
| Also folded RFC 4466 (IMAP ABNF extensions), RFC 5530 (response code | ||||
| s), | ||||
| the FETCH side of the BINARY extension (RFC 3516) and | ||||
| the list of new mailbox attributes from SPECIAL-USE (RFC 6154).</t> | ||||
| <t>Added STATUS SIZE (RFC 8438) and STATUS DELETED.</t> | ||||
| <t>SEARCH command now requires to return ESEARCH response (SEARCH re | ||||
| sponse is now deprecated).</t> | ||||
| <t>Clarified which SEARCH keys have to use substring match and which | ||||
| don't.</t> | ||||
| <t>Clarified that server should decode parameter value continuations | ||||
| as described in <xref target='RFC2231'/>. | ||||
| This requirement was hidden in RFC 2231 itself.</t> | ||||
| <t>Clarified that COPYUID response code is returned for both MOVE an | ||||
| d UID MOVE.</t> | ||||
| <t>Tighen requirements about COPY/MOVE commands not creating target | ||||
| mailbox. | ||||
| Also require them to return TRYCREATE response code, if the target m | ||||
| ailbox | ||||
| doesn't exist and can be created.</t> | ||||
| <t>Added CLOSED response code from RFC 7162. SELECT/EXAMINE when a m | ||||
| ailbox is | ||||
| already selected now requires a CLOSED response code to be returned. | ||||
| </t> | ||||
| <t>SELECT/EXAMINE are now required to return untagged LIST response. | ||||
| </t> | ||||
| <t>UNSEEN response code on SELECT/EXAMINE is now deprecated.</t> | ||||
| <t>RECENT response on SELECT/EXAMINE, \Recent flag, RECENT STATUS, S | ||||
| EARCH NEW items are now deprecated.</t> | ||||
| <t>Clarified that the server doesn't need to send a new PERMANENTFLA | ||||
| GS response code when a new | ||||
| keyword was successfully added and the server advertised \* earlier | ||||
| for the same mailbox.</t> | ||||
| <t>For future extensibility extended ABNF for tagged-ext-simple to a | ||||
| llow for bare number64.</t> | ||||
| <t>Added SHOULD level requirement on IMAP servers to support $MDNSen | ||||
| t, $Forwarded, $Junk, $NonJunk and $Phishing keywords.</t> | ||||
| <t>Mailbox names and message headers now allow for UTF-8. Support fo | ||||
| r Modified UTF-7 in mailbox names | ||||
| is not required, unless compatibility with IMAP4rev1 is desired.< | ||||
| /t> | ||||
| <t>Removed the CHECK command. Clients should use NOOP instead.</t> | ||||
| <t>RFC822, RFC822.HEADER and RFC822.TEXT FETCH data items were depre | ||||
| cated. | ||||
| Clients should use the corresponding BODY[] variants instead.</t> | ||||
| <t>LSUB command was deprecated. Clients should use LIST (SUBSCRIBED) | ||||
| instead.</t> | ||||
| <t>IDLE command can now return updates not related to the currently | ||||
| selected mailbox state.</t> | ||||
| <t>All unsolicited FETCH updates are required to include UID.</t> | ||||
| <t>Clarified that client implementations MUST ignore response codes | ||||
| that they do not recognize. (Change from a SHOULD to a MUST.)</t> | ||||
| <t>resp-text ABNF non terminal was updated to allow for empty text.< | ||||
| /t> | ||||
| <t>After ENABLE IMAP4rev2 human readable response text can include n | ||||
| on ASCII encoded in UTF-8.</t> | ||||
| <t>Updated to use modern TLS-related recommendations as per RFC 8314 | ||||
| , RFC 7817, RFC 7525.</t> | ||||
| <t>Added warnings about use of ALERT response codes and PREAUTH resp | ||||
| onse.</t> | ||||
| <t>Replaced DIGEST-MD5 SASL mechanism with SCRAM-SHA-256. DIGEST-MD5 | ||||
| was deprecated.</t> | ||||
| <t>Clarified that any command received from the client resets server | ||||
| autologout timer.</t> | ||||
| <t>Revised IANA registration procedure for IMAP extensions and remov | ||||
| ed "X" convention in accordance with BCP 178.</t> | ||||
| <t>Loosened requirements on servers when closing connections to be m | ||||
| ore aligned with existing practices.</t> | ||||
| </list></t> | ||||
| </section> | ||||
| <section title='Other Recommended IMAP Extensions' anchor="recommended-ex | <li>For future extensibility, extended ABNF for tagged-ext-simple to all | |||
| tensions"> | ow for bare number64.</li> | |||
| <li>Added <bcp14>SHOULD</bcp14> level requirement on IMAP servers to sup | ||||
| port $MDNSent, $Forwarded, $Junk, $NonJunk, and $Phishing keywords.</li> | ||||
| <li>Mailbox names and message headers now allow for UTF-8. Support for m | ||||
| odified UTF-7 in mailbox names | ||||
| is not required, unless compatibility with IMAP4rev1 is desired.< | ||||
| /li> | ||||
| <li>Removed the CHECK command. Clients should use NOOP instead.</li> | ||||
| <li>RFC822, RFC822.HEADER, and RFC822.TEXT FETCH data items were depreca | ||||
| ted. | ||||
| Clients should use the corresponding BODY[] variants instead.</li> | ||||
| <li>LSUB command was deprecated. Clients should use LIST (SUBSCRIBED) in | ||||
| stead.</li> | ||||
| <li>IDLE command can now return updates not related to the currently sel | ||||
| ected mailbox state.</li> | ||||
| <li>All unsolicited FETCH updates are required to include UID.</li> | ||||
| <li>Clarified that client implementations <bcp14>MUST</bcp14> ignore res | ||||
| ponse codes that they do not recognize. (Changed from a <bcp14>SHOULD</bcp14> to | ||||
| a <bcp14>MUST</bcp14>.)</li> | ||||
| <li>resp-text ABNF non-terminal was updated to allow for empty text.</li | ||||
| > | ||||
| <t>Support for the following extensions is recommended for all IMAP cl | <li>After ENABLE, IMAP4rev2 human-readable response text can include non | |||
| ient and servers. | -ASCII encoded in UTF-8.</li> | |||
| <li>Updated to use modern TLS-related recommendations as per <xref targe | ||||
| t="RFC7525"/>, <xref target="RFC7817"/>, and <xref target="RFC8314"/>.</li> | ||||
| <li>Added warnings about use of ALERT response codes and PREAUTH respons | ||||
| e.</li> | ||||
| <li>Replaced DIGEST-MD5 SASL mechanism with SCRAM-SHA-256. DIGEST-MD5 wa | ||||
| s deprecated.</li> | ||||
| <li>Clarified that any command received from the client resets server au | ||||
| tologout timer.</li> | ||||
| <li>Revised IANA registration procedure for IMAP extensions and removed | ||||
| "X" convention in accordance with <xref target="BCP178"/>.</li> | ||||
| <li>Loosened requirements on servers when closing connections to be more | ||||
| aligned with existing practices.</li> | ||||
| </ol> | ||||
| </section> | ||||
| <section anchor="recommended-extensions" numbered="true" toc="default"> | ||||
| <name>Other Recommended IMAP Extensions</name> | ||||
| <t>Support for the following extensions is recommended for all IMAP client | ||||
| s and servers. | ||||
| While they significantly reduce bandwidth and/or number of round trips used by IMAP | While they significantly reduce bandwidth and/or number of round trips used by IMAP | |||
| in certain situations, the EXTRA WG decided that requiring them as a p art of IMAP4rev2 | in certain situations, the EXTRA WG decided that requiring them as a p art of IMAP4rev2 | |||
| would push the bar to implement too high for new implementations. | would push the bar to implement too high for new implementations. | |||
| Also note that absence of any IMAP extension from this list doesn't ma ke it somehow | Also note that the absence of any IMAP extension from this list doesn' t make it somehow | |||
| deficient or not recommended for use with IMAP4rev2. | deficient or not recommended for use with IMAP4rev2. | |||
| <list style='numbers'> | </t> | |||
| <ol spacing="normal" type="1"> | ||||
| <t>QRESYNC and CONDSTORE extensions <xref target='RFC7162'/>. Th | ||||
| ey make discovering changes | ||||
| to IMAP mailboxes more efficient, at the expense of storing a bi | ||||
| t more state.</t> | ||||
| <t>OBJECTID extension <xref target='RFC8474'/> helps with preser | ||||
| ving IMAP client cache | ||||
| when messages moved/copied or mailboxes are renamed.</t> | ||||
| </list> | ||||
| </t> | ||||
| </section> | ||||
| <section title='Acknowledgement'> | ||||
| <t>Earlier versions of this document were edited by Mark Crispin. | <li>Quick Mailbox Resynchronization (QRESYNC) and CONDSTORE extensions <x | |||
| ref target="RFC7162" format="default"/>. They make | ||||
| discovering changes to IMAP mailboxes more efficient, at the expense of s | ||||
| toring a bit more state.</li> | ||||
| <li>OBJECTID extension <xref target="RFC8474" format="default"/> helps w | ||||
| ith preserving the IMAP client cache | ||||
| when messages are moved/copied or mailboxes are renamed.</li> | ||||
| </ol> | ||||
| </section> | ||||
| <section numbered="false" toc="default"> | ||||
| <name>Acknowledgements</name> | ||||
| <t>Earlier draft versions of this document were edited by <contact fullnam | ||||
| e="Mark Crispin"/>. | ||||
| Sadly, he is no longer available to help with this work. | Sadly, he is no longer available to help with this work. | |||
| Editors of this revisions are hoping that Mark would have approved.</t> | Editors of this revision are hoping that Mark would have approved.</t> | |||
| <t>Chris Newman has contributed text on I18N and use of UTF-8 in messag | ||||
| es and mailbox names.</t> | ||||
| <t>Thank you to Tony Hansen for helping with the index generation. | <t><contact fullname="Chris Newman"/> has contributed text on I18N and use | |||
| Thank you to Murray Kucherawy, Timo Sirainen, Bron Gondwana, Stephan Bo | of UTF-8 in messages and mailbox names.</t> | |||
| sch, Robert Sparks, | ||||
| Arnt Gulbrandsen, Benjamin Kaduk, Daniel Migault, Roman Danyliw and Éri | ||||
| c Vyncke for extensive feedback.</t> | ||||
| <t> | <t>Thank you to <contact fullname="Tony Hansen"/> for helping with the ind | |||
| This document incorporates text from RFC 4315 (by Mark Crispin), RFC 44 | ex generation. | |||
| 66 (by Cyrus Daboo), | Thank you to <contact fullname="Murray Kucherawy"/>, <contact fullname= | |||
| RFC 4731 (by Dave Cridland), RFC 5161 (by Arnt Gulbrandsen), | "Timo Sirainen"/>, <contact fullname="Bron Gondwana"/>, <contact fullname="Steph | |||
| RFC 5465 (by Arnt Gulbrandsen and Curtis King), RFC 5530 (by Arnt Gulbr | an Bosch"/>, <contact fullname="Robert Sparks"/>, | |||
| andsen), | <contact fullname="Arnt Gulbrandsen"/>, <contact fullname="Benjamin Kad | |||
| RFC 5819 (by Timo Sirainen), RFC 6154 (by Jamie Nicolson), RFC 8438 (by | uk"/>, <contact fullname="Daniel Migaul"/>, <contact fullname="Roman Danyliw"/>, | |||
| Stephan Bosch) | and <contact fullname="Éric Vyncke"/> for extensive feedback.</t> | |||
| <!--/////Update this list before publication--> | <t> | |||
| This document incorporates text from | ||||
| <xref target="RFC2342" format="default"/> (by <contact fullname="Mike G | ||||
| ahrns"/> and <contact fullname="Chris Newman"/>), | ||||
| <xref target="RFC3516" format="default"/> (by <contact fullname="Lyndon | ||||
| Nerenberg"/>), | ||||
| <xref target="RFC4315" format="default"/> (by <contact fullname="Mark C | ||||
| rispin"/>), | ||||
| <xref target="RFC4466" format="default"/> (by <contact fullname="Cyrus | ||||
| Daboo"/>), | ||||
| <xref target="RFC4731" format="default"/> (by <contact fullname="Dave C | ||||
| ridland"/>), | ||||
| <xref target="RFC4959" format="default"/> (by <contact fullname="Rob Si | ||||
| emborski"/> and <contact fullname="Arnt Gulbrandsen"/>), | ||||
| <xref target="RFC5161" format="default"/> (by <contact fullname="Arnt G | ||||
| ulbrandsen"/>), | ||||
| <xref target="RFC5465" format="default"/> (by <contact fullname="Arnt G | ||||
| ulbrandsen"/> and <contact fullname="Curtis King"/>), | ||||
| <xref target="RFC5530" format="default"/> (by <contact fullname="Arnt G | ||||
| ulbrandsen"/>), | ||||
| <xref target="RFC5819" format="default"/> (by <contact fullname="Timo S | ||||
| irainen"/>), | ||||
| <xref target="RFC6154" format="default"/> (by <contact fullname="Jamie | ||||
| Nicolson"/>), | ||||
| <xref target="RFC6851" format="default"/> (by <contact fullname="Arnt G | ||||
| ulbrandsen"/> and <contact fullname="Ned Freed"/>), | ||||
| and <xref target="RFC8438" format="default"/> (by <contact fullname="St | ||||
| ephan Bosch"/>), | ||||
| so work done by authors/editors of these documents is appreciated. Note that editors | so work done by authors/editors of these documents is appreciated. Note that editors | |||
| of this document were redacted from the above list.</t> | of this document were redacted from the above list.</t> | |||
| <t>The CHILDREN return option was originally proposed by Mike Gahrns an | <t>The CHILDREN return option was originally proposed by <contact fullname | |||
| d Raymond Cheng in <xref target="RFC3348"/>. | ="Mike Gahrns"/> and <contact fullname="Raymond Cheng"/> in <xref target="RFC334 | |||
| Most of the information in <xref target="children"/> is taken | 8" format="default"/>. | |||
| directly from their original specification <xref target="RFC3348"/>.</t | Most of the information in <xref target="children" format="default"/> i | |||
| > | s taken | |||
| directly from their original specification <xref target="RFC3348" format=" | ||||
| default"/>.</t> | ||||
| <t>Thank you to Damian Poddebniak, Fabian Ising, Hanno Böck and Sebasti an Schinzel for pointing out that | <t>Thank you to <contact fullname="Damian Poddebniak"/>, <contact fullname ="Fabian Ising"/>, <contact fullname="Hanno Boeck"/>, and <contact fullname="Seb astian Schinzel"/> for pointing out that | |||
| the ENABLE command should be a member of "command-auth" and not "comman d-any" ABNF production, | the ENABLE command should be a member of "command-auth" and not "comman d-any" ABNF production, | |||
| as well as pointing out security issues associated with ALERT, PREAUTH and other responses received | as well as pointing out security issues associated with ALERT, PREAUTH, and other responses received | |||
| before authentication. | before authentication. | |||
| </t> | </t> | |||
| </section> | ||||
| </back> | </section> | |||
| </back> | ||||
| </rfc> | </rfc> | |||
| End of changes. 1375 change blocks. | ||||
| 7984 lines changed or deleted | 7040 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||