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/ |