rfc9051.original | rfc9051.txt | |||
---|---|---|---|---|
Network Working Group A. Melnikov, Ed. | Internet Engineering Task Force (IETF) A. Melnikov, Ed. | |||
Internet-Draft Isode Ltd | Request for Comments: 9051 Isode Ltd | |||
Obsoletes: 3501 (if approved) B. Leiba, Ed. | Obsoletes: 3501 B. Leiba, Ed. | |||
Intended status: Standards Track Futurewei Technologies | Category: Standards Track Futurewei Technologies | |||
Expires: August 20, 2021 February 16, 2021 | ISSN: 2070-1721 August 2021 | |||
Internet Message Access Protocol (IMAP) - Version 4rev2 | Internet Message Access Protocol (IMAP) - Version 4rev2 | |||
draft-ietf-extra-imap4rev2-30 | ||||
Abstract | Abstract | |||
The Internet Message Access Protocol, Version 4rev2 (IMAP4rev2) | The Internet Message Access Protocol Version 4rev2 (IMAP4rev2) allows | |||
allows a client to access and manipulate electronic mail messages on | a client to access and manipulate electronic mail messages on a | |||
a server. IMAP4rev2 permits manipulation of mailboxes (remote | server. IMAP4rev2 permits manipulation of mailboxes (remote message | |||
message folders) in a way that is functionally equivalent to local | folders) in a way that is functionally equivalent to local folders. | |||
folders. IMAP4rev2 also provides the capability for an offline | IMAP4rev2 also provides the capability for an offline client to | |||
client to resynchronize with the server. | resynchronize with the server. | |||
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, | setting and clearing flags; parsing per RFCs 5322, 2045, and 2231; | |||
searching, and selective fetching of message attributes, texts, and | searching; and selective fetching of message attributes, texts, and | |||
portions thereof. Messages in IMAP4rev2 are accessed by the use of | portions thereof. Messages in IMAP4rev2 are accessed by the use of | |||
numbers. These numbers are either message sequence numbers or unique | numbers. These numbers are either message sequence numbers or unique | |||
identifiers. | identifiers. | |||
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 | handled by a mail submission protocol such as the one specified in | |||
RFC 6409. | RFC 6409. | |||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This is an Internet Standards Track document. | |||
provisions of BCP 78 and BCP 79. | ||||
Internet-Drafts are working documents of the Internet Engineering | ||||
Task Force (IETF). Note that other groups may also distribute | ||||
working documents as Internet-Drafts. The list of current Internet- | ||||
Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
Internet Standards is available in Section 2 of RFC 7841. | ||||
This Internet-Draft will expire on August 20, 2021. | Information about the current status of this document, any errata, | |||
and how to provide feedback on it may be obtained at | ||||
https://www.rfc-editor.org/info/rfc9051. | ||||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2021 IETF Trust and the persons identified as the | Copyright (c) 2021 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
(https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
publication of this document. Please review these documents | publication of this document. Please review these documents | |||
skipping to change at page 2, line 34 ¶ | skipping to change at line 74 ¶ | |||
modifications of such material outside the IETF Standards Process. | modifications of such material outside the IETF Standards Process. | |||
Without obtaining an adequate license from the person(s) controlling | Without obtaining an adequate license from the person(s) controlling | |||
the copyright in such materials, this document may not be modified | the copyright in such materials, this document may not be modified | |||
outside the IETF Standards Process, and derivative works of it may | outside the IETF Standards Process, and derivative works of it may | |||
not be created outside the IETF Standards Process, except to format | not be created outside the IETF Standards Process, except to format | |||
it for publication as an RFC or to translate it into languages other | it for publication as an RFC or to translate it into languages other | |||
than English. | than English. | |||
Table of Contents | Table of Contents | |||
1. How to Read This Document . . . . . . . . . . . . . . . . . . 5 | 1. How to Read This Document | |||
1.1. Organization of This Document . . . . . . . . . . . . . . 5 | 1.1. Organization of This Document | |||
1.2. Conventions Used in This Document . . . . . . . . . . . . 5 | 1.2. Conventions Used in This Document | |||
1.3. Special Notes to Implementors . . . . . . . . . . . . . . 6 | 1.3. Special Notes to Implementors | |||
2. Protocol Overview . . . . . . . . . . . . . . . . . . . . . . 7 | 2. Protocol Overview | |||
2.1. Link Level . . . . . . . . . . . . . . . . . . . . . . . 7 | 2.1. Link Level | |||
2.2. Commands and Responses . . . . . . . . . . . . . . . . . 7 | 2.2. Commands and Responses | |||
2.2.1. Client Protocol Sender and Server Protocol Receiver . 8 | 2.2.1. Client Protocol Sender and Server Protocol Receiver | |||
2.2.2. Server Protocol Sender and Client Protocol Receiver . 8 | 2.2.2. Server Protocol Sender and Client Protocol Receiver | |||
2.3. Message Attributes . . . . . . . . . . . . . . . . . . . 9 | 2.3. Message Attributes | |||
2.3.1. Message Numbers . . . . . . . . . . . . . . . . . . . 9 | 2.3.1. Message Numbers | |||
2.3.2. Flags Message Attribute . . . . . . . . . . . . . . . 12 | 2.3.2. Flags Message Attribute | |||
2.3.3. Internal Date Message Attribute . . . . . . . . . . . 14 | 2.3.3. Internal Date Message Attribute | |||
2.3.4. [RFC-5322] Size Message Attribute . . . . . . . . . . 14 | 2.3.4. RFC822.SIZE Message Attribute | |||
2.3.5. Envelope Structure Message Attribute . . . . . . . . 14 | 2.3.5. Envelope Structure Message Attribute | |||
2.3.6. Body Structure Message Attribute . . . . . . . . . . 14 | 2.3.6. Body Structure Message Attribute | |||
2.4. Message Texts . . . . . . . . . . . . . . . . . . . . . . 15 | 2.4. Message Texts | |||
3. State and Flow Diagram . . . . . . . . . . . . . . . . . . . 15 | 3. State and Flow Diagram | |||
3.1. Not Authenticated State . . . . . . . . . . . . . . . . . 15 | 3.1. Not Authenticated State | |||
3.2. Authenticated State . . . . . . . . . . . . . . . . . . . 15 | 3.2. Authenticated State | |||
3.3. Selected State . . . . . . . . . . . . . . . . . . . . . 15 | 3.3. Selected State | |||
3.4. Logout State . . . . . . . . . . . . . . . . . . . . . . 15 | 3.4. Logout State | |||
4. Data Formats . . . . . . . . . . . . . . . . . . . . . . . . 18 | 4. Data Formats | |||
4.1. Atom . . . . . . . . . . . . . . . . . . . . . . . . . . 18 | 4.1. Atom | |||
4.1.1. Sequence set and UID set . . . . . . . . . . . . . . 18 | 4.1.1. Sequence Set and UID Set | |||
4.2. Number . . . . . . . . . . . . . . . . . . . . . . . . . 18 | 4.2. Number | |||
4.3. String . . . . . . . . . . . . . . . . . . . . . . . . . 18 | 4.3. String | |||
4.3.1. 8-bit and Binary Strings . . . . . . . . . . . . . . 19 | 4.3.1. 8-Bit and Binary Strings | |||
4.4. Parenthesized List . . . . . . . . . . . . . . . . . . . 20 | 4.4. Parenthesized List | |||
4.5. NIL . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 | 4.5. NIL | |||
5. Operational Considerations . . . . . . . . . . . . . . . . . 21 | 5. Operational Considerations | |||
5.1. Mailbox Naming . . . . . . . . . . . . . . . . . . . . . 21 | 5.1. Mailbox Naming | |||
5.1.1. Mailbox Hierarchy Naming . . . . . . . . . . . . . . 22 | 5.1.1. Mailbox Hierarchy Naming | |||
5.1.2. Namespaces . . . . . . . . . . . . . . . . . . . . . 22 | 5.1.2. Namespaces | |||
5.2. Mailbox Size and Message Status Updates . . . . . . . . . 24 | 5.2. Mailbox Size and Message Status Updates | |||
5.3. Response when no Command in Progress . . . . . . . . . . 24 | 5.3. Response When No Command in Progress | |||
5.4. Autologout Timer . . . . . . . . . . . . . . . . . . . . 24 | 5.4. Autologout Timer | |||
5.5. Multiple Commands in Progress (Command Pipelining) . . . 25 | 5.5. Multiple Commands in Progress (Command Pipelining) | |||
6. Client Commands . . . . . . . . . . . . . . . . . . . . . . . 26 | 6. Client Commands | |||
6.1. Client Commands - Any State . . . . . . . . . . . . . . . 27 | 6.1. Client Commands - Any State | |||
6.1.1. CAPABILITY Command . . . . . . . . . . . . . . . . . 27 | 6.1.1. CAPABILITY Command | |||
6.1.2. NOOP Command . . . . . . . . . . . . . . . . . . . . 28 | 6.1.2. NOOP Command | |||
6.1.3. LOGOUT Command . . . . . . . . . . . . . . . . . . . 28 | 6.1.3. LOGOUT Command | |||
6.2. Client Commands - Not Authenticated State . . . . . . . . 29 | 6.2. Client Commands - Not Authenticated State | |||
6.2.1. STARTTLS Command . . . . . . . . . . . . . . . . . . 29 | 6.2.1. STARTTLS Command | |||
6.2.2. AUTHENTICATE Command . . . . . . . . . . . . . . . . 31 | 6.2.2. AUTHENTICATE Command | |||
6.2.3. LOGIN Command . . . . . . . . . . . . . . . . . . . . 35 | 6.2.3. LOGIN Command | |||
6.3. Client Commands - Authenticated State . . . . . . . . . . 35 | 6.3. Client Commands - Authenticated State | |||
6.3.1. ENABLE Command . . . . . . . . . . . . . . . . . . . 36 | 6.3.1. ENABLE Command | |||
6.3.2. SELECT Command . . . . . . . . . . . . . . . . . . . 38 | 6.3.2. SELECT Command | |||
6.3.3. EXAMINE Command . . . . . . . . . . . . . . . . . . . 40 | 6.3.3. EXAMINE Command | |||
6.3.4. CREATE Command . . . . . . . . . . . . . . . . . . . 41 | 6.3.4. CREATE Command | |||
6.3.5. DELETE Command . . . . . . . . . . . . . . . . . . . 42 | 6.3.5. DELETE Command | |||
6.3.6. RENAME Command . . . . . . . . . . . . . . . . . . . 44 | 6.3.6. RENAME Command | |||
6.3.7. SUBSCRIBE Command . . . . . . . . . . . . . . . . . . 47 | 6.3.7. SUBSCRIBE Command | |||
6.3.8. UNSUBSCRIBE Command . . . . . . . . . . . . . . . . . 47 | 6.3.8. UNSUBSCRIBE Command | |||
6.3.9. LIST Command . . . . . . . . . . . . . . . . . . . . 48 | 6.3.9. LIST Command | |||
6.3.10. NAMESPACE Command . . . . . . . . . . . . . . . . . . 66 | 6.3.10. NAMESPACE Command | |||
6.3.11. STATUS Command . . . . . . . . . . . . . . . . . . . 71 | 6.3.11. STATUS Command | |||
6.3.12. APPEND Command . . . . . . . . . . . . . . . . . . . 73 | 6.3.12. APPEND Command | |||
6.3.13. IDLE Command . . . . . . . . . . . . . . . . . . . . 76 | 6.3.13. IDLE Command | |||
6.4. Client Commands - Selected State . . . . . . . . . . . . 77 | 6.4. Client Commands - Selected State | |||
6.4.1. CLOSE Command . . . . . . . . . . . . . . . . . . . . 78 | 6.4.1. CLOSE Command | |||
6.4.2. UNSELECT Command . . . . . . . . . . . . . . . . . . 78 | 6.4.2. UNSELECT Command | |||
6.4.3. EXPUNGE Command . . . . . . . . . . . . . . . . . . . 79 | 6.4.3. EXPUNGE Command | |||
6.4.4. SEARCH Command . . . . . . . . . . . . . . . . . . . 79 | 6.4.4. SEARCH Command | |||
6.4.5. FETCH Command . . . . . . . . . . . . . . . . . . . . 92 | 6.4.5. FETCH Command | |||
6.4.6. STORE Command . . . . . . . . . . . . . . . . . . . . 97 | 6.4.6. STORE Command | |||
6.4.7. COPY Command . . . . . . . . . . . . . . . . . . . . 98 | 6.4.7. COPY Command | |||
6.4.8. MOVE Command . . . . . . . . . . . . . . . . . . . . 99 | 6.4.8. MOVE Command | |||
6.4.9. UID Command . . . . . . . . . . . . . . . . . . . . . 101 | 6.4.9. UID Command | |||
6.5. Client Commands - Experimental/Expansion . . . . . . . . 103 | 6.5. Client Commands - Experimental/Expansion | |||
7. Server Responses . . . . . . . . . . . . . . . . . . . . . . 103 | 7. Server Responses | |||
7.1. Server Responses - Generic Status Responses . . . . . . . 104 | 7.1. Server Responses - Generic Status Responses | |||
7.1.1. OK Response . . . . . . . . . . . . . . . . . . . . . 113 | 7.1.1. OK Response | |||
7.1.2. NO Response . . . . . . . . . . . . . . . . . . . . . 113 | 7.1.2. NO Response | |||
7.1.3. BAD Response . . . . . . . . . . . . . . . . . . . . 113 | 7.1.3. BAD Response | |||
7.1.4. PREAUTH Response . . . . . . . . . . . . . . . . . . 114 | 7.1.4. PREAUTH Response | |||
7.1.5. BYE Response . . . . . . . . . . . . . . . . . . . . 114 | 7.1.5. BYE Response | |||
7.2. Server Responses - Server Status . . . . . . . . . . . . 115 | 7.2. Server Responses - Server Status | |||
7.2.1. ENABLED Response . . . . . . . . . . . . . . . . . . 115 | 7.2.1. ENABLED Response | |||
7.2.2. CAPABILITY Response . . . . . . . . . . . . . . . . . 115 | 7.2.2. CAPABILITY Response | |||
7.3. Server Responses - Mailbox Status . . . . . . . . . . . . 117 | 7.3. Server Responses - Mailbox Status | |||
7.3.1. LIST Response . . . . . . . . . . . . . . . . . . . . 117 | 7.3.1. LIST Response | |||
7.3.2. NAMESPACE Response . . . . . . . . . . . . . . . . . 121 | 7.3.2. NAMESPACE Response | |||
7.3.3. STATUS Response . . . . . . . . . . . . . . . . . . . 121 | 7.3.3. STATUS Response | |||
7.3.4. ESEARCH Response . . . . . . . . . . . . . . . . . . 121 | 7.3.4. ESEARCH Response | |||
7.3.5. FLAGS Response . . . . . . . . . . . . . . . . . . . 123 | 7.3.5. FLAGS Response | |||
7.4. Server Responses - Mailbox Size . . . . . . . . . . . . . 123 | 7.4. Server Responses - Mailbox Size | |||
7.4.1. EXISTS Response . . . . . . . . . . . . . . . . . . . 123 | 7.4.1. EXISTS Response | |||
7.5. Server Responses - Message Status . . . . . . . . . . . . 123 | 7.5. Server Responses - Message Status | |||
7.5.1. EXPUNGE Response . . . . . . . . . . . . . . . . . . 123 | 7.5.1. EXPUNGE Response | |||
7.5.2. FETCH Response . . . . . . . . . . . . . . . . . . . 124 | 7.5.2. FETCH Response | |||
7.6. Server Responses - Command Continuation Request . . . . . 130 | 7.6. Server Responses - Command Continuation Request | |||
8. Sample IMAP4rev2 connection . . . . . . . . . . . . . . . . . 131 | 8. Sample IMAP4rev2 Connection | |||
9. Formal Syntax . . . . . . . . . . . . . . . . . . . . . . . . 132 | 9. Formal Syntax | |||
10. Author's Note . . . . . . . . . . . . . . . . . . . . . . . . 150 | 10. Author's Note | |||
11. Security Considerations . . . . . . . . . . . . . . . . . . . 150 | 11. Security Considerations | |||
11.1. TLS related Security Considerations . . . . . . . . . . 151 | 11.1. TLS-Related Security Considerations | |||
11.2. STARTTLS command versa use of Implicit TLS port . . . . 151 | 11.2. STARTTLS Command versus Use of Implicit TLS Port | |||
11.3. Client handling of unsolicited responses not suitable | 11.3. Client Handling of Unsolicited Responses Not Suitable for | |||
for the current connection state . . . . . . . . . . . . 152 | the Current Connection State | |||
11.4. COPYUID and APPENDUID response codes . . . . . . . . . . 152 | 11.4. COPYUID and APPENDUID Response Codes | |||
11.5. LIST command and Other Users' namespace . . . . . . . . 153 | 11.5. LIST Command and Other Users' Namespace | |||
11.6. Use of MD5 . . . . . . . . . . . . . . . . . . . . . . . 153 | 11.6. Use of MD5 | |||
11.7. Other Security Considerations . . . . . . . . . . . . . 153 | 11.7. Other Security Considerations | |||
12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 154 | 12. IANA Considerations | |||
12.1. Updates to IMAP4 Capabilities registry . . . . . . . . . 154 | 12.1. Updates to IMAP Capabilities Registry | |||
12.2. GSSAPI/SASL service name . . . . . . . . . . . . . . . . 155 | 12.2. GSSAPI/SASL Service Name | |||
12.3. LIST Selection Options, LIST Return Options, LIST | 12.3. LIST Selection Options, LIST Return Options, and LIST | |||
extended data items . . . . . . . . . . . . . . . . . . 155 | Extended Data Items | |||
12.4. IMAP Mailbox Name Attributes and IMAP Response Codes . . 155 | 12.4. IMAP Mailbox Name Attributes and IMAP Response Codes | |||
13. References . . . . . . . . . . . . . . . . . . . . . . . . . 155 | 13. References | |||
13.1. Normative References . . . . . . . . . . . . . . . . . . 156 | 13.1. Normative References | |||
13.2. Informative References (related protocols) . . . . . . . 159 | 13.2. Informative References | |||
13.3. Informative References (historical aspects of IMAP and | 13.2.1. Related Protocols | |||
related protocols) . . . . . . . . . . . . . . . . . . . 162 | 13.2.2. Historical Aspects of IMAP and Related Protocols | |||
Appendix A. Backward compatibility with IMAP4rev1 . . . . . . . 163 | Appendix A. Backward Compatibility with IMAP4rev1 | |||
A.1. Mailbox International Naming Convention for compatibility | A.1. Mailbox International Naming Convention for Compatibility | |||
with IMAP4rev1 . . . . . . . . . . . . . . . . . . . . . 163 | with IMAP4rev1 | |||
Appendix B. Backward compatibility with BINARY extension . . . . 165 | Appendix B. Backward Compatibility with BINARY Extension | |||
Appendix C. Backward compatibility with LIST-EXTENDED extension 165 | Appendix C. Backward Compatibility with LIST-EXTENDED Extension | |||
Appendix D. 63 bit body part and message sizes . . . . . . . . . 165 | Appendix D. 63-Bit Body Part and Message Sizes | |||
Appendix E. Changes from RFC 3501 / IMAP4rev1 . . . . . . . . . 166 | Appendix E. Changes from RFC 3501 / IMAP4rev1 | |||
Appendix F. Other Recommended IMAP Extensions . . . . . . . . . 168 | Appendix F. Other Recommended IMAP Extensions | |||
Appendix G. Acknowledgement . . . . . . . . . . . . . . . . . . 168 | Acknowledgements | |||
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 | Index | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 174 | Authors' Addresses | |||
1. How to Read This Document | 1. How to Read This Document | |||
1.1. Organization of This Document | 1.1. Organization of This Document | |||
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 | Section 2, it is not optimized for someone trying to understand the | |||
operation of the protocol. The material in sections 3 through 5 | operation of the protocol. The material in Sections 3, 4, and 5 | |||
provides the general context and definitions with which IMAP4rev2 | provides the general context and definitions with which IMAP4rev2 | |||
operates. | operates. | |||
Sections 6, 7, and 9 describe the IMAP commands, responses, and | Sections 6, 7, and 9 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 (Section 9). | section alone; instead, refer to "Formal Syntax" (Section 9). | |||
1.2. Conventions Used in This Document | 1.2. Conventions Used in This Document | |||
"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. | |||
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 | server, respectively. Note that each line includes the terminating | |||
CRLF. | CRLF. | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in | |||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
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. | |||
"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. | |||
"Connection" refers to the entire sequence of client/server | "Connection" refers to the entire sequence of client/server | |||
skipping to change at page 6, line 24 ¶ | skipping to change at line 254 ¶ | |||
until its termination. | until its termination. | |||
"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). | |||
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 | "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 | command in IMAP that is used by the client and the server to | |||
explicitly negotiate TLS on an established cleartext TCP connection. | explicitly negotiate TLS on an established cleartext TCP connection. | |||
Characters are 8-bit UTF-8 (of which 7-bit US-ASCII is a subset) | Characters are 8-bit UTF-8 (of which 7-bit US-ASCII is a subset), | |||
unless otherwise specified. Other character sets are indicated using | unless otherwise specified. Other character sets are indicated using | |||
a "CHARSET", as described in [MIME-IMT] and defined in [CHARSET]. | a "CHARSET", as described in [MIME-IMT] and defined in [CHARSET]. | |||
CHARSETs have important additional semantics in addition to defining | CHARSETs have important additional semantics in addition to defining | |||
character set; refer to these documents for more detail. | a character set; refer to these documents for more detail. | |||
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. | |||
1.3. Special Notes to Implementors | 1.3. Special Notes to Implementors | |||
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 [IMAP-IMPLEMENTATION] in | IMAP implementation recommendations document [IMAP-IMPLEMENTATION] 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. | |||
IMAP4rev2 is designed to be upwards compatible from the IMAP4rev1 | IMAP4rev2 is designed to be upwards compatible from the IMAP4rev1 | |||
[RFC3501], the [IMAP2] and unpublished IMAP2bis [IMAP2BIS] protocols. | [RFC3501], IMAP2 [IMAP2], and unpublished IMAP2bis [IMAP2BIS] | |||
IMAP4rev2 is largely compatible with the IMAP4rev1 protocol described | protocols. IMAP4rev2 is largely compatible with the IMAP4rev1 | |||
in RFC 3501 and the IMAP4 protocol described in RFC 1730; the | protocol described in RFC 3501 and the IMAP4 protocol described in | |||
exception being in certain facilities added in RFC 1730 and RFC 3501 | [RFC1730]; the exception being in certain facilities added in | |||
that proved problematic and were subsequently removed or replaced by | [RFC1730] and [RFC3501] that proved problematic and were subsequently | |||
better alternatives. In the course of the evolution of IMAP4rev2, | removed or replaced by better alternatives. In the course of the | |||
some aspects in the earlier protocols have become obsolete. Obsolete | evolution of IMAP4rev2, some aspects in the earlier protocols have | |||
commands, responses, and data formats which an IMAP4rev2 | become obsolete. Obsolete commands, responses, and data formats that | |||
implementation can encounter when used with an earlier implementation | an IMAP4rev2 implementation can encounter when used with an earlier | |||
are described in Appendix E, Appendix A and [IMAP-OBSOLETE]. | implementation are described in Appendices A and E and | |||
IMAP4rev2 supports 63bit body part and message sizes. IMAP4rev2 | [IMAP-OBSOLETE]. IMAP4rev2 supports 63-bit body parts and message | |||
compatibility with BINARY and LIST-EXTENDED IMAP extensions are | sizes. IMAP4rev2 compatibility with BINARY and LIST-EXTENDED IMAP | |||
described in Appendix B and Appendix C respectively. | extensions are described in Appendices B and C, respectively. | |||
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 [IMAP-COMPAT]. A full | the earlier protocol, are discussed in [IMAP-COMPAT]. A full | |||
discussion of compatibility issues with rare (and presumed extinct) | discussion of compatibility issues with rare (and presumed extinct) | |||
variants of [IMAP2] is in [IMAP-HISTORICAL]; this document is | variants of [IMAP2] is in [IMAP-HISTORICAL]; this document is | |||
primarily of historical interest. | primarily of historical interest. | |||
IMAP was originally developed for the older [RFC-822] standard, and | IMAP was originally developed for the older [RFC822] standard, and as | |||
as a consequence, "RFC822.SIZE" fetch item in IMAP incorporates | a consequence, the "RFC822.SIZE" fetch item in IMAP incorporates | |||
"RFC822" in its name. "RFC822" should be interpreted as a reference | "RFC822" in its name. "RFC822" should be interpreted as a reference | |||
to the updated [RFC-5322] standard. | to the updated [RFC5322] standard. | |||
IMAP4rev2 does not specify a means of posting mail; this function is | ||||
handled by a mail submission protocol such as the one specified in | ||||
[RFC6409]. | ||||
2. Protocol Overview | 2. Protocol Overview | |||
2.1. Link Level | 2.1. Link Level | |||
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). | |||
2.2. Commands and Responses | 2.2. Commands and Responses | |||
An IMAP4rev2 connection consists of the establishment of a client/ | An IMAP4rev2 connection consists of the establishment of a client/ | |||
server network connection, an initial greeting from the server, and | server network connection, an initial greeting from the server, and | |||
client/server interactions. These client/server interactions consist | client/server interactions. These client/server interactions consist | |||
of a client command, server data, and a server completion result | of a client command, server data, and a server completion result | |||
response. | response. | |||
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 a | |||
reading a sequence of octets with a known count followed by a line. | sequence of octets with a known count followed by a line. | |||
2.2.1. Client Protocol Sender and Server Protocol Receiver | 2.2.1. Client Protocol Sender and Server Protocol Receiver | |||
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. More formally: the client | generated by the client for each command. More formally: the client | |||
SHOULD generate a unique tag for every command, but a server MUST | SHOULD generate a unique tag for every command, but a server MUST | |||
accept tag reuse. | accept tag reuse. | |||
skipping to change at page 8, line 33 ¶ | skipping to change at line 359 ¶ | |||
case, the server sends a command continuation request response if it | case, the server sends a command continuation request response if it | |||
is ready for the octets (if appropriate) and the remainder of the | is ready for the octets (if appropriate) and the remainder of the | |||
command. This response is prefixed with the token "+". | command. This response is prefixed with the token "+". | |||
Note: If, instead, the server detected an error in the command, it | Note: If, instead, the server detected an error in the command, it | |||
sends a BAD completion response with a tag matching the command | sends a BAD completion response with a tag matching the command | |||
(as described below) to reject the command and prevent the client | (as described below) to reject the command and prevent the client | |||
from sending any more of the command. | from sending any more of the command. | |||
It is also possible for the server to send a completion response | It is also possible for the server to send a completion response | |||
for some other command (if multiple commands are in progress), or | for some other command (if multiple commands are in progress) or | |||
untagged data. In either case, the command continuation request | untagged data. In either case, the command continuation request | |||
is still pending; the client takes the appropriate action for the | is still pending; the client takes the appropriate action for the | |||
response, and reads another response from the server. In all | response and reads another response from the server. In all | |||
cases, the client MUST send a complete command (including | cases, the client MUST send a complete command (including | |||
receiving all command continuation request responses and sending | receiving all command continuation request responses and sending | |||
command continuations for the command) before initiating a new | command continuations for the command) before initiating a new | |||
command. | command. | |||
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. | |||
2.2.2. Server Protocol Sender and Client Protocol Receiver | 2.2.2. Server Protocol Sender and Client Protocol Receiver | |||
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. | |||
Server data MAY be sent as a result of a client command, or MAY be | Server data MAY be sent as a result of a client command or MAY 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. | |||
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). | |||
Servers SHOULD enforce the syntax outlined in this specification | Servers SHOULD strictly enforce the syntax outlined in this | |||
strictly. Any client command with a protocol syntax error, including | specification. Any client command with a protocol syntax error, | |||
(but not limited to) missing or extraneous spaces or arguments, | including (but not limited to) missing or extraneous spaces or | |||
SHOULD be rejected, and the client given a BAD server completion | arguments, SHOULD be rejected and the client given a BAD server | |||
response. | completion response. | |||
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 "+". | |||
A client MUST be prepared to accept any server response at all times. | A client MUST be prepared to accept any server response at all times. | |||
This includes server data that was not requested. Server data SHOULD | This includes server data that was not requested. Server data SHOULD | |||
be remembered (cached), so that the client can reference its | be remembered (cached), so that the client can reference its | |||
remembered copy rather than sending a command to the server to | remembered copy rather than sending a command to the server to | |||
request the data. In the case of certain server data, the data MUST | request the data. In the case of certain server data, the data MUST | |||
be remembered, as specified elsewhere in this document. | be remembered, as specified elsewhere in this document. | |||
This topic is discussed in greater detail in the Server Responses | This topic is discussed in greater detail in "Server Responses" (see | |||
section. | Section 7). | |||
2.3. Message Attributes | 2.3. Message Attributes | |||
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. | |||
2.3.1. Message Numbers | 2.3.1. Message Numbers | |||
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. | |||
2.3.1.1. Unique Identifier (UID) Message Attribute | 2.3.1.1. Unique Identifier (UID) Message Attribute | |||
A UID is an unsigned non-zero 32-bit value assigned to each message, | A UID is an unsigned non-zero 32-bit value assigned to each message, | |||
which when used with the unique identifier validity value (see below) | which when used with the unique identifier validity value (see below) | |||
forms a 64-bit value that MUST NOT refer to any other message in the | forms a 64-bit value that MUST NOT refer to any other message in the | |||
mailbox or any subsequent mailbox with the same name forever. Unique | mailbox or any subsequent mailbox with the same name forever. Unique | |||
identifiers are assigned in a strictly ascending fashion in the | identifiers are assigned in a strictly ascending fashion in the | |||
mailbox; as each message is added to the mailbox it is assigned a | mailbox; as each message is added to the mailbox, it is assigned a | |||
higher UID than the message(s) which were added previously. Unlike | higher UID than those of all message(s) that are already in the | |||
message sequence numbers, unique identifiers are not necessarily | mailbox. Unlike message sequence numbers, unique identifiers are not | |||
contiguous. | necessarily contiguous. | |||
The unique identifier of a message MUST NOT change during the | The unique identifier of a message MUST NOT change during the session | |||
session, and SHOULD NOT change between sessions. Any change of | and SHOULD NOT change between sessions. Any change of unique | |||
unique identifiers between sessions MUST be detectable using the | identifiers between sessions MUST be detectable using the UIDVALIDITY | |||
UIDVALIDITY mechanism discussed below. Persistent unique identifiers | mechanism discussed below. Persistent unique identifiers are | |||
are required for a client to resynchronize its state from a previous | required for a client to resynchronize its state from a previous | |||
session with the server (e.g., disconnected or offline access clients | session with the server (e.g., disconnected or offline access clients | |||
[IMAP-MODEL]); this is discussed further in [IMAP-DISC]. | [IMAP-MODEL]); this is discussed further in [IMAP-DISC]. | |||
Associated with every mailbox are two 32-bit unsigned non-zero values | Associated with every mailbox are two 32-bit unsigned non-zero values | |||
which aid in unique identifier handling: the next unique identifier | that aid in unique identifier handling: the next unique identifier | |||
value (UIDNEXT) and the unique identifier validity value | value (UIDNEXT) and the unique identifier validity value | |||
(UIDVALIDITY). | (UIDVALIDITY). | |||
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 MUST have the following two characteristics. First, | |||
the next unique identifier value MUST NOT change unless new messages | the next unique identifier value MUST NOT change unless new messages | |||
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 MUST change whenever new messages are added to the mailbox, | |||
even if those new messages are subsequently expunged. | even if those new messages are subsequently expunged. | |||
Note: The next unique identifier value is intended to provide a | | Note: The next unique identifier value is intended to provide a | |||
means for a client to determine whether any messages have been | | means for a client to determine whether any messages have been | |||
delivered to the mailbox since the previous time it checked this | | delivered to the mailbox since the previous time it checked | |||
value. It is not intended to provide any guarantee that any | | this value. It is not intended to provide any guarantee that | |||
message will have this unique identifier. A client can only | | any message will have this unique identifier. A client can | |||
assume, at the time that it obtains the next unique identifier | | only assume, at the time that it obtains the next unique | |||
value, that messages arriving after that time will have a UID | | identifier value, that messages arriving after that time will | |||
greater than or equal to that value. | | have a UID greater than or equal to that value. | |||
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 MUST be greater than | |||
the one used in the earlier session. A good UIDVALIDITY value to use | the one used in the earlier session. A good UIDVALIDITY value to use | |||
is a 32-bit representation of the current date/time when the value is | is a 32-bit representation of the current date/time when the value is | |||
assigned: this ensures that the value is unique and always increases. | assigned: this ensures that the value is unique and always increases. | |||
Another possible alternative is a global counter that gets | Another possible alternative is a global counter that gets | |||
incremented every time a mailbox is created. | incremented every time a mailbox is created. | |||
Note: Ideally, unique identifiers SHOULD persist at all times. | Note: Ideally, unique identifiers SHOULD persist at all times. | |||
Although this specification recognizes that failure to persist can | Although this specification recognizes that failure to persist can | |||
be unavoidable in certain server environments, it strongly | be unavoidable in certain server environments, it strongly | |||
encourages message store implementation techniques that avoid this | encourages message store implementation techniques that avoid this | |||
problem. For example: | problem. For example: | |||
1. Unique identifiers MUST be strictly ascending in the mailbox | 1. Unique identifiers MUST be strictly ascending in the mailbox at | |||
at all times. If the physical message store is re-ordered by | all times. If the physical message store is reordered by a non- | |||
a non-IMAP agent, this requires that the unique identifiers in | IMAP agent, the unique identifiers in the mailbox MUST be | |||
the mailbox be regenerated, since the former unique | regenerated, since the former unique identifiers are no longer | |||
identifiers are no longer strictly ascending as a result of | strictly ascending as a result of the reordering. | |||
the re-ordering. | ||||
2. If the message store has no mechanism to store unique | 2. If the message store has no mechanism to store unique | |||
identifiers, it must regenerate unique identifiers at each | identifiers, it must regenerate unique identifiers at each | |||
session, and each session must have a unique UIDVALIDITY | session, and each session must have a unique UIDVALIDITY value. | |||
value. | Note that this situation can be very disruptive to client message | |||
caching. | ||||
3. If the mailbox is deleted/renamed and a new mailbox with the | 3. If the mailbox is deleted/renamed and a new mailbox with the same | |||
same name is created at a later date, the server must either | name is created at a later date, the server must either keep | |||
keep track of unique identifiers from the previous instance of | track of unique identifiers from the previous instance of the | |||
the mailbox, or it must assign a new UIDVALIDITY value to the | mailbox or assign a new UIDVALIDITY value to the new instance of | |||
new instance of the mailbox. | the mailbox. | |||
4. The combination of mailbox name, UIDVALIDITY, and UID must | 4. The combination of mailbox name, UIDVALIDITY, and UID must refer | |||
refer to a single immutable (or expunged) message on that | to a single, immutable (or expunged) message on that server | |||
server forever. In particular, the internal date, [RFC-5322] | forever. In particular, the internal date, RFC822.SIZE, | |||
size, envelope, body structure, and message texts (all | envelope, body structure, and message texts (all BODY[...] fetch | |||
BODY[...] fetch data items) MUST never change. This does not | data items) MUST never change. This does not include message | |||
include message numbers, nor does it include attributes that | numbers, nor does it include attributes that can be set by a | |||
can be set by a STORE command (e.g., FLAGS). When a message | STORE command (such as FLAGS). When a message is expunged, its | |||
is expunged, its UID MUST NOT be reused under the same | UID MUST NOT be reused under the same UIDVALIDITY value. | |||
UIDVALIDITY value. | ||||
2.3.1.2. Message Sequence Number Message Attribute | 2.3.1.2. Message Sequence Number Message Attribute | |||
A Message Sequence Number is a relative position from 1 to the number | A message sequence number is a relative position from 1 to the number | |||
of messages in the mailbox. This position MUST be ordered by | of messages in the mailbox. This position MUST be ordered by | |||
ascending unique identifier. As each new message is added, it is | ascending unique identifiers. As each new message is added, it is | |||
assigned a message sequence number that is 1 higher than the number | assigned a message sequence number that is 1 higher than the number | |||
of messages in the mailbox before that new message was added. | of messages in the mailbox before that new message was added. | |||
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. | |||
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. | |||
2.3.2. Flags Message Attribute | 2.3.2. Flags Message Attribute | |||
A message has associated with it a list of zero or more named tokens, | A message has a list of zero or more named tokens, known as "flags", | |||
known as "flags". A flag is set by its addition to this list, and is | associated with it. A flag is set by its addition to this list and | |||
cleared by its removal. There are two types of flags in IMAP4rev2: | is cleared by its removal. There are two types of flags in | |||
system flags, and keywords. A flag of either type can also be | IMAP4rev2: system flags and keywords. A flag of either type can be | |||
permanent or session-only. | permanent or session-only. | |||
A system flag is a flag name that is pre-defined in this | A system flag is a flag name that is predefined in this specification | |||
specification and begins with "\". Certain system flags (\Deleted | and begins with "\". Certain system flags (\Deleted and \Seen) have | |||
and \Seen) have special semantics described elsewhere in this | special semantics described elsewhere in this document. The | |||
document. The currently-defined system flags are: | currently defined system flags are: | |||
\Seen Message has been read | \Seen Message has been read | |||
\Answered Message has been answered | \Answered Message has been answered | |||
\Flagged Message is "flagged" for urgent/special attention | \Flagged Message is "flagged" for urgent/special attention | |||
\Deleted Message is "deleted" for removal by later EXPUNGE | \Deleted Message is "deleted" for removal by later EXPUNGE | |||
\Draft Message has not completed composition (marked as a draft). | \Draft Message has not completed composition (marked as a | |||
draft). | ||||
\Recent This flag was in use in IMAP4rev1 and is now deprecated. | \Recent This flag was in use in IMAP4rev1 and is now | |||
deprecated. | ||||
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 MAY permit the client to define new keywords | |||
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 "$" are | code for more information). Some keywords that start with "$" are | |||
also defined in this specification. | also defined in this specification. | |||
This document defines several keywords that were not originally | This document defines several keywords that were not originally | |||
defined in RFC 3501, but which were found to be useful by client | defined in [RFC3501] but were found to be useful by client | |||
implementations. These keywords SHOULD be supported (i.e. allowed in | implementations. These keywords SHOULD be supported (allowed in | |||
SEARCH, allowed and preserved in APPEND, COPY, MOVE commands) by | SEARCH and allowed and preserved in APPEND, COPY, and MOVE commands) | |||
server implementations: | by server implementations: | |||
$Forwarded Message has been forwarded to another email address, | $Forwarded | |||
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 | different (or additional) icon for a message that has been | |||
forwarded. Once set, the flag SHOULD NOT be cleared. | forwarded. Once set, the flag SHOULD NOT be cleared. | |||
$MDNSent Message Disposition Notification [RFC8098] was generated | $MDNSent | |||
and sent for this message. See [RFC3503] for more details on how | Message Disposition Notification [RFC8098] was generated and sent | |||
this keyword is used and for requirements on clients and servers. | for this message. See [RFC3503] for more details on how this | |||
keyword is used and for requirements on clients and servers. | ||||
$Junk The user (or a delivery agent on behalf of the user) may | $Junk | |||
choose to mark a message as definitely containing junk ($Junk; see | The user (or a delivery agent on behalf of the user) may choose to | |||
also the related keyword $NotJunk). The $Junk keyword can be used | mark a message as definitely containing junk ($Junk; see also the | |||
to mark (and potentially move/delete messages later), group or | related keyword $NotJunk). The $Junk keyword can be used to mark, | |||
hide undesirable messages. See [IMAP-KEYWORDS-REG] for more | group, or hide undesirable messages (and such messages might be | |||
moved or deleted later). See [IMAP-KEYWORDS-REG] for more | ||||
information. | information. | |||
$NotJunk The user (or a delivery agent on behalf of the user) may | $NotJunk | |||
choose to mark a message as definitely not containing junk | The user (or a delivery agent on behalf of the user) may choose to | |||
($NotJunk; see also the related keyword $Junk). The $NotJunk | mark a message as definitely not containing junk ($NotJunk; see | |||
keyword can be used to mark, group or show messages that the user | also the related keyword $Junk). The $NotJunk keyword can be used | |||
wants to see. See [IMAP-KEYWORDS-REG] for more information. | to mark, group, or show messages that the user wants to see. See | |||
[IMAP-KEYWORDS-REG] for more information. | ||||
$Phishing | ||||
The $Phishing keyword can be used by a delivery agent to mark a | ||||
message as highly likely to be a phishing email. A message that's | ||||
determined to be a phishing email by the delivery agent should | ||||
also be considered a junk email and have the appropriate junk | ||||
filtering applied, including setting the $Junk flag and placing | ||||
the message in the \Junk special-use mailbox (see Section 7.3.1), | ||||
if available. | ||||
$Phishing The $Phishing keyword can be used by a delivery agent to | ||||
mark a message as highly likely to be a phishing email. An email | ||||
that's determined to be a phishing email by the delivery agent | ||||
should also be considered a junk email and have the appropriate | ||||
junk filtering applied, including setting the $Junk flag and | ||||
placing in the \Junk special-use mailbox (see Section 7.3.1) if | ||||
available. | ||||
If both the $Phishing flag and the $Junk flag are set, the user | If both the $Phishing flag and the $Junk flag are set, the user | |||
agent should display an additional warning message to the user. | agent should display an additional warning message to the user. | |||
Additionally the user agent may display a warning when clicking on | Additionally, the user agent might display a warning, such as | |||
any hyperlinks within the message. | something of the form, "This message may be trying to steal your | |||
personal information," when the user clicks on any hyperlinks | ||||
within the message. | ||||
The requirement for both $Phishing and $Junk to be set before a | The requirement for both $Phishing and $Junk to be set before a | |||
user agent displays a warning is for better backwards | user agent displays a warning is for better backwards | |||
compatibility with existing clients that understand the $Junk flag | compatibility with existing clients that understand the $Junk flag | |||
but not the $Phishing flag. This is so that when an unextended | but not the $Phishing flag. This is so that when an unextended | |||
client removes the $Junk flag, an extended client will also show | client removes the $Junk flag, an extended client will also show | |||
the correct state. See [IMAP-KEYWORDS-REG] for more information. | the correct state. See [IMAP-KEYWORDS-REG] for more information. | |||
$Junk and $NotJunk are mutually exclusive. If more than one of them | $Junk and $NotJunk are mutually exclusive. If more than one of these | |||
is set for a message, the client MUST treat this as if none of them | is set for a message, the client MUST treat it as if none are set, | |||
is set and SHOULD unset both of them on the IMAP server. | and it SHOULD unset both of them on the IMAP server. | |||
Other registered keywords can be found in the "IMAP and JMAP | Other registered keywords can be found in the "IMAP and JMAP | |||
Keywords" registry [IMAP-KEYWORDS-REG]. New keywords SHOULD be | Keywords" registry [IMAP-KEYWORDS-REG]. New keywords SHOULD be | |||
registered in this registry using the procedure specified in | registered in this registry using the procedure specified in | |||
[RFC5788]. | [RFC5788]. | |||
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. | |||
2.3.3. Internal Date Message Attribute | 2.3.3. Internal Date Message Attribute | |||
An Internal Date message attribute is the internal date and time of | An Internal Date message attribute is the internal date and time of | |||
the message on the server. This is not the date and time in the | the message on the server. This is not the date and time in the | |||
[RFC-5322] header, but rather a date and time which reflects when the | [RFC5322] header but rather a date and time that reflects when the | |||
message was received. In the case of messages delivered via [SMTP], | message was received. In the case of messages delivered via [SMTP], | |||
this is the date and time of final delivery of the message as defined | this is the date and time of final delivery of the message as defined | |||
by [SMTP]. In the case of messages delivered by the IMAP4rev2 COPY | by [SMTP]. In the case of messages created by the IMAP4rev2 COPY or | |||
or MOVE command, this SHOULD be the internal date and time of the | MOVE command, this SHOULD be the same as the Internal Date attribute | |||
source message. In the case of messages delivered by the IMAP4rev2 | of the source message. In the case of messages created by the | |||
APPEND command, this SHOULD be the date and time as specified in the | IMAP4rev2 APPEND command, this SHOULD be the date and time as | |||
APPEND command description. All other cases are implementation | specified in the APPEND command description. All other cases are | |||
defined. | implementation defined. | |||
2.3.4. [RFC-5322] Size Message Attribute | 2.3.4. RFC822.SIZE Message Attribute | |||
An RFC 5322 size is the number of octets in the message, as expressed | RFC822.SIZE is the number of octets in the message when the message | |||
in [RFC-5322] format. | is expressed in [RFC5322] format. This size SHOULD match the result | |||
of a "FETCH BODY[]" command. If the message is internally stored in | ||||
some other format, the server calculates the size and often stores it | ||||
for later use to avoid the need for recalculation. | ||||
2.3.5. Envelope Structure Message Attribute | 2.3.5. Envelope Structure Message Attribute | |||
An Envelope Structure is a parsed representation of the [RFC-5322] | An envelope structure is a parsed representation of the [RFC5322] | |||
header of the message. Note that the IMAP Envelope structure is not | header of the message. Note that the IMAP envelope structure is not | |||
the same as an [SMTP] envelope. | the same as an [SMTP] envelope. | |||
2.3.6. Body Structure Message Attribute | 2.3.6. Body Structure Message Attribute | |||
A Body Structure is a parsed representation of the [MIME-IMB] body | A body structure is a parsed representation of the [MIME-IMB] body | |||
structure information of the message. | structure information of the message. | |||
2.4. Message Texts | 2.4. Message Texts | |||
In addition to being able to fetch the full [RFC-5322] text of a | In addition to being able to fetch the full [RFC5322] 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 [RFC-5322] | message text. Specifically, it is possible to fetch the [RFC5322] | |||
message header, [RFC-5322] message body, a [MIME-IMB] body part, or a | message header, the [RFC5322] message body, a [MIME-IMB] body part, | |||
[MIME-IMB] header. | or a [MIME-IMB] header. | |||
3. State and Flow Diagram | 3. State and Flow Diagram | |||
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 state is | IMAP4rev2 connection is in one of four states. The initial state is | |||
identified in the server greeting. Most commands are only valid in | identified in the server greeting. Most commands are only valid in | |||
certain states. It is a protocol error for the client to attempt a | certain states. It is a protocol error for the client to attempt a | |||
command while the connection is in an inappropriate state, and the | command while the connection is in an inappropriate state, and the | |||
server will respond with a BAD or NO (depending upon server | server will respond with a BAD or NO (depending upon server | |||
implementation) command completion result. | implementation) command completion result. | |||
skipping to change at page 15, line 49 ¶ | skipping to change at line 716 ¶ | |||
3.3. Selected State | 3.3. Selected State | |||
In a selected state, a mailbox has been selected to access. This | In a selected state, a mailbox has been selected to access. This | |||
state is entered when a mailbox has been successfully selected. | state is entered when a mailbox has been successfully selected. | |||
3.4. Logout State | 3.4. Logout State | |||
In the logout state, the connection is being terminated. This state | In the logout state, the connection is being terminated. This state | |||
can be entered as a result of a client request (via the LOGOUT | can be entered as a result of a client request (via the LOGOUT | |||
command) or by unilateral action on the part of either the client or | command) or by unilateral action on the part of either the client or | |||
server. | the server. | |||
If the client requests the logout state, the server MUST send an | If the client requests the logout state, the server MUST send an | |||
untagged BYE response and a tagged OK response to the LOGOUT command | untagged BYE response and a tagged OK response to the LOGOUT command | |||
before the server closes the connection; and the client MUST read the | before the server closes the connection; and the client MUST read the | |||
tagged OK response to the LOGOUT command before the client closes the | tagged OK response to the LOGOUT command before the client closes the | |||
connection. | connection. | |||
A server SHOULD NOT unilaterally close the connection without sending | A server SHOULD NOT unilaterally close the connection without first | |||
an untagged BYE response that contains the reason for having done so. | sending an untagged BYE response that contains the reason for doing | |||
A client SHOULD NOT unilaterally close the connection, and instead | so. A client SHOULD NOT unilaterally close the connection; instead, | |||
SHOULD issue a LOGOUT command. If the server detects that the client | it SHOULD issue a LOGOUT command. If the server detects that the | |||
has unilaterally closed the connection, the server MAY omit the | client has unilaterally closed the connection, the server MAY omit | |||
untagged BYE response and simply close its connection. | the untagged BYE response and simply close its connection. | |||
+----------------------+ | +----------------------+ | |||
|connection established| | |connection established| | |||
+----------------------+ | +----------------------+ | |||
|| | || | |||
\/ | \/ | |||
+--------------------------------------+ | +--------------------------------------+ | |||
| server greeting | | | server greeting | | |||
+--------------------------------------+ | +--------------------------------------+ | |||
|| (1) || (2) || (3) | || (1) || (2) || (3) | |||
skipping to change at page 17, line 39 ¶ | skipping to change at line 765 ¶ | |||
\/ \/ \/ \/ | \/ \/ \/ \/ | |||
+--------------------------------------+ | +--------------------------------------+ | |||
| Logout | | | Logout | | |||
+--------------------------------------+ | +--------------------------------------+ | |||
|| | || | |||
\/ | \/ | |||
+-------------------------------+ | +-------------------------------+ | |||
|both sides close the connection| | |both sides close the connection| | |||
+-------------------------------+ | +-------------------------------+ | |||
(1) connection without pre-authentication (OK greeting) | Legend for the above diagram: | |||
(2) pre-authenticated connection (PREAUTH greeting) | ||||
(3) rejected connection (BYE greeting) | (1) connection without pre-authentication (OK greeting) | |||
(4) successful LOGIN or AUTHENTICATE command | (2) pre-authenticated connection (PREAUTH greeting) | |||
(5) successful SELECT or EXAMINE command | (3) rejected connection (BYE greeting) | |||
(6) CLOSE or UNSELECT command, unsolicited CLOSED | (4) successful LOGIN or AUTHENTICATE command | |||
response code or failed SELECT or EXAMINE command | (5) successful SELECT or EXAMINE command | |||
(7) LOGOUT command, server shutdown, or connection closed | (6) CLOSE or UNSELECT command, unsolicited CLOSED response code, or | |||
failed SELECT or EXAMINE command | ||||
(7) LOGOUT command, server shutdown, or connection closed | ||||
4. Data Formats | 4. Data Formats | |||
IMAP4rev2 uses textual commands and responses. Data in IMAP4rev2 can | IMAP4rev2 uses textual commands and responses. Data in IMAP4rev2 can | |||
be in one of several forms: atom, number, string, parenthesized list, | be in one of several forms: atom, number, string, parenthesized list, | |||
or NIL. Note that a particular data item may take more than one | or NIL. Note that a particular data item may take more than one | |||
form; for example, a data item defined as using "astring" syntax may | form; for example, a data item defined as using "astring" syntax may | |||
be either an atom or a string. | be either an atom or a string. | |||
4.1. Atom | 4.1. Atom | |||
An atom consists of one or more non-special characters. | An atom consists of one or more non-special characters. | |||
4.1.1. Sequence set and UID set | 4.1.1. Sequence Set and UID Set | |||
A set of messages can be referenced by a sequence set containing | A set of messages can be referenced by a sequence set containing | |||
either message sequence numbers or unique identifiers. See Section 9 | either message sequence numbers or unique identifiers. See Section 9 | |||
for details. Sequence sets can contain ranges (e.g. "5:50"), an | for details. A sequence set can contain ranges of sequence numbers | |||
enumeration of specific message sequence numbers/unique identifiers, | (such as "5:50"), an enumeration of specific sequence numbers, or a | |||
a special symbol "*", or a combination of the above. Note that a | combination of the above. A sequence set can use the special symbol | |||
sequence set never mixes message sequence numbers and unique | "*" to represent the maximum sequence number in the mailbox. A | |||
identifiers in the same representation. | sequence set never contains unique identifiers. | |||
A "UID set" is similar to the sequence set of unique identifiers; | A "UID set" is similar to the sequence set, but uses unique | |||
however, the "*" value for a sequence number is not permitted. | identifiers instead of message sequence numbers, and is not permitted | |||
to contain the special symbol "*". | ||||
4.2. Number | 4.2. Number | |||
A number consists of one or more digit characters, and represents a | A number consists of one or more digit characters and represents a | |||
numeric value. | numeric value. | |||
4.3. String | 4.3. String | |||
A string is in one of three forms: synchronizing literal, non- | A string is in one of three forms: synchronizing literal, non- | |||
synchronizing literal or quoted string. The synchronizing literal | synchronizing literal, or quoted string. The synchronizing literal | |||
form is the general form of string. The non-synchronizing literal | form is the general form of a string, without limitation on the | |||
form is also the general form, but has length limitation. The quoted | characters the string may include. The non-synchronizing literal | |||
string form is an alternative that avoids the overhead of processing | form is also the general form, but it has a length restriction. The | |||
a literal at the cost of limitations of characters which may be used. | quoted string form is an alternative that avoids the overhead of | |||
processing a literal, but has limitations on the characters that may | ||||
be used. | ||||
When the distinction between synchronizing and non-synchronizing | When the distinction between synchronizing and non-synchronizing | |||
literals is not important, this document only uses the term | literals is not important, this document only uses the term | |||
"literal". | "literal". | |||
A synchronizing literal is a sequence of zero or more octets | A synchronizing literal is a sequence of zero or more octets | |||
(including CR and LF), prefix-quoted with an octet count in the form | (including CR and LF), prefix-quoted with an octet count in the form | |||
of an open brace ("{"), the number of octets, close brace ("}"), and | of an open brace ("{"), the number of octets, a close brace ("}"), | |||
CRLF. In the case of synchronizing literals transmitted from server | and a CRLF. In the case of synchronizing literals transmitted from | |||
to client, the CRLF is immediately followed by the octet data. In | server to client, the CRLF is immediately followed by the octet data. | |||
the case of synchronizing literals transmitted from client to server, | In the case of synchronizing literals transmitted from client to | |||
the client MUST wait to receive a command continuation request | server, the client MUST wait to receive a command continuation | |||
(described later in this document) before sending the octet data (and | request (described later in this document) before sending the octet | |||
the remainder of the command). | data (and the remainder of the command). | |||
The non-synchronizing literal is an alternative form of synchronizing | The non-synchronizing literal is an alternative form of synchronizing | |||
literal, and it may appear in communication from client to server | literal and may be used from client to server anywhere a | |||
instead of the synchonizing form of literal. The non-synchronizing | synchronizing literal is permitted. The non-synchronizing literal | |||
literal form MUST NOT be sent from server to client. The non- | form MUST NOT be sent from server to client. The non-synchronizing | |||
synchronizing literal is distinguished from the synchronizing literal | literal is distinguished from the synchronizing literal by having a | |||
by having a plus ("+") between the octet count and the closing brace | plus ("+") between the octet count and the closing brace ("}"). The | |||
("}"). The server does not generate a command continuation request | server does not generate a command continuation request in response | |||
in response to a non-synchronizing literal, and clients are not | to a non-synchronizing literal, and clients are not required to wait | |||
required to wait before sending the octets of a non- synchronizing | before sending the octets of a non-synchronizing literal. Unless | |||
literal. Unless specified otherwise in an IMAP extension, non- | otherwise specified in an IMAP extension, non-synchronizing literals | |||
synchronizing literals MUST NOT be larger than 4096 octets. Any | MUST NOT be larger than 4096 octets. Any literal larger than 4096 | |||
literal larger than 4096 bytes MUST be sent as a synchronizing | bytes MUST be sent as a synchronizing literal. (Non-synchronizing | |||
literal. (Non-synchronizing literals defined in this document are | literals defined in this document are the same as non-synchronizing | |||
the same as non-synchronizing literals defined by the LITERAL- | literals defined by the LITERAL- extension from [RFC7888]. See that | |||
extension from [RFC7888]. See that document for details on how to | document for details on how to handle invalid non-synchronizing | |||
handle invalid non-synchronizing literals longer than 4096 octets and | literals longer than 4096 octets and for interaction with other IMAP | |||
for interaction with other IMAP extensions.) | extensions.) | |||
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 (<">) | excluding CR and LF, encoded in UTF-8, with double quote (<">) | |||
characters at each end. | characters at each end. | |||
The empty string is represented as "" (a quoted string with zero | The empty string is represented as "" (a quoted string with zero | |||
characters between double quotes), as {0} followed by CRLF (a | characters between double quotes), as {0} followed by a CRLF (a | |||
synchronizing literal with an octet count of 0) or as {0+} followed | synchronizing literal with an octet count of 0), or as {0+} followed | |||
by CRLF (a non-synchronizing literal with an octet count of 0). | by a CRLF (a non-synchronizing literal with an octet count of 0). | |||
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 | synchronizing literal MUST wait to receive a command continuation | |||
request. | request. | |||
4.3.1. 8-bit and Binary Strings | 4.3.1. 8-Bit and Binary Strings | |||
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 | |||
[MIME-IMB] content transfer encoding. IMAP4rev2 implementations MAY | [MIME-IMB] content transfer encoding. IMAP4rev2 implementations MAY | |||
transmit 8-bit or multi-octet characters in literals, but SHOULD do | transmit 8-bit or multi-octet characters in literals but SHOULD do so | |||
so only when the [CHARSET] is identified. | only when the [CHARSET] is identified. | |||
IMAP4rev2 is compatible with [I18N-HDRS]. As a result, the | IMAP4rev2 is compatible with [I18N-HDRS]. As a result, the | |||
identified charset for header-field values with 8-bit content is | identified charset for header-field values with 8-bit content is | |||
UTF-8 [UTF-8]. IMAP4rev2 implementations MUST accept and MAY | UTF-8 [UTF-8]. IMAP4rev2 implementations MUST accept and MAY | |||
transmit [UTF-8] text in quoted-strings as long as the string does | transmit [UTF-8] text in quoted-strings as long as the string does | |||
not contain NUL, CR, or LF. This differs from IMAP4rev1 | not contain NUL, CR, or LF. This differs from IMAP4rev1 | |||
implementations. | implementations. | |||
Although a BINARY content transfer encoding is defined, unencoded | Although a BINARY content transfer encoding is defined, unencoded | |||
binary strings are not permitted, unless returned in a <literal8> in | binary strings are not permitted, unless returned in a <literal8> in | |||
response to BINARY.PEEK[<section-binary>]<<partial>> or | response to a BINARY.PEEK[<section-binary>]<<partial>> or | |||
BINARY[<section-binary>]<<partial>> FETCH data item. A "binary | BINARY[<section-binary>]<<partial>> FETCH data item. A "binary | |||
string" is any string with NUL characters. A string with an | string" is any string with NUL characters. A string with an | |||
excessive amount of CTL characters MAY also be considered to be | excessive amount of CTL characters MAY also be considered to be | |||
binary. Unless returned in response to BINARY.PEEK[...]/BINARY[...] | binary. Unless returned in response to BINARY.PEEK[...]/BINARY[...] | |||
FETCH, client and server implementations MUST encode binary data into | FETCH, client and server implementations MUST encode binary data into | |||
a textual form, such as BASE64, before transmitting the data. | a textual form, such as base64, before transmitting the data. | |||
4.4. Parenthesized List | 4.4. Parenthesized List | |||
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. | |||
The empty list is represented as () -- a parenthesized list with no | The empty list is represented as () -- a parenthesized list with no | |||
members. | members. | |||
4.5. NIL | 4.5. NIL | |||
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 (). | |||
Note: NIL is never used for any data item which takes the form of | | Note: NIL is never used for any data item that takes the form | |||
an atom. For example, a mailbox name of "NIL" is a mailbox named | | of an atom. For example, a mailbox name of "NIL" is a mailbox | |||
NIL as opposed to a non-existent mailbox name. This is because | | named NIL as opposed to a non-existent mailbox name. This is | |||
mailbox uses "astring" syntax which is an atom or a string. | | because mailbox uses "astring" syntax, which is an atom or a | |||
Conversely, an addr-name of NIL is a non-existent personal name, | | string. Conversely, an addr-name of NIL is a non-existent | |||
because addr-name uses "nstring" syntax which is NIL or a string, | | personal name, because addr-name uses "nstring" syntax, which | |||
but never an atom. | | is NIL or a string, but never an atom. | |||
Examples: | Examples: | |||
The following LIST response: | The following LIST response: | |||
* LIST () "/" NIL | * LIST () "/" NIL | |||
is equivalent to: | is equivalent to: | |||
* LIST () "/" "NIL" | * LIST () "/" "NIL" | |||
as LIST response ABNF is using "astring" for mailbox name. | as LIST response ABNF is using "astring" for mailbox name. | |||
However, the following response | However, the following response: | |||
* FETCH 1 (BODY[1] NIL) | * FETCH 1 (BODY[1] NIL) | |||
is not equivalent to: | is not equivalent to: | |||
* FETCH 1 (BODY[1] "NIL") | * FETCH 1 (BODY[1] "NIL") | |||
The former means absence of the body part, while the latter | The former indicates absence of the body part, while the latter means | |||
means that it contains literal sequence of characters "NIL". | that it contains a string with the three characters "NIL". | |||
5. Operational Considerations | 5. Operational Considerations | |||
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. | |||
5.1. Mailbox Naming | 5.1. Mailbox Naming | |||
In IMAP4rev2, Mailbox names are encoded in Net-Unicode [NET-UNICODE] | In IMAP4rev2, mailbox names are encoded in Net-Unicode [NET-UNICODE] | |||
(this differs from IMAP4rev1). Client implementations MAY attempt to | (this differs from IMAP4rev1). Client implementations MAY attempt to | |||
create Net-Unicode mailbox names, and MUST interpret any 8-bit | create Net-Unicode mailbox names and MUST interpret any 8-bit mailbox | |||
mailbox names returned by LIST as [NET-UNICODE]. Server | names returned by LIST as [NET-UNICODE]. Server implementations MUST | |||
implementations MUST prohibit the creation of 8-bit mailbox names | prohibit the creation of 8-bit mailbox names that do not comply with | |||
that do not comply with Net-Unicode. However, servers MAY accept a | Net-Unicode. However, servers MAY accept a denormalized UTF-8 | |||
de-normalized UTF-8 mailbox name and convert it to Unicode | mailbox name and convert it to Unicode Normalization Form C (NFC) (as | |||
normalization form "NFC" (as per Net-Unicode requirements) prior to | per Net-Unicode requirements) prior to mailbox creation. Servers | |||
mailbox creation. Servers that choose to accept such de-normalized | that choose to accept such denormalized UTF-8 mailbox names MUST | |||
UTF-8 mailbox names MUST accept them in all IMAP commands that have a | accept them in all IMAP commands that have a mailbox name parameter. | |||
mailbox name parameter. In particular SELECT <name> must open the | In particular, SELECT <name> must open the same mailbox that was | |||
same mailbox that was successfully created with CREATE <name>, even | successfully created with CREATE <name>, even if <name> is a | |||
if <name> is a de-normalized UTF-8 mailbox name. | denormalized UTF-8 mailbox name. | |||
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 | this special name might not exist on some servers for some users, for | |||
example if the user has no access to personal namespace.) The | example, 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. | |||
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 | are fully case sensitive in ASCII range; others preserve the case of | |||
newly-created name but otherwise are case-insensitive; and yet others | a newly created name but otherwise are case insensitive; and yet | |||
coerce names to a particular case. Client implementations must be | others coerce names to a particular case. Client implementations | |||
able to interact with any of these. | must be able to interact with any of these. | |||
There are certain client considerations when creating a new mailbox | There are certain client considerations when creating a new mailbox | |||
name: | name: | |||
1. Any character which is one of the atom-specials (see the Formal | 1. Any character that is one of the atom-specials (see "Formal | |||
Syntax in Section 9) will require that the mailbox name be | Syntax" in Section 9) will require that the mailbox name be | |||
represented as a quoted string or literal. | represented as a quoted string or literal. | |||
2. CTL and other non-graphic characters are difficult to represent | 2. 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 MAY refuse to | |||
create mailbox names containing Unicode CTL characters. | create mailbox names containing Unicode CTL characters. | |||
3. Although the list-wildcard characters ("%" and "*") are valid in | 3. Although the list-wildcard characters ("%" and "*") are valid in | |||
a mailbox name, it is difficult to use such mailbox names with | a mailbox name, it is difficult to use such mailbox names with | |||
the LIST command due to the conflict with wildcard | the LIST command due to the conflict with wildcard | |||
interpretation. | interpretation. | |||
4. Usually, a character (determined by the server implementation) is | 4. Usually, a character (determined by the server implementation) is | |||
reserved to delimit levels of hierarchy. | reserved to delimit levels of hierarchy. | |||
5. Two characters, "#" and "&", have meanings by convention, and | 5. 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 | |||
Section 5.1.2.1 and Appendix A.1 respectively. | Section 5.1.2.1 and Appendix A.1, respectively. | |||
5.1.1. Mailbox Hierarchy Naming | 5.1.1. Mailbox Hierarchy Naming | |||
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 | MUST be left-to-right hierarchical, using a single ASCII character 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. | |||
5.1.2. Namespaces | 5.1.2. Namespaces | |||
Personal Namespace: A namespace that the server considers within the | Personal Namespace: | |||
personal scope of the authenticated user on a particular connection. | A namespace that the server considers within the personal scope of | |||
Typically, only the authenticated user has access to mailboxes in | the authenticated user on a particular connection. Typically, | |||
their Personal Namespace. It is the part of the namespace that | only the authenticated user has access to mailboxes in their | |||
belongs to the user that is allocated for mailboxes. If an INBOX | Personal Namespace. It is the part of the namespace that belongs | |||
exists for a user, it MUST appear within the user's personal | to the user and is allocated for mailboxes. If an INBOX exists | |||
namespace. In the typical case, there SHOULD be only one Personal | for a user, it MUST appear within the user's Personal Namespace. | |||
Namespace per user on a server. | In the typical case, there SHOULD be only one Personal Namespace | |||
per user on a server. | ||||
Other Users' Namespace: A namespace that consists of mailboxes from | Other Users' Namespace: | |||
the Personal Namespaces of other users. To access mailboxes in the | A namespace that consists of mailboxes from the Personal | |||
Other Users' Namespace, the currently authenticated user MUST be | Namespaces of other users. To access mailboxes in the Other | |||
explicitly granted access rights. For example, it is common for a | Users' Namespace, the currently authenticated user MUST be | |||
manager to grant to their administrative support staff access rights | explicitly granted access rights. For example, it is common for a | |||
to their mailbox. In the typical case, there SHOULD be only one | manager to grant to their administrative support staff access | |||
Other Users' Namespace per user on a server. | rights to their mailbox. In the typical case, there SHOULD be | |||
only one Other Users' Namespace per user on a server. | ||||
Shared Namespace: A namespace that consists of mailboxes that are | Shared Namespace: | |||
intended to be shared amongst users and do not exist within a user's | A namespace that consists of mailboxes that are intended to be | |||
Personal Namespace. | shared amongst users and do not exist within a user's Personal | |||
Namespace. | ||||
The namespaces a server uses MAY differ on a per-user basis. | The namespaces a server uses MAY differ on a per-user basis. | |||
5.1.2.1. Historic Mailbox Namespace Naming Convention | 5.1.2.1. Historic Mailbox Namespace Naming Convention | |||
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. | |||
For example, implementations which offer access to USENET | For example, implementations that offer access to USENET | |||
newsgroups MAY use the "#news" namespace to partition the USENET | newsgroups MAY use the "#news" namespace to partition the USENET | |||
newsgroup namespace from that of other mailboxes. Thus, the | newsgroup namespace from that of other mailboxes. Thus, the | |||
comp.mail.misc newsgroup would have a mailbox name of | comp.mail.misc newsgroup would have a mailbox name of | |||
"#news.comp.mail.misc", and the name "comp.mail.misc" can refer to | "#news.comp.mail.misc", and the name "comp.mail.misc" can refer to | |||
a different object (e.g., a user's private mailbox). | a different object (e.g., a user's private mailbox). | |||
Namespaces that include the "#" character are not IMAP URL [IMAP-URL] | Namespaces that include the "#" character are not IMAP URL [IMAP-URL] | |||
friendly requiring the "#" character to be represented as %23 when | friendly and require the "#" character to be represented as %23 when | |||
within URLs. As such, server implementors MAY instead consider using | within URLs. As such, server implementors MAY instead consider using | |||
namespace prefixes that do not contain the "#" character. | namespace prefixes that do not contain the "#" character. | |||
5.1.2.2. Common namespace models | 5.1.2.2. Common Namespace Models | |||
The previous version of this protocol did not define a default server | The previous version of this protocol did not define a default server | |||
namespace. Two common namespace models have evolved: | namespace. Two common namespace models have evolved: | |||
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. | |||
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. | |||
5.2. Mailbox Size and Message Status Updates | 5.2. Mailbox Size and Message Status Updates | |||
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 | Sometimes, such behavior is required by this specification and/or | |||
extensions. For example, agents other than the server MAY add | extensions. For example, agents other than the server may add | |||
messages to the mailbox (e.g., new message delivery), change the | messages to the mailbox (e.g., new message delivery); change the | |||
flags of the messages in the mailbox (e.g., simultaneous access to | flags of the messages in the mailbox (e.g., simultaneous access to | |||
the same mailbox by multiple agents), or even remove messages from | the same mailbox by multiple agents); or even remove messages from | |||
the mailbox. A server MUST send mailbox size updates automatically | the mailbox. A server MUST send mailbox size updates automatically | |||
if a mailbox size change is observed during the processing of a | if a mailbox size change is observed during the processing of a | |||
command. A server SHOULD send message flag updates automatically, | command. A server SHOULD send message flag updates automatically, | |||
without requiring the client to request such updates explicitly. | without requiring the client to request such updates explicitly. | |||
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 (Section 7.5.1) for more detail. | description of the EXPUNGE response (Section 7.5.1) for more detail. | |||
In particular, it is NOT permitted to send an EXISTS response that | In particular, it is NOT permitted to send an EXISTS response that | |||
would reduce the number of messages in the mailbox; only the EXPUNGE | would reduce the number of messages in the mailbox; only the EXPUNGE | |||
response can do this. | response can do this. | |||
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 | remembering data from the server, a client implementation MUST | |||
remember mailbox size updates. It MUST NOT assume that any command | remember mailbox size updates. It MUST NOT assume that any command | |||
after the initial mailbox selection will return the size of the | after the initial mailbox selection will return the size of the | |||
mailbox. | mailbox. | |||
5.3. Response when no Command in Progress | 5.3. Response When No Command in Progress | |||
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 MUST deal with flow control | |||
considerations. Specifically, they MUST either (1) verify that the | considerations. Specifically, they MUST either (1) verify that 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. | |||
5.4. Autologout Timer | 5.4. Autologout Timer | |||
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 timer MUST be at | sessions after authentication, the duration of that timer MUST be at | |||
least 30 minutes. The receipt of any command from the client during | least 30 minutes. The receipt of any command from the client during | |||
that interval resets the autologout timer. | that interval resets the autologout timer. | |||
Note that this specification doesn't have any restrictions on | Note that this specification doesn't have any restrictions on an | |||
autologout timer used before successful client authentication. In | autologout timer used before successful client authentication. In | |||
particular, servers are allowed to use shortened pre-authentication | particular, servers are allowed to use a shortened pre-authentication | |||
timer to protect themselves from Denial of Service attacks. | timer to protect themselves from Denial-of-Service attacks. | |||
5.5. Multiple Commands in Progress (Command Pipelining) | 5.5. Multiple Commands in Progress (Command Pipelining) | |||
The client MAY send another command without waiting for the | 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 MAY begin processing another command | |||
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 MUST be negotiated before any subsequent | |||
command is initiated. | command is initiated. | |||
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. If the server | that would affect the results of other commands. If the server | |||
detects a possible ambiguity, it MUST execute commands to completion | detects a possible ambiguity, it MUST execute commands to completion | |||
in the order given by the client. | in the order given by the client. | |||
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 | |||
and a STORE of that same message's flags. | cause \Seen flags to be set and a SEARCH UNSEEN command. | |||
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 | MUST wait for the completion result response before sending a command | |||
with message sequence numbers. | with message sequence numbers. | |||
Note: EXPUNGE responses are permitted while UID FETCH, UID STORE, | Note: EXPUNGE responses are permitted while UID FETCH, UID STORE, | |||
and UID SEARCH are in progress. If the client sends a UID | and UID SEARCH are in progress. If the client sends a UID | |||
command, it MUST wait for a completion result response before | command, it MUST wait for a completion result response before | |||
sending a command which uses message sequence numbers (this may | sending a command that uses message sequence numbers (this may | |||
include UID SEARCH). Any message sequence numbers in an argument | include UID SEARCH). Any message sequence numbers in an argument | |||
to UID SEARCH are associated with messages prior to the effect of | to UID SEARCH are associated with messages prior to the effect of | |||
any untagged EXPUNGE returned by the UID SEARCH. | any untagged EXPUNGE responses returned by the UID SEARCH. | |||
For example, the following non-waiting command sequences are invalid: | For example, the following non-waiting command sequences are invalid: | |||
FETCH + NOOP + STORE | FETCH + NOOP + STORE | |||
STORE + COPY + FETCH | STORE + COPY + FETCH | |||
COPY + COPY | COPY + COPY | |||
The following are examples of valid non-waiting command sequences: | The following are examples of valid non-waiting command sequences: | |||
FETCH + STORE + SEARCH + NOOP | FETCH + STORE + SEARCH + NOOP | |||
STORE + COPY + EXPUNGE | STORE + COPY + EXPUNGE | |||
UID SEARCH + UID SEARCH may be valid or invalid as a non-waiting | 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 | |||
SEARCH contains message sequence numbers. | contains message sequence numbers. | |||
Use of SEARCH result variable (see Section 6.4.4.1) creates direct | Use of a SEARCH result variable (see Section 6.4.4.1) creates direct | |||
dependency between two commands. See Section 6.4.4.2 for more | dependency between two commands. See Section 6.4.4.2 for more | |||
considerations about pipelining such dependent commands. | considerations about pipelining such dependent commands. | |||
6. Client Commands | 6. Client Commands | |||
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). | |||
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" | |||
(Section 9). | (Section 9). | |||
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 (Section 7) | See the response descriptions in "Responses" (Section 7) for | |||
for information on these responses, and the Formal Syntax (Section 9) | information on these responses and in "Formal Syntax" (Section 9) for | |||
for the precise syntax of these responses. It is possible for server | the precise syntax of these responses. It is possible for server | |||
data to be transmitted as a result of any command. Thus, commands | data to be transmitted as a result of any command. Thus, commands | |||
that do not specifically require server data specify "no specific | that do not specifically require server data specify "no specific | |||
responses for this command" instead of "none". | responses for this command" instead of "none". | |||
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. | |||
The state of a connection is only changed by successful commands | The state of a connection is only changed by successful commands that | |||
which are documented as changing state. A rejected command (BAD | are documented as changing state. A rejected command (BAD response) | |||
response) never changes the state of the connection or of the | never changes the state of the connection or of the selected mailbox. | |||
selected mailbox. A failed command (NO response) generally does not | A failed command (NO response) generally does not change the state of | |||
change the state of the connection or of the selected mailbox; the | the connection or of the selected mailbox, with the exception of the | |||
exception being the SELECT and EXAMINE commands. | SELECT and EXAMINE commands. | |||
6.1. Client Commands - Any State | 6.1. Client Commands - Any State | |||
The following commands are valid in any state: CAPABILITY, NOOP, and | The following commands are valid in any state: CAPABILITY, NOOP, and | |||
LOGOUT. | LOGOUT. | |||
6.1.1. CAPABILITY Command | 6.1.1. CAPABILITY Command | |||
Arguments: none | Arguments: none | |||
Responses: REQUIRED untagged response: CAPABILITY | Responses: REQUIRED untagged response: CAPABILITY | |||
Result: OK - capability completed | Result: OK - capability completed | |||
BAD - arguments invalid | BAD - arguments invalid | |||
The CAPABILITY command requests a listing of capabilities (e.g. | The CAPABILITY command requests a listing of capabilities (e.g., | |||
extensions and/or modifications of server behaviour) that the server | extensions and/or modifications of server behavior) that the server | |||
supports. The server MUST send a single untagged CAPABILITY response | supports. The server MUST send a single untagged CAPABILITY response | |||
with "IMAP4rev2" as one of the listed capabilities before the | with "IMAP4rev2" as one of the listed capabilities before the | |||
(tagged) OK response. | (tagged) OK response. | |||
A capability name which begins with "AUTH=" indicates that the server | A capability name that begins with "AUTH=" indicates that the server | |||
supports that particular authentication mechanism as defined in | supports that particular authentication mechanism as defined in the | |||
[SASL]. All such names are, by definition, part of this | Simple Authentication and Security Layer (SASL) [SASL]. All such | |||
specification. | names are, by definition, part of this specification. | |||
Other capability names refer to extensions, revisions, or amendments | Other capability names refer to extensions, revisions, or amendments | |||
to this specification. See the documentation of the CAPABILITY | to this specification. See the documentation of the CAPABILITY | |||
response in Section 7.2.2 for additional information. If IMAP4rev1 | response in Section 7.2.2 for additional information. If IMAP4rev1 | |||
capability is not advertised, no capabilities, beyond the base | capability is not advertised, no capabilities, beyond the base | |||
IMAP4rev2 set defined in this specification, are enabled without | IMAP4rev2 set defined in this specification, are enabled without | |||
explicit client action to invoke the capability. If both IMAP4rev1 | explicit client action to invoke the capability. If both IMAP4rev1 | |||
and IMAP4rev2 capabilities are advertised, no capabilities, beyond | and IMAP4rev2 capabilities are advertised, no capabilities, beyond | |||
the base IMAP4rev1 set specified in RFC 3501, are enabled without | the base IMAP4rev1 set specified in [RFC3501], are enabled without | |||
explicit client action to invoke the capability. | explicit client action to invoke the capability. | |||
Client and server implementations MUST implement the STARTTLS | Client and server implementations MUST implement the STARTTLS | |||
Section 6.2.1 and LOGINDISABLED capabilities on cleartext ports. | (Section 6.2.1) and LOGINDISABLED capabilities on cleartext ports. | |||
Client and server implementations MUST also implement AUTH=PLAIN | Client and server implementations MUST also implement AUTH=PLAIN | |||
(described in [PLAIN]) capability on both cleartext and Implicit TLS | (described in [PLAIN]) capability on both cleartext and Implicit TLS | |||
ports. See the Security Considerations (Section 11) for important | ports. See the Security Considerations (Section 11) for important | |||
information. | information. | |||
Unless specified otherwise, all registered extensions to IMAP4rev1 | Unless otherwise specified, all registered extensions to IMAP4rev1 | |||
are also valid extensions to IMAP4rev2. | are also valid extensions to IMAP4rev2. | |||
Example: C: abcd CAPABILITY | Example: | |||
S: * CAPABILITY IMAP4rev2 STARTTLS AUTH=GSSAPI | ||||
LOGINDISABLED | C: abcd CAPABILITY | |||
S: abcd OK CAPABILITY completed | S: * CAPABILITY IMAP4rev2 STARTTLS AUTH=GSSAPI | |||
C: efgh STARTTLS | LOGINDISABLED | |||
S: efgh OK STARTLS completed | S: abcd OK CAPABILITY completed | |||
<TLS negotiation, further commands are under [TLS] layer> | C: efgh STARTTLS | |||
C: ijkl CAPABILITY | S: efgh OK STARTTLS completed | |||
S: * CAPABILITY IMAP4rev2 AUTH=GSSAPI AUTH=PLAIN | <TLS negotiation, further commands are under TLS layer> | |||
S: ijkl OK CAPABILITY completed | C: ijkl CAPABILITY | |||
S: * CAPABILITY IMAP4rev2 AUTH=GSSAPI AUTH=PLAIN | ||||
S: ijkl OK CAPABILITY completed | ||||
6.1.2. NOOP Command | 6.1.2. NOOP Command | |||
Arguments: none | Arguments: none | |||
Responses: no specific responses for this command (but see below) | Responses: no specific responses for this command (but see below) | |||
Result: OK - noop completed | Result: OK - noop completed | |||
BAD - command unknown or arguments invalid | BAD - command unknown or arguments invalid | |||
The NOOP command always succeeds. It does nothing. | The NOOP command always succeeds. It does nothing. | |||
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 Section 6.3.13 should be used instead of NOOP if real-time | command; see Section 6.3.13) should be used instead of NOOP if real- | |||
updates to mailbox state are desirable). The NOOP command can also | time updates to mailbox state are desirable). The NOOP command can | |||
be used to reset any inactivity autologout timer on the server. | also be used to reset any inactivity autologout timer on the server. | |||
Example: C: a002 NOOP | Example: | |||
S: a002 OK NOOP completed | ||||
. . . | C: a002 NOOP | |||
C: a047 NOOP | S: a002 OK NOOP completed | |||
S: * 22 EXPUNGE | . . . | |||
S: * 23 EXISTS | C: a047 NOOP | |||
S: * 14 FETCH (UID 1305 FLAGS (\Seen \Deleted)) | S: * 22 EXPUNGE | |||
S: a047 OK NOOP completed | S: * 23 EXISTS | |||
S: * 14 FETCH (UID 1305 FLAGS (\Seen \Deleted)) | ||||
S: a047 OK NOOP completed | ||||
6.1.3. LOGOUT Command | 6.1.3. LOGOUT Command | |||
Arguments: none | Arguments: none | |||
Responses: REQUIRED untagged response: BYE | Responses: REQUIRED untagged response: BYE | |||
Result: OK - logout completed | Result: OK - logout completed | |||
BAD - command unknown or arguments invalid | BAD - command unknown or arguments invalid | |||
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 before | the connection. The server MUST send a BYE untagged response before | |||
the (tagged) OK response, and then close the network connection. | the (tagged) OK response, and then close the network connection. | |||
Example: C: A023 LOGOUT | Example: | |||
S: * BYE IMAP4rev2 Server logging out | ||||
S: A023 OK LOGOUT completed | C: A023 LOGOUT | |||
(Server and client then close the connection) | S: * BYE IMAP4rev2 Server logging out | |||
S: A023 OK LOGOUT completed | ||||
(Server and client then close the connection) | ||||
6.2. Client Commands - Not Authenticated State | 6.2. Client Commands - Not Authenticated State | |||
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. | |||
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 | privacy protection and integrity checking but does not by itself | |||
establish authentication or enter the authenticated state. | establish authentication or enter the authenticated state. | |||
Server implementations MAY allow access to certain mailboxes without | Server implementations MAY allow access to certain mailboxes without | |||
establishing authentication. This can be done by means of the | establishing authentication. This can be done by means of the | |||
ANONYMOUS [SASL] authenticator described in [ANONYMOUS]. An older | ANONYMOUS [SASL] authenticator described in [ANONYMOUS]. 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. | |||
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. | |||
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 | |||
(Section 11) for important information about these commands. | (Section 11) for important information about these commands. | |||
6.2.1. STARTTLS Command | 6.2.1. STARTTLS Command | |||
Arguments: none | Arguments: none | |||
Responses: no specific response for this command | Responses: no specific response for this command | |||
Result: OK - starttls completed, begin TLS negotiation | Result: OK - starttls completed, begin TLS negotiation | |||
NO - TLS negotiation can't be initiated, due to server | NO - TLS negotiation can't be initiated, due to server | |||
configuration error | configuration error | |||
BAD - STARTTLS received after a successful TLS | BAD - STARTTLS received after a successful TLS | |||
negotiation or arguments invalid | negotiation or arguments invalid | |||
Note that STARTTLS command is available only on cleartext ports. The | Note that the STARTTLS command is available only on cleartext ports. | |||
server MUST always respond with tagged BAD response when STARTTLS | The server MUST always respond with a tagged BAD response when the | |||
command is received on Implicit TLS port. | STARTTLS command is received on an Implicit TLS port. | |||
A TLS [TLS-1.3] negotiation begins immediately after the CRLF at the | A TLS [TLS-1.3] negotiation begins immediately after the CRLF at the | |||
end of the tagged OK response from the server. Once a client issues | 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 | a STARTTLS command, it MUST NOT issue further commands until a server | |||
response is seen and the TLS negotiation is complete. Some past | response is seen and the TLS negotiation is complete. Some past | |||
server implementation incorrectly implemented STARTTLS processing and | server implementations incorrectly implemented STARTTLS processing | |||
are known to contain STARTTLS plaintext command injection | and are known to contain STARTTLS plaintext command injection | |||
vulnerability [CERT-555316]. In order to avoid this vulnerability, | vulnerability [CERT-555316]. In order to avoid this vulnerability, | |||
server implementations MUST do one of the following If any data is | server implementations MUST do one of the following if any data is | |||
received in the same TCP buffer after the CRLF that starts the | received in the same TCP buffer after the CRLF that starts the | |||
STARTTLS command: | STARTTLS command: | |||
1. Extra data from the TCP buffer is interpreted as beginning of the | 1. Extra data from the TCP buffer is interpreted as the beginning of | |||
TLS handshake. (If the data is in cleartext, this will result in | the TLS handshake. (If the data is in cleartext, this will | |||
the TLS handshake failing.) | result in the TLS handshake failing.) | |||
2. Extra data from the TCP buffer is thrown away. | 2. Extra data from the TCP buffer is thrown away. | |||
Note that the first option is friendlier to clients that pipeline | Note that the first option is friendlier to clients that pipeline the | |||
beginning of STARTTLS command with TLS handshake data. | beginning of the STARTTLS command with TLS handshake data. | |||
After successful TLS negotiation the server remains in the non- | After successful TLS negotiation, the server remains in the non- | |||
authenticated state, even if client credentials are supplied during | authenticated state, even if client credentials are supplied during | |||
the TLS negotiation. This does not preclude an authentication | the TLS negotiation. This does not preclude an authentication | |||
mechanism such as EXTERNAL (defined in [SASL]) from using client | mechanism such as EXTERNAL (defined in [SASL]) from using client | |||
identity determined by the TLS negotiation. | identity determined by the TLS negotiation. | |||
Once TLS has been started, the client MUST discard cached information | Once TLS has been started, the client MUST discard cached information | |||
about server capabilities and SHOULD re-issue the CAPABILITY command. | about server capabilities and SHOULD reissue the CAPABILITY command. | |||
This is necessary to protect against man-in- the-middle attacks which | This is necessary to protect against active attacks that alter the | |||
alter the capabilities list prior to STARTTLS. The server MAY | capabilities list prior to STARTTLS. The server MAY advertise | |||
advertise different capabilities, and in particular SHOULD NOT | different capabilities and, in particular, SHOULD NOT advertise the | |||
advertise the STARTTLS capability, after a successful STARTTLS | STARTTLS capability, after a successful STARTTLS command. | |||
command. | ||||
Example: C: a001 CAPABILITY | Example: | |||
S: * CAPABILITY IMAP4rev2 STARTTLS LOGINDISABLED | ||||
S: a001 OK CAPABILITY completed | C: a001 CAPABILITY | |||
C: a002 STARTTLS | S: * CAPABILITY IMAP4rev2 STARTTLS LOGINDISABLED | |||
S: a002 OK Begin TLS negotiation now | S: a001 OK CAPABILITY completed | |||
<TLS negotiation, further commands are under TLS layer> | C: a002 STARTTLS | |||
C: a003 CAPABILITY | S: a002 OK Begin TLS negotiation now | |||
S: * CAPABILITY IMAP4rev2 AUTH=PLAIN | <TLS negotiation, further commands are under TLS layer> | |||
S: a003 OK CAPABILITY completed | C: a003 CAPABILITY | |||
C: a004 AUTHENTICATE PLAIN dGVzdAB0ZXN0AHRlc3Q= | S: * CAPABILITY IMAP4rev2 AUTH=PLAIN | |||
S: a004 OK Success (tls protection) | S: a003 OK CAPABILITY completed | |||
C: a004 AUTHENTICATE PLAIN dGVzdAB0ZXN0AHRlc3Q= | ||||
S: a004 OK Success (tls protection) | ||||
6.2.2. AUTHENTICATE Command | 6.2.2. AUTHENTICATE Command | |||
Arguments: SASL authentication mechanism name | Arguments: SASL authentication mechanism name | |||
OPTIONAL initial response | ||||
Responses: continuation data can be requested | OPTIONAL initial response | |||
Result: OK - authenticate completed, now in authenticated state | Responses: continuation data can be requested | |||
NO - authenticate failure: unsupported authentication | ||||
mechanism, credentials rejected | Result: OK - authenticate completed, now in authenticated | |||
BAD - command unknown or arguments invalid, | state | |||
authentication exchange cancelled | NO - authenticate failure: unsupported authentication | |||
mechanism, credentials rejected | ||||
BAD - command unknown or arguments invalid, | ||||
authentication exchange canceled | ||||
The AUTHENTICATE command indicates a [SASL] authentication mechanism | The AUTHENTICATE command indicates a [SASL] authentication mechanism | |||
to the server. If the server supports the requested authentication | to the server. If the server supports the requested authentication | |||
mechanism, it performs an authentication protocol exchange to | mechanism, it performs an authentication protocol exchange to | |||
authenticate and identify the client. It MAY also negotiate an | authenticate and identify the client. It MAY also negotiate an | |||
OPTIONAL security layer for subsequent protocol interactions. If the | OPTIONAL security layer for subsequent protocol interactions. If the | |||
requested authentication mechanism is not supported, the server | requested authentication mechanism is not supported, the server | |||
SHOULD reject the AUTHENTICATE command by sending a tagged NO | SHOULD reject the AUTHENTICATE command by sending a tagged NO | |||
response. | response. | |||
The AUTHENTICATE command supports the optional "initial response" | The AUTHENTICATE command supports the optional "initial response" | |||
feature defined in Section 5.1 of [SASL]. The client doesn't need to | feature defined in Section 4 of [SASL]. The client doesn't need to | |||
use it. If a SASL mechanism supports "initial response", but it is | use it. If a SASL mechanism supports "initial response", but it is | |||
not specified by the client, the server handles this as specified in | not specified by the client, the server handles it as specified in | |||
Section 3 of [SASL]. | Section 3 of [SASL]. | |||
The service name specified by this protocol's profile of [SASL] is | The service name specified by this protocol's profile of [SASL] is | |||
"imap". | "imap". | |||
The authentication protocol exchange consists of a series of server | The authentication protocol exchange consists of a series of server | |||
challenges and client responses that are specific to the | challenges and client responses that are specific to the | |||
authentication mechanism. A server challenge consists of a command | authentication mechanism. A server challenge consists of a command | |||
continuation request response with the "+" token followed by a BASE64 | continuation request response with the "+" token followed by a | |||
encoded (see Section 4 of [RFC4648]) string. The client response | base64-encoded (see Section 4 of [RFC4648]) string. The client | |||
consists of a single line consisting of a BASE64 encoded string. If | response consists of a single line consisting of a base64-encoded | |||
the client wishes to cancel an authentication exchange, it issues a | string. If the client wishes to cancel an authentication exchange, | |||
line consisting of a single "*". If the server receives such a | it issues a line consisting of a single "*". If the server receives | |||
response, or if it receives an invalid BASE64 string (e.g. | such a response, or if it receives an invalid base64 string (e.g., | |||
characters outside the BASE64 alphabet, or non-terminal "="), it MUST | characters outside the base64 alphabet or non-terminal "="), it MUST | |||
reject the AUTHENTICATE command by sending a tagged BAD response. | reject the AUTHENTICATE command by sending a tagged BAD response. | |||
As with any other client response, the initial response MUST be | As with any other client response, the initial response MUST be | |||
encoded as BASE64. It also MUST be transmitted outside of a quoted | encoded as base64. It also MUST be transmitted outside of a quoted | |||
string or literal. To send a zero-length initial response, the | string or literal. To send a zero-length initial response, the | |||
client MUST send a single pad character ("="). This indicates that | client MUST send a single pad character ("="). This indicates that | |||
the response is present, but is a zero-length string. | the response is present, but it is a zero-length string. | |||
When decoding the BASE64 data in the initial response, decoding | When decoding the base64 data in the initial response, decoding | |||
errors MUST be treated as in any normal SASL client response, i.e. | errors MUST be treated as in any normal SASL client response, i.e., | |||
with a tagged BAD response. In particular, the server should check | with a tagged BAD response. In particular, the server should check | |||
for any characters not explicitly allowed by the BASE64 alphabet, as | for any characters not explicitly allowed by the base64 alphabet, as | |||
well as any sequence of BASE64 characters that contains the pad | well as any sequence of base64 characters that contains the pad | |||
character ('=') anywhere other than the end of the string (e.g., | character ('=') anywhere other than the end of the string (e.g., | |||
"=AAA" and "AAA=BBB" are not allowed). | "=AAA" and "AAA=BBB" are not allowed). | |||
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 MUST reject the | |||
command with a tagged BAD response. | command with a tagged BAD response. | |||
If a security layer is negotiated through the [SASL] authentication | If a security layer is negotiated through the [SASL] authentication | |||
exchange, it takes effect immediately following the CRLF that | exchange, it takes effect immediately following the CRLF that | |||
concludes the authentication exchange for the client, and the CRLF of | concludes the authentication exchange for the client and the CRLF of | |||
the tagged OK response for the server. | the tagged OK response for the server. | |||
While client and server implementations MUST 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 in | authentication mechanisms other than the PLAIN mechanism described in | |||
[PLAIN]. Also, an authentication mechanism is not required to | [PLAIN]. Also, an authentication mechanism is not required to | |||
support any security layers. | support any security layers. | |||
Note: a server implementation MUST implement a configuration in | Note: a server implementation MUST implement a configuration in | |||
which it does NOT permit any plaintext password mechanisms, unless | which it does NOT permit any plaintext password mechanisms, unless | |||
either the STARTTLS command has been negotiated, TLS has been | the STARTTLS command has been negotiated, TLS has been negotiated | |||
negotiated on an Implicit TLS port, or some other mechanism that | on an Implicit TLS port, or some other mechanism that protects the | |||
protects the session from password snooping has been provided. | session from password snooping has been provided. Server sites | |||
Server sites SHOULD NOT use any configuration which permits a | SHOULD NOT use any configuration that permits a plaintext password | |||
plaintext password mechanism without such a protection mechanism | mechanism without such a protection mechanism against password | |||
against password snooping. Client and server implementations | snooping. Client and server implementations SHOULD implement | |||
SHOULD implement additional [SASL] mechanisms that do not use | additional [SASL] mechanisms that do not use plaintext passwords, | |||
plaintext passwords, such the GSSAPI mechanism described in | such as the GSSAPI mechanism described in [RFC4752], the SCRAM- | |||
[RFC4752], the SCRAM-SHA-256/SCRAM-SHA-256-PLUS [SCRAM-SHA-256] | SHA-256/SCRAM-SHA-256-PLUS [SCRAM-SHA-256] mechanisms, and/or the | |||
mechanisms and/or EXTERNAL [SASL] mechanism for mutual TLS | EXTERNAL [SASL] mechanism for mutual TLS authentication. (Note | |||
authentication. (Note that SASL framework allows creation of SASL | that the SASL framework allows for the creation of SASL mechanisms | |||
mechanisms that support 2FA (2-factor authentication), however | that support 2-factor authentication (2FA); however, none are | |||
none are fully ready to be recommended by this document.) | fully ready to be recommended by this document.) | |||
Servers and clients can support multiple authentication mechanisms. | Servers and clients can support multiple authentication mechanisms. | |||
The server SHOULD list its supported authentication mechanisms in the | The server SHOULD list its supported authentication mechanisms in the | |||
response to the CAPABILITY command so that the client knows which | response to the CAPABILITY command so that the client knows which | |||
authentication mechanisms to use. | authentication mechanisms to use. | |||
A server MAY include a CAPABILITY response code in the tagged OK | A server MAY include a CAPABILITY response code in the tagged 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 send a | capabilities automatically. It is unnecessary for a client to send a | |||
separate CAPABILITY command if it recognizes these automatic | separate CAPABILITY command if it recognizes these automatic | |||
skipping to change at page 34, line 5 ¶ | skipping to change at line 1516 ¶ | |||
try another authentication mechanism by issuing another AUTHENTICATE | try another authentication mechanism by issuing another AUTHENTICATE | |||
command. It MAY also attempt to authenticate by using the LOGIN | command. It MAY also attempt to authenticate by using the LOGIN | |||
command (see Section 6.2.3 for more detail). In other words, the | command (see Section 6.2.3 for more detail). In other words, the | |||
client MAY request authentication types in decreasing order of | client MAY request authentication types in decreasing order of | |||
preference, with the LOGIN command as a last resort. | preference, with the LOGIN command as a last resort. | |||
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. | |||
Example: S: * OK [CAPABILITY IMAP4rev2 STARTTLS AUTH=GSSAPI] | Example: | |||
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 | ||||
The following example demonstrates use of initial response | 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 | ||||
The following example demonstrates the use of an initial response. | ||||
Example: | Example: | |||
S: * OK [CAPABILITY IMAP4rev2 STARTTLS AUTH=GSSAPI | ||||
LOGINDISABLED] Server ready | S: * OK [CAPABILITY IMAP4rev2 STARTTLS AUTH=GSSAPI | |||
C: A01 STARTTLS | LOGINDISABLED] Server ready | |||
S: A01 OK STARTLS completed | C: A01 STARTTLS | |||
<TLS negotiation, further commands are under [TLS] layer> | S: A01 OK STARTTLS completed | |||
C: A02 CAPABILITY | <TLS negotiation, further commands are under TLS layer> | |||
S: * CAPABILITY IMAP4rev2 AUTH=GSSAPI AUTH=PLAIN | C: A02 CAPABILITY | |||
S: A02 OK CAPABILITY completed | S: * CAPABILITY IMAP4rev2 AUTH=GSSAPI AUTH=PLAIN | |||
C: A03 AUTHENTICATE PLAIN dGVzdAB0ZXN0AHRlc3Q= | S: A02 OK CAPABILITY completed | |||
S: A03 OK Success (tls protection) | C: A03 AUTHENTICATE PLAIN dGVzdAB0ZXN0AHRlc3Q= | |||
S: A03 OK Success (tls protection) | ||||
Note that because the initial response is optional, the following | ||||
negotiation (which does not use the initial response) is still valid | ||||
and MUST be supported by the server: | ||||
... client connects to server and negotiates a TLS | ||||
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) | ||||
Note that in the above example there is a space following the "+" | ||||
from the server. | ||||
The following is an example authentication using the SASL EXTERNAL | ||||
mechanism (defined in [SASL]) under a TLS protection layer and an | ||||
empty initial response: | ||||
... client connects to server and negotiates a TLS | ||||
protection layer ... | ||||
C: C01 CAPABILITY | ||||
S: * CAPABILITY IMAP4rev2 AUTH=PLAIN AUTH=EXTERNAL | ||||
S: C01 OK Completed | ||||
C: A01 AUTHENTICATE EXTERNAL = | ||||
S: A01 OK Success (tls protection) | ||||
Note: The line breaks within server challenges and client responses | Note: The line breaks within server challenges and client responses | |||
are for editorial clarity and are not in real authenticators. | are for editorial clarity and are not in real authenticators. | |||
6.2.3. LOGIN Command | 6.2.3. LOGIN Command | |||
Arguments: user name | Arguments: user name | |||
password | ||||
Responses: no specific responses for this command | password | |||
Result: OK - login completed, now in authenticated state | Responses: no specific responses for this command | |||
NO - login failure: user name or password rejected | ||||
BAD - command unknown or arguments invalid | Result: OK - login completed, now in authenticated state | |||
NO - login failure: user name or password rejected | ||||
BAD - command unknown or arguments invalid | ||||
The LOGIN command identifies the client to the server and carries the | The LOGIN command identifies the client to the server and carries the | |||
plaintext password authenticating this user. The LOGIN command | plaintext password authenticating this user. The LOGIN command | |||
SHOULD NOT be used except as a last resort (after attempting and | SHOULD NOT be used except as a last resort (after attempting and | |||
failing to authenticate using the AUTHENTICATE command one or more | failing to authenticate using the AUTHENTICATE command one or more | |||
times), and it is recommended that client implementations have a | times), and it is recommended that client implementations have a | |||
means to disable any automatic use of the LOGIN command. | means to disable any automatic use of the LOGIN command. | |||
A server MAY include a CAPABILITY response code in the tagged OK | A server MAY include a CAPABILITY response code in the tagged OK | |||
response to a successful LOGIN command in order to send capabilities | response to a successful LOGIN command in order to send capabilities | |||
automatically. It is unnecessary for a client to send a separate | automatically. It is unnecessary for a client to send a separate | |||
CAPABILITY command if it recognizes these automatic capabilities. | CAPABILITY command if it recognizes these automatic capabilities. | |||
Example: C: a001 LOGIN SMITH SESAME | Example: | |||
S: a001 OK LOGIN completed | ||||
C: a001 LOGIN SMITH SESAME | ||||
S: a001 OK LOGIN completed | ||||
Note: Use of the LOGIN command over an insecure network (such as the | Note: Use of the LOGIN command over an insecure network (such as the | |||
Internet) is a security risk, because anyone monitoring network | Internet) is a security risk, because anyone monitoring network | |||
traffic can obtain plaintext passwords. For that reason clients MUST | traffic can obtain plaintext passwords. For that reason, clients | |||
NOT use LOGIN on unsecure networks. | MUST NOT use LOGIN on unsecure networks. | |||
Unless either the client is accessing IMAP service on Implicit TLS | Unless the client is accessing IMAP service on an Implicit TLS port | |||
port [RFC8314], the STARTTLS command has been negotiated or some | [RFC8314], the STARTTLS command has been negotiated, or some other | |||
other mechanism that protects the session from password snooping has | mechanism that protects the session from password snooping has been | |||
been provided, a server implementation MUST implement a configuration | provided, a server implementation MUST implement a configuration in | |||
in which it advertises the LOGINDISABLED capability and does NOT | which it advertises the LOGINDISABLED capability and does NOT permit | |||
permit the LOGIN command. Server sites SHOULD NOT use any | the LOGIN command. Server sites SHOULD NOT use any configuration | |||
configuration which permits the LOGIN command without such a | that permits the LOGIN command without such a protection mechanism | |||
protection mechanism against password snooping. A client | against password snooping. A client implementation MUST NOT send a | |||
implementation MUST NOT send a LOGIN command if the LOGINDISABLED | LOGIN command if the LOGINDISABLED capability is advertised. | |||
capability is advertised. | ||||
6.3. Client Commands - Authenticated State | 6.3. Client Commands - Authenticated State | |||
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 | |||
EXAMINE commands will select a mailbox for access and enter the | will select a mailbox for access and enter the selected state. | |||
selected state. | ||||
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, | the following commands are valid in the authenticated state: ENABLE, | |||
SELECT, EXAMINE, NAMESPACE, CREATE, DELETE, RENAME, SUBSCRIBE, | SELECT, EXAMINE, NAMESPACE, CREATE, DELETE, RENAME, SUBSCRIBE, | |||
UNSUBSCRIBE, LIST, STATUS, APPEND and IDLE. | UNSUBSCRIBE, LIST, STATUS, APPEND, and IDLE. | |||
6.3.1. ENABLE Command | 6.3.1. ENABLE Command | |||
Arguments: capability names | Arguments: capability names | |||
Responses: no specific responses for this command | Responses: no specific responses for this command | |||
Result: OK - Relevant capabilities enabled | Result: OK - Relevant capabilities enabled | |||
BAD - No arguments, or syntax error in an argument | BAD - No arguments, or syntax error in an argument | |||
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 (with the | However, servers cannot send those unsolicited responses (with the | |||
exception of response codes (see Section 7.1) included in tagged or | exception of response codes (see Section 7.1) included in tagged or | |||
untagged OK/NO/BAD responses, which can always be sent) until they | untagged OK/NO/BAD responses, which can always be sent) until they | |||
know that the clients support such extensions and thus won't choke on | know that the clients support such extensions and thus will be able | |||
the extension response data. | to correctly parse and process the extension response data. | |||
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 the | that it supports particular extensions. It is designed such that the | |||
client can send a simple constant string with the extensions it | 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. | |||
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: | |||
o If the argument is not an extension known to the server, the | * If the argument is not an extension known to the server, the | |||
server MUST ignore the argument. | server MUST ignore the argument. | |||
o 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 MUST | |||
ignore the argument. (Note that knowing about an extension | ignore the argument. (Note that knowing about an extension | |||
doesn't necessarily imply supporting that extension.) | doesn't necessarily imply supporting that extension.) | |||
o If the argument is an extension that is supported by the server | * If the argument is an extension that is supported by the server | |||
and that needs to be enabled, the server MUST enable the extension | and that needs to be enabled, the server MUST enable the extension | |||
for the duration of the connection. Note that once an extension | for the duration of the connection. Note that once an extension | |||
is enabled, there is no way to disable it. | is enabled, there is no way to disable it. | |||
If the ENABLE command is successful, the server MUST send an untagged | If the ENABLE command is successful, the server MUST send an untagged | |||
ENABLED response Section 7.2.1, which includes all enabled extensions | ENABLED response (Section 7.2.1), which includes all enabled | |||
as specified above. The ENABLED response is sent even if no | extensions as specified above. The ENABLED response is sent even if | |||
extensions were enabled. | no extensions were enabled. | |||
Clients SHOULD only include extensions that need to be enabled by the | Clients SHOULD only include extensions that need to be enabled by the | |||
server. For example, a client can enable IMAP4rev2 specific | server. For example, a client can enable IMAP4rev2-specific behavior | |||
behaviour when both IMAP4rev1 and IMAP4rev2 are advertised in the | when both IMAP4rev1 and IMAP4rev2 are advertised in the CAPABILITY | |||
CAPABILITY response. Future RFCs may add to this list. | response. Future RFCs may add to this list. | |||
The ENABLE command is only valid in the authenticated state, before | The ENABLE command is only valid in the authenticated state, before | |||
any mailbox is selected. Clients MUST NOT issue ENABLE once they | any mailbox is selected. Clients MUST NOT issue ENABLE once they | |||
SELECT/EXAMINE a mailbox; however, server implementations don't have | SELECT/EXAMINE a mailbox; however, server implementations don't have | |||
to check that no mailbox is selected or was previously selected | to check that no mailbox is selected or was previously selected | |||
during the duration of a connection. | during the duration of a connection. | |||
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 | |||
single command "ENABLE a b c". When multiple ENABLE commands are | as a single command "ENABLE a b c". When multiple ENABLE commands | |||
issued, each corresponding ENABLED response SHOULD only contain | are issued, each corresponding ENABLED response SHOULD only contain | |||
extensions enabled by the corresponding ENABLE command, i.e. for the | extensions enabled by the corresponding ENABLE command, i.e., for the | |||
above example, the ENABLED response to "ENABLE c" should not contain | above example, the ENABLED response to "ENABLE c" should not contain | |||
"a" or "b". | "a" or "b". | |||
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. | |||
The server MUST NOT change the CAPABILITY list as a result of | The server MUST NOT change the CAPABILITY list as a result of | |||
executing ENABLE; i.e., a CAPABILITY command issued right after an | executing ENABLE; that is, a CAPABILITY command issued right after an | |||
ENABLE command MUST 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. | |||
C: t1 CAPABILITY | C: t1 CAPABILITY | |||
S: * CAPABILITY IMAP4rev2 ID LITERAL+ X-GOOD-IDEA | S: * CAPABILITY IMAP4rev2 ID LITERAL+ X-GOOD-IDEA | |||
S: t1 OK foo | S: t1 OK foo | |||
C: t2 ENABLE CONDSTORE X-GOOD-IDEA | C: t2 ENABLE CONDSTORE X-GOOD-IDEA | |||
S: * ENABLED X-GOOD-IDEA | S: * ENABLED X-GOOD-IDEA | |||
S: t2 OK foo | S: t2 OK foo | |||
C: t3 CAPABILITY | C: t3 CAPABILITY | |||
S: * CAPABILITY IMAP4rev2 ID LITERAL+ X-GOOD-IDEA | S: * CAPABILITY IMAP4rev2 ID LITERAL+ X-GOOD-IDEA | |||
S: t3 OK foo again | S: t3 OK foo again | |||
In the following example, the client enables CONDSTORE extension | In the following example, the client enables the Conditional Store | |||
[RFC7162]: | (CONDSTORE) extension [RFC7162]: | |||
C: a1 ENABLE CONDSTORE | C: a1 ENABLE CONDSTORE | |||
S: * ENABLED CONDSTORE | S: * ENABLED CONDSTORE | |||
S: a1 OK Conditional Store enabled | S: a1 OK Conditional Store enabled | |||
6.3.1.1. Note to Designers of Extensions That May Use the ENABLE | 6.3.1.1. Note to Designers of Extensions That May Use the ENABLE | |||
Command | Command | |||
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. | |||
6.3.2. SELECT Command | 6.3.2. SELECT Command | |||
Arguments: mailbox name | Arguments: mailbox name | |||
Responses: REQUIRED untagged responses: FLAGS, EXISTS, LIST | Responses: REQUIRED untagged responses: FLAGS, EXISTS, LIST | |||
REQUIRED OK untagged responses: PERMANENTFLAGS, | REQUIRED OK untagged responses: PERMANENTFLAGS, | |||
UIDNEXT, UIDVALIDITY | UIDNEXT, UIDVALIDITY | |||
Result: OK - select completed, now in selected state | Result: OK - select completed, now in selected state | |||
NO - select failure, now in authenticated state: no | NO - select failure, now in authenticated state: no | |||
such mailbox, can't access mailbox | such mailbox, can't access mailbox | |||
BAD - command unknown or arguments invalid | BAD - command unknown or arguments invalid | |||
The SELECT command selects a mailbox so that messages in the mailbox | The SELECT command selects a mailbox so that messages in the mailbox | |||
can be accessed. Before returning an OK to the client, the server | can be accessed. Before returning an OK to the client, the server | |||
MUST send the following untagged data to the client. (The order of | MUST send the following untagged data to the client. (The order of | |||
individual responses is not important.) Note that earlier versions | individual responses is not important.) Note that earlier versions | |||
of this protocol (e.g. IMAP4rev1 version specified in RFC 2060) only | of this protocol, such as the IMAP4rev1 version specified in | |||
required the FLAGS and EXISTS untagged responses and UIDVALIDITY | [RFC2060], only required the FLAGS and EXISTS untagged responses and | |||
response code; consequently, client implementations SHOULD implement | UIDVALIDITY response code. Client implementations that need to | |||
default behavior for missing data as discussed with the individual | remain compatible with such older IMAP versions have to implement | |||
item. | default behavior for missing data, as discussed with the individual | |||
items. | ||||
FLAGS Defined flags in the mailbox. See the description of the | FLAGS | |||
FLAGS response in Section 7.3.5 for more detail. | Defined flags in the mailbox. See the description of the FLAGS | |||
response in Section 7.3.5 for more detail. | ||||
<n> EXISTS The number of messages in the mailbox. See the | <n> EXISTS | |||
description of the EXISTS response in Section 7.4.1 for more | The number of messages in the mailbox. See the description of the | |||
detail. | EXISTS response in Section 7.4.1 for more detail. | |||
LIST The server MUST return a LIST response with the mailbox name. | LIST | |||
The list of mailbox attributes MUST be accurate. If the server | The server MUST return a LIST response with the mailbox name. The | |||
allows de-normalized UTF-8 mailbox names (see Section 5.1) and the | list of mailbox attributes MUST be accurate. If the server allows | |||
denormalized UTF-8 mailbox names (see Section 5.1) and the | ||||
supplied mailbox name differs from the normalized version, the | supplied mailbox name differs from the normalized version, the | |||
server MUST return LIST with the OLDNAME extended data item. See | server MUST return LIST with the OLDNAME extended data item. See | |||
Section 6.3.9.7 for more details. | Section 6.3.9.7 for more details. | |||
OK [PERMANENTFLAGS (<list of flags>)] A list of message flags that | OK [PERMANENTFLAGS (<list of flags>)] | |||
the client can change permanently. If this is missing, the client | A list of message flags that the client can change permanently. | |||
should assume that all flags can be changed permanently. | If this is missing, the client should assume that all flags can be | |||
changed permanently. | ||||
OK [UIDNEXT <n>] The next unique identifier value. Refer to | OK [UIDNEXT <n>] | |||
Section 2.3.1.1 for more information. | The next unique identifier value. Refer to Section 2.3.1.1 for | |||
more information. | ||||
OK [UIDVALIDITY <n>] The unique identifier validity value. Refer to | OK [UIDVALIDITY <n>] | |||
Section 2.3.1.1 for more information. | The unique identifier validity value. Refer to Section 2.3.1.1 | |||
for more information. | ||||
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. When deselecting a | fails is attempted, no mailbox is selected. When deselecting a | |||
selected mailbox, the server MUST return an untagged OK response with | selected mailbox, the server MUST return an untagged OK response with | |||
the "[CLOSED]" response code when the currently selected mailbox is | the "[CLOSED]" response code when the currently selected mailbox is | |||
closed (see Paragraph 10). | closed (see Section 7.1). | |||
If the client is permitted to modify the mailbox, the server SHOULD | If the client is permitted to modify the mailbox, the server SHOULD | |||
prefix the text of the tagged OK response with the "[READ-WRITE]" | prefix the text of the tagged OK response with the "[READ-WRITE]" | |||
response code. | response code. | |||
If the client is not permitted to modify the mailbox but is permitted | If the client is not permitted to modify the mailbox but is permitted | |||
read access, the mailbox is selected as read-only, and the server | read access, the mailbox is selected as read-only, and the server | |||
MUST prefix the text of the tagged OK response to SELECT with the | MUST prefix the text of the tagged OK response to SELECT with the | |||
"[READ-ONLY]" response code. Read-only access through SELECT differs | "[READ-ONLY]" response code. Read-only access through SELECT differs | |||
from the EXAMINE command in that certain read-only mailboxes MAY | from the EXAMINE command in that certain read-only mailboxes MAY | |||
permit the change of permanent state on a per-user (as opposed to | permit the change of permanent state on a per-user (as opposed to | |||
global) basis. Netnews messages marked in a server-based .newsrc | global) basis. Netnews messages marked in a server-based .newsrc | |||
file are an example of such per-user permanent state that can be | file are an example of such per-user permanent state that can be | |||
modified with read-only mailboxes. | modified with read-only mailboxes. | |||
Example: C: A142 SELECT INBOX | Example: | |||
S: * 172 EXISTS | ||||
S: * OK [UIDVALIDITY 3857529045] UIDs valid | ||||
S: * OK [UIDNEXT 4392] Predicted next UID | ||||
S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) | ||||
S: * OK [PERMANENTFLAGS (\Deleted \Seen \*)] Limited | ||||
S: * LIST () "/" INBOX | ||||
S: A142 OK [READ-WRITE] SELECT completed | ||||
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: * LIST () "/" INBOX | |||
[...some time later...] | S: A142 OK [READ-WRITE] SELECT completed | |||
C: A143 SELECT Drafts | ||||
S: * OK [CLOSED] Previous mailbox is now closed | ||||
S: * 5 EXISTS | ||||
S: * OK [UIDVALIDITY 9877410381] UIDs valid | ||||
S: * OK [UIDNEXT 102] Predicted next UID | ||||
S: * LIST () "/" Drafts | ||||
S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) | ||||
S: * OK [PERMANENTFLAGS (\Deleted \Seen \Answered | ||||
\Flagged \Draft \*)] System flags and keywords allowed | ||||
S: A143 OK [READ-WRITE] SELECT completed | ||||
Note that IMAP4rev1 compliant servers can also send the untagged | Example: | |||
RECENT response which was deprecated in IMAP4rev2. E.g. "* 0 | ||||
RECENT". Pure IMAP4rev2 clients are advised to ignore the untagged | C: A142 SELECT INBOX | |||
RECENT response. | S: * 172 EXISTS | |||
S: * OK [UIDVALIDITY 3857529045] UIDs valid | ||||
S: * OK [UIDNEXT 4392] Predicted next UID | ||||
S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) | ||||
S: * OK [PERMANENTFLAGS (\Deleted \Seen \*)] Limited | ||||
S: A142 OK [READ-WRITE] SELECT completed | ||||
[...some time later...] | ||||
C: A143 SELECT Drafts | ||||
S: * OK [CLOSED] Previous mailbox is now closed | ||||
S: * 5 EXISTS | ||||
S: * OK [UIDVALIDITY 9877410381] UIDs valid | ||||
S: * OK [UIDNEXT 102] Predicted next UID | ||||
S: * LIST () "/" Drafts | ||||
S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) | ||||
S: * OK [PERMANENTFLAGS (\Deleted \Seen \Answered | ||||
\Flagged \Draft \*)] System flags and keywords allowed | ||||
S: A143 OK [READ-WRITE] SELECT completed | ||||
Note that IMAP4rev1-compliant servers can also send the untagged | ||||
RECENT response that was deprecated in IMAP4rev2, e.g., "* 0 RECENT". | ||||
Pure IMAP4rev2 clients are advised to ignore the untagged RECENT | ||||
response. | ||||
6.3.3. EXAMINE Command | 6.3.3. EXAMINE Command | |||
Arguments: mailbox name | Arguments: mailbox name | |||
Responses: REQUIRED untagged responses: FLAGS, EXISTS, LIST | Responses: REQUIRED untagged responses: FLAGS, EXISTS, LIST | |||
REQUIRED OK untagged responses: PERMANENTFLAGS, | REQUIRED OK untagged responses: PERMANENTFLAGS, | |||
UIDNEXT, UIDVALIDITY | UIDNEXT, UIDVALIDITY | |||
Result: OK - examine completed, now in selected state | Result: OK - examine completed, now in selected state | |||
NO - examine failure, now in authenticated state: no | NO - examine failure, now in authenticated state: no | |||
such mailbox, can't access mailbox BAD - command unknown | such mailbox, can't access mailbox | |||
or arguments invalid | BAD - command unknown or arguments invalid | |||
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. No | output; however, the selected mailbox is identified as read-only. No | |||
changes to the permanent state of the mailbox, including per-user | changes to the permanent state of the mailbox, including per-user | |||
state, are permitted. | state, are permitted. | |||
The text of the tagged OK response to the EXAMINE command MUST begin | The text of the tagged OK response to the EXAMINE command MUST begin | |||
with the "[READ-ONLY]" response code. | with the "[READ-ONLY]" response code. | |||
Example: C: A932 EXAMINE blurdybloop | Example: | |||
S: * 17 EXISTS | ||||
S: * OK [UIDVALIDITY 3857529045] UIDs valid | C: A932 EXAMINE blurdybloop | |||
S: * OK [UIDNEXT 4392] Predicted next UID | S: * 17 EXISTS | |||
S: * LIST () "/" blurdybloop | S: * OK [UIDVALIDITY 3857529045] UIDs valid | |||
S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) | S: * OK [UIDNEXT 4392] Predicted next UID | |||
S: * OK [PERMANENTFLAGS ()] No permanent flags permitted | S: * LIST () "/" blurdybloop | |||
S: A932 OK [READ-ONLY] EXAMINE completed | S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) | |||
S: * OK [PERMANENTFLAGS ()] No permanent flags permitted | ||||
S: A932 OK [READ-ONLY] EXAMINE completed | ||||
6.3.4. CREATE Command | 6.3.4. CREATE Command | |||
Arguments: mailbox name | Arguments: mailbox name | |||
Responses: OPTIONAL untagged response: LIST | Responses: OPTIONAL untagged response: LIST | |||
Result: OK - create completed | Result: OK - create completed | |||
NO - create failure: can't create mailbox with that name | NO - create failure: can't create mailbox with that | |||
BAD - command unknown or arguments invalid | name | |||
BAD - command unknown or arguments invalid | ||||
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 with | 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 creation will | a name that refers to an extant mailbox. Any error in creation will | |||
return a tagged NO response. If a client attempts to create a UTF-8 | return a tagged NO response. If a client attempts to create a UTF-8 | |||
mailbox name that is not a valid Net-Unicode name, the server MUST | mailbox name that is not a valid Net-Unicode name, the server MUST | |||
reject the creation or convert the name to Net-Unicode prior to | reject the creation or convert the name to Net-Unicode prior to | |||
creating the mailbox. If the server decides to convert (normalize) | creating the mailbox. If the server decides to convert (normalize) | |||
the name, it SHOULD return an untagged LIST with OLDNAME extended | the name, it SHOULD return an untagged LIST with an OLDNAME extended | |||
data item, with the OLDNAME value being the supplied mailbox name and | data item, with the OLDNAME value being the supplied mailbox name and | |||
the name parameter being the normalized mailbox name. (See | the name parameter being the normalized mailbox name. (See | |||
Section 6.3.9.7 for more details.) | Section 6.3.9.7 for more details.) | |||
Mailboxes created in one IMAP session MAY be announced to other IMAP | Mailboxes created in one IMAP session MAY be announced to other IMAP | |||
sessions using unsolicited LIST response. If the server | sessions using an unsolicited LIST response. If the server | |||
automatically subscribes a mailbox when it is created, then the | automatically subscribes a mailbox when it is created, then the | |||
unsolicited LIST response for each affected subscribed mailbox name | unsolicited LIST response for each affected subscribed mailbox name | |||
MUST include the \Subscribed attribute. | MUST include the \Subscribed attribute. | |||
If the mailbox name is suffixed with the server's hierarchy separator | If the mailbox name is suffixed with the server's hierarchy separator | |||
character (as returned from the server by a LIST command), this is a | character (as returned from the server by a LIST command), this is a | |||
declaration that the client intends to create mailbox names under | declaration that the client intends to create mailbox names under | |||
this name in the hierarchy. Server implementations that do not | this name in the hierarchy. Server implementations that do not | |||
require this declaration MUST ignore the declaration. In any case, | require this declaration MUST ignore the declaration. In any case, | |||
the name created is without the trailing hierarchy delimiter. | the name created is without the trailing hierarchy delimiter. | |||
skipping to change at page 42, line 4 ¶ | skipping to change at line 1936 ¶ | |||
If the mailbox name is suffixed with the server's hierarchy separator | If the mailbox name is suffixed with the server's hierarchy separator | |||
character (as returned from the server by a LIST command), this is a | character (as returned from the server by a LIST command), this is a | |||
declaration that the client intends to create mailbox names under | declaration that the client intends to create mailbox names under | |||
this name in the hierarchy. Server implementations that do not | this name in the hierarchy. Server implementations that do not | |||
require this declaration MUST ignore the declaration. In any case, | require this declaration MUST ignore the declaration. In any case, | |||
the name created is without the trailing hierarchy delimiter. | the name created is without the trailing hierarchy delimiter. | |||
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 SHOULD create any superior hierarchical names | |||
that are needed for the CREATE command to be successfully completed. | that are needed for the CREATE command to be successfully completed. | |||
In other words, an attempt to create "foo/bar/zap" on a server in | In other words, an attempt to create "foo/bar/zap" on a server in | |||
which "/" is the hierarchy separator character SHOULD create foo/ and | which "/" is the hierarchy separator character SHOULD create foo/ and | |||
foo/bar/ if they do not already exist. | foo/bar/ if they do not already exist. | |||
If a new mailbox is created with the same name as a mailbox which was | If a new mailbox is created with the same name as a mailbox that was | |||
deleted, its unique identifiers MUST be greater than any unique | deleted, its unique identifiers MUST be greater than any unique | |||
identifiers used in the previous incarnation of the mailbox unless | identifiers used in the previous incarnation of the mailbox unless | |||
the new incarnation has a different unique identifier validity value. | the new incarnation has a different unique identifier validity value. | |||
See the description of the UID command in Section 6.4.9 for more | See the description of the UID command in Section 6.4.9 for more | |||
detail. | detail. | |||
Example: C: A003 CREATE owatagusiam/ | Example: | |||
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 | C: A003 CREATE owatagusiam/ | |||
a non NFC normalized Unicode mailbox name and that | S: A003 OK CREATE completed | |||
"Normalized" is its NFC normalized version.) | C: A004 CREATE owatagusiam/blurdybloop | |||
S: A004 OK CREATE completed | ||||
C: A005 CREATE NonNormalized | ||||
S: * LIST () "/" "Normalized" ("OLDNAME" ("NonNormalized")) | ||||
S: A005 OK CREATE completed | ||||
Note: The interpretation of this example depends on whether "/" | (In the last example, imagine that "NonNormalized" is a non-NFC | |||
was returned as the hierarchy separator from LIST. If "/" is the | normalized Unicode mailbox name and that "Normalized" is its NFC | |||
hierarchy separator, a new level of hierarchy named "owatagusiam" | normalized version.) | |||
with a member called "blurdybloop" is created. Otherwise, two | ||||
mailboxes at the same hierarchy level are created. | | Note: The interpretation of this example depends on whether "/" | |||
| was returned as the hierarchy separator from LIST. If "/" is | ||||
| the hierarchy separator, a new level of hierarchy named | ||||
| "owatagusiam" with a member called "blurdybloop" is created. | ||||
| Otherwise, two mailboxes at the same hierarchy level are | ||||
| created. | ||||
6.3.5. DELETE Command | 6.3.5. DELETE Command | |||
Arguments: mailbox name | Arguments: mailbox name | |||
Responses: OPTIONAL untagged response: LIST | Responses: OPTIONAL untagged response: LIST | |||
Result: OK - delete completed | Result: OK - delete completed | |||
NO - delete failure: can't delete mailbox with that name | NO - delete failure: can't delete mailbox with that | |||
BAD - command unknown or arguments invalid | name | |||
BAD - command unknown or arguments invalid | ||||
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 been | 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 mailbox name | deleted. It is an error to attempt to delete INBOX or a mailbox name | |||
that does not exist. | that does not exist. | |||
The DELETE command MUST NOT remove inferior hierarchical names. For | The DELETE command MUST NOT remove inferior hierarchical names. For | |||
example, if a mailbox "foo" has an inferior "foo.bar" (assuming "." | example, if a mailbox "foo" has an inferior "foo.bar" (assuming "." | |||
is the hierarchy delimiter character), removing "foo" MUST NOT remove | is the hierarchy delimiter character), removing "foo" MUST NOT remove | |||
"foo.bar". It is an error to attempt to delete a name that has | "foo.bar". It is an error to attempt to delete a name that has | |||
inferior hierarchical names and also has the \Noselect mailbox name | inferior hierarchical names and also has the \Noselect mailbox name | |||
attribute (see the description of the LIST response (Section 7.3.1) | attribute (see the description of the LIST response (Section 7.3.1) | |||
for more details). | for more details). | |||
It is permitted to delete a name that has inferior hierarchical names | It is permitted to delete a name that has inferior hierarchical names | |||
and does not have the \Noselect mailbox name attribute. If the | and does not have the \Noselect mailbox name attribute. If the | |||
server implementation does not permit deleting the name while | server implementation does not permit deleting the name while | |||
inferior hierarchical names exists then it SHOULD disallow the DELETE | inferior hierarchical names exist, then it SHOULD disallow the DELETE | |||
command by returning a tagged NO response. The NO response SHOULD | command by returning a tagged NO response. The NO response SHOULD | |||
include the HASCHILDREN response code. Alternatively the server MAY | include the HASCHILDREN response code. Alternatively, the server MAY | |||
allow the DELETE command, but sets the \Noselect mailbox name | allow the DELETE command, but it sets the \Noselect mailbox name | |||
attribute for that name. | attribute for that name. | |||
If the server returns OK response, all messages in that mailbox are | If the server returns an OK response, all messages in that mailbox | |||
removed by the DELETE command. | are removed by the DELETE command. | |||
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 same | mailbox MUST be preserved so that a new mailbox created with the same | |||
name will not reuse the identifiers of the former incarnation, unless | name will not reuse the identifiers of the former incarnation, unless | |||
the new incarnation has a different unique identifier validity value. | the new incarnation has a different unique identifier validity value. | |||
See the description of the UID command in Section 6.4.9 for more | See the description of the UID command in Section 6.4.9 for more | |||
detail. | detail. | |||
If the server decides to convert (normalize) the mailbox name, it | If the server decides to convert (normalize) the mailbox name, it | |||
SHOULD return an untagged LIST with the "\NonExistent" attribute and | SHOULD return an untagged LIST with the "\NonExistent" attribute and | |||
OLDNAME extended data item, with the OLDNAME value being the supplied | OLDNAME extended data item, with the OLDNAME value being the supplied | |||
mailbox name and the name parameter being the normalized mailbox | mailbox name and the name parameter being the normalized mailbox | |||
name. (See Section 6.3.9.7 for more details.) | name. (See Section 6.3.9.7 for more details.) | |||
Mailboxes deleted in one IMAP session MAY be announced to other IMAP | Mailboxes deleted in one IMAP session MAY be announced to other IMAP | |||
sessions using unsolicited LIST response, containing the | sessions using an unsolicited LIST response, containing the | |||
"\NonExistent" attribute. | "\NonExistent" attribute. | |||
Example: C: A682 LIST "" * | Example: | |||
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 | ||||
Example: C: A82 LIST "" * | C: A682 LIST "" * | |||
S: * LIST () "." blurdybloop | S: * LIST () "/" blurdybloop | |||
S: * LIST () "." foo | S: * LIST (\Noselect) "/" foo | |||
S: * LIST () "." foo.bar | S: * LIST () "/" foo/bar | |||
S: A82 OK LIST completed | S: A682 OK LIST completed | |||
C: A83 DELETE blurdybloop | C: A683 DELETE blurdybloop | |||
S: A83 OK DELETE completed | S: A683 OK DELETE completed | |||
C: A84 DELETE foo | C: A684 DELETE foo | |||
S: A84 OK DELETE Completed | S: A684 NO Name "foo" has inferior hierarchical names | |||
C: A85 LIST "" * | C: A685 DELETE foo/bar | |||
S: * LIST () "." foo.bar | S: A685 OK DELETE Completed | |||
S: A85 OK LIST completed | C: A686 LIST "" * | |||
C: A86 LIST "" % | S: * LIST (\Noselect) "/" foo | |||
S: * LIST (\Noselect) "." foo | S: A686 OK LIST completed | |||
S: A86 OK LIST completed | C: A687 DELETE foo | |||
S: A687 OK DELETE Completed | ||||
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 | ||||
6.3.6. RENAME Command | 6.3.6. RENAME Command | |||
Arguments: existing mailbox name | Arguments: existing mailbox name | |||
new mailbox name | ||||
Responses: OPTIONAL untagged response: LIST | new mailbox name | |||
Result: OK - rename completed | Responses: OPTIONAL untagged response: LIST | |||
NO - rename failure: can't rename mailbox with that name, | ||||
can't rename to mailbox with that name | Result: OK - rename completed | |||
BAD - command unknown or arguments invalid | NO - rename failure: can't rename mailbox with that | |||
name, can't rename to mailbox with that name | ||||
BAD - command unknown or arguments invalid | ||||
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 an | 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 exist or | error to attempt to rename from a mailbox name that does not exist or | |||
to a mailbox name that already exists. Any error in renaming will | to a mailbox name that already exists. Any error in renaming will | |||
return a tagged NO response. | return a tagged NO response. | |||
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 MUST also be renamed. For example, a rename of | |||
"foo" to "zap" will rename "foo/bar" (assuming "/" is the hierarchy | "foo" to "zap" will rename "foo/bar" (assuming "/" is the hierarchy | |||
delimiter character) to "zap/bar". | delimiter character) to "zap/bar". | |||
If the server's hierarchy separator character appears in the new | If the server's hierarchy separator character appears in the new | |||
mailbox name, the server SHOULD create any superior hierarchical | mailbox name, the server SHOULD create any superior hierarchical | |||
names that are needed for the RENAME command to complete | names that are needed for the RENAME command to complete | |||
successfully. In other words, an attempt to rename "foo/bar/zap" to | successfully. In other words, an attempt to rename "foo/bar/zap" to | |||
baz/rag/zowie on a server in which "/" is the hierarchy separator | "baz/rag/zowie" on a server in which "/" is the hierarchy separator | |||
character in the corresponding namespace SHOULD create baz/ and baz/ | character in the corresponding namespace SHOULD create "baz/" and | |||
rag/ if they do not already exist. | "baz/rag/" if they do not already exist. | |||
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 MUST be preserved so that a new mailbox created with the same | |||
name will not reuse the identifiers of the former incarnation, unless | name will not reuse the identifiers of the former incarnation, unless | |||
the new incarnation has a different unique identifier validity value. | the new incarnation has a different unique identifier validity value. | |||
See the description of the UID command in Section 6.4.9 for more | See the description of the UID command in Section 6.4.9 for more | |||
detail. | detail. | |||
Renaming INBOX is permitted (i.e. it doesn't result in a tagged BAD | Renaming INBOX is permitted and does not result in a tagged BAD | |||
response), and has special behavior. (Note that some servers | response, and it has special behavior: 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 rename of INBOX. (Note that some servers | ||||
disallow renaming INBOX by returning a tagged NO response, so clients | disallow renaming INBOX by returning a tagged NO response, so clients | |||
need to be able to handle such RENAME failing). It moves all | need to be able to handle the failure of such RENAME commands.) | |||
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 rename of INBOX. | ||||
If the server allows creation of mailboxes with names that are not | If the server allows creation of mailboxes with names that are not | |||
valid Net-Unicode names, the server normalizes both the existing | valid Net-Unicode names, the server normalizes both the existing | |||
mailbox name parameter and the new mailbox name parameter. If the | mailbox name parameter and the new mailbox name parameter. If the | |||
normalized version of any of these 2 parameters differs from the | normalized version of any of these 2 parameters differs from the | |||
corresponding supplied version, the server SHOULD return an untagged | corresponding supplied version, the server SHOULD return an untagged | |||
LIST response with OLDNAME extended data item, with the OLDNAME value | LIST response with an OLDNAME extended data item, with the OLDNAME | |||
being the supplied existing mailbox name and the name parameter being | value being the supplied existing mailbox name and the name parameter | |||
the normalized new mailbox name (see Section 6.3.9.7). This would | being the normalized new mailbox name (see Section 6.3.9.7). This | |||
allow the client to correlate the supplied name with the normalized | would allow the client to correlate the supplied name with the | |||
name. | normalized name. | |||
Mailboxes renamed in one IMAP session MAY be announced to other IMAP | Mailboxes renamed in one IMAP session MAY be announced to other IMAP | |||
sessions using unsolicited LIST response with OLDNAME extended data | sessions using an unsolicited LIST response with an OLDNAME extended | |||
item. | data item. | |||
In both of the above cases: if the server automatically subscribes a | In both of the above cases, if the server automatically subscribes a | |||
mailbox when it is renamed, then the unsolicited LIST response for | mailbox when it is renamed, then the unsolicited LIST response for | |||
each affected subscribed mailbox name MUST include the \Subscribed | each affected subscribed mailbox name MUST include the \Subscribed | |||
attribute. No unsolicited LIST responses need to be sent for | attribute. No unsolicited LIST responses need to be sent for child | |||
children mailboxes, if any. When INBOX is successfully renamed, a | mailboxes. When INBOX is successfully renamed, it is assumed that a | |||
new INBOX is assumed to be created. No unsolicited LIST responses | new INBOX is created. No unsolicited LIST responses need to be sent | |||
need to be sent for INBOX in this case. | for INBOX in this case. | |||
Examples: C: A682 LIST "" * | Examples: | |||
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 "" * | C: A682 LIST "" * | |||
S: * LIST () "." INBOX | S: * LIST () "/" blurdybloop | |||
S: * LIST () "." INBOX.bar | S: * LIST (\Noselect) "/" foo | |||
S: Z432 OK LIST completed | S: * LIST () "/" foo/bar | |||
C: Z433 RENAME INBOX old-mail | S: A682 OK LIST completed | |||
S: Z433 OK RENAME completed | C: A683 RENAME blurdybloop sarasoop | |||
C: Z434 LIST "" * | S: A683 OK RENAME completed | |||
S: * LIST () "." INBOX | C: A684 RENAME foo zowie | |||
S: * LIST () "." INBOX.bar | S: A684 OK RENAME Completed | |||
S: * LIST () "." old-mail | C: A685 LIST "" * | |||
S: Z434 OK LIST completed | S: * LIST () "/" sarasoop | |||
S: * LIST (\Noselect) "/" zowie | ||||
S: * LIST () "/" zowie/bar | ||||
S: A685 OK LIST completed | ||||
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 | ||||
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, the | on the original name. To keep subscription information in sync, the | |||
following sequence of commands can be used: | following sequence of commands can be used: | |||
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 | |||
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. | |||
6.3.7. SUBSCRIBE Command | 6.3.7. SUBSCRIBE Command | |||
Arguments: mailbox | Arguments: mailbox | |||
Responses: no specific responses for this command | Responses: no specific responses for this command | |||
Result: OK - subscribe completed | Result: OK - subscribe completed | |||
NO - subscribe failure: can't subscribe to that name | NO - subscribe failure: can't subscribe to that name | |||
BAD - command unknown or arguments invalid | BAD - command unknown or arguments invalid | |||
The SUBSCRIBE command adds the specified mailbox name to the server's | The SUBSCRIBE command adds the specified mailbox name to the server's | |||
set of "active" or "subscribed" mailboxes as returned by the LIST | set of "active" or "subscribed" mailboxes as returned by the LIST | |||
(SUBSCRIBED) command. This command returns a tagged OK response if | (SUBSCRIBED) command. This command returns a tagged OK response if | |||
the subscription is successful or if the mailbox is already | the subscription is successful or if the mailbox is already | |||
subscribed. | subscribed. | |||
A server MAY validate the mailbox argument to SUBSCRIBE to verify | A server MAY validate the mailbox argument to SUBSCRIBE to verify | |||
that it exists. However, it SHOULD NOT unilaterally remove an | that it exists. However, it SHOULD NOT unilaterally remove an | |||
existing mailbox name from the subscription list even if a mailbox by | existing mailbox name from the subscription list even if a mailbox by | |||
that name no longer exists. | that name no longer exists. | |||
Note: This requirement is because a server site can choose to | | Note: This requirement is because a server site can choose to | |||
routinely remove a mailbox with a well-known name (e.g., "system- | | routinely remove a mailbox with a well-known name (e.g., | |||
alerts") after its contents expire, with the intention of | | "system-alerts") after its contents expire, with the intention | |||
recreating it when new contents are appropriate. | | of recreating it when new contents are appropriate. | |||
Example: C: A002 SUBSCRIBE #news.comp.mail.mime | Example: | |||
S: A002 OK SUBSCRIBE completed | ||||
C: A002 SUBSCRIBE #news.comp.mail.mime | ||||
S: A002 OK SUBSCRIBE completed | ||||
6.3.8. UNSUBSCRIBE Command | 6.3.8. UNSUBSCRIBE Command | |||
Arguments: mailbox name | Arguments: mailbox name | |||
Responses: no specific responses for this command | Responses: no specific responses for this command | |||
Result: OK - unsubscribe completed | Result: OK - unsubscribe completed | |||
NO - unsubscribe failure: can't unsubscribe that name | NO - unsubscribe failure: can't unsubscribe that name | |||
BAD - command unknown or arguments invalid | BAD - command unknown or arguments invalid | |||
The UNSUBSCRIBE command removes the specified mailbox name from the | The UNSUBSCRIBE command removes the specified mailbox name from the | |||
server's set of "active" or "subscribed" mailboxes as returned by the | server's set of "active" or "subscribed" mailboxes as returned by the | |||
LIST (SUBSCRIBED) command. This command returns a tagged OK response | LIST (SUBSCRIBED) command. This command returns a tagged OK response | |||
if the unsubscription is successful or if the mailbox is not | if the unsubscription is successful or if the mailbox is not | |||
subscribed. | subscribed. | |||
Example: C: A002 UNSUBSCRIBE #news.comp.mail.mime | Example: | |||
S: A002 OK UNSUBSCRIBE completed | ||||
C: A002 UNSUBSCRIBE #news.comp.mail.mime | ||||
S: A002 OK UNSUBSCRIBE completed | ||||
6.3.9. LIST Command | 6.3.9. LIST Command | |||
Arguments (basic): reference name | Arguments (basic): | |||
mailbox name with possible wildcards | reference name | |||
mailbox name with possible wildcards | ||||
Arguments (extended): selection options (OPTIONAL) | Arguments (extended): | |||
reference name | selection options (OPTIONAL) | |||
mailbox patterns | reference name | |||
return options (OPTIONAL) | mailbox patterns | |||
return options (OPTIONAL) | ||||
Responses: untagged responses: LIST | Responses: untagged responses: LIST | |||
Result: OK - list completed | Result: OK - list completed | |||
NO - list failure: can't list that reference or mailbox | NO - list failure: can't list that reference or | |||
name | mailbox name | |||
BAD - command unknown or arguments invalid | BAD - command unknown or arguments invalid | |||
The LIST command returns a subset of mailbox names from the complete | The LIST command returns a subset of mailbox names from the complete | |||
set of all mailbox names available to the client. Zero or more | set of all mailbox names available to the client. Zero or more | |||
untagged LIST responses are returned, containing the name attributes, | untagged LIST responses are returned, containing the name attributes, | |||
hierarchy delimiter, name, and possible extension information; see | hierarchy delimiter, name, and possible extension information; see | |||
the description of the LIST response (Section 7.3.1) for more detail. | the description of the LIST response (Section 7.3.1) for more detail. | |||
The LIST command SHOULD return its data quickly, without undue delay. | The LIST command SHOULD return its data quickly, without undue delay. | |||
For example, it should not go to excess trouble to calculate the | For example, it should not go to excess trouble to calculate the | |||
\Marked or \Unmarked status or perform other processing; if each name | \Marked or \Unmarked status or perform other processing; if each name | |||
requires 1 second of processing, then a list of 1200 names would take | requires 1 second of processing, then a list of 1200 names would take | |||
20 minutes! | 20 minutes! | |||
The extended LIST command, originally introduced in [RFC5258], | The extended LIST command, originally introduced in [RFC5258], | |||
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 following | The extended syntax is being used if one or more of the following | |||
conditions is true: | conditions is true: | |||
1. if the first word after the command name begins with a | 1. the first word after the command name begins with a parenthesis | |||
parenthesis ("LIST selection options"); | ("LIST selection options"); | |||
2. if the second word after the command name begins with a | 2. the second word after the command name begins with a parenthesis; | |||
parenthesis; | and | |||
3. if the LIST command has more than 2 parameters ("LIST return | 3. the LIST command has more than 2 parameters ("LIST return | |||
options") | options"). | |||
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 names | mailbox name is interpreted as by SELECT. The returned mailbox names | |||
MUST match the supplied mailbox name pattern(s). A non-empty | MUST match the supplied mailbox name pattern(s). A non-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. Clients SHOULD use the empty reference | name is interpreted. Clients SHOULD use the empty reference | |||
argument. | argument. | |||
In the basic syntax only, an empty ("" string) mailbox name argument | In the basic syntax only, an empty ("" string) mailbox name argument | |||
is a special request to return the hierarchy delimiter and the root | is a special request to return the hierarchy delimiter and the root | |||
name of the name given in the reference. The value returned as the | name of the name given in the reference. The value returned as the | |||
root MAY be the empty string if the reference is non-rooted or is an | root MAY be the empty string if the reference is non-rooted or is an | |||
empty string. In all cases, a hierarchy delimiter (or NIL if there | empty string. In all cases, a hierarchy delimiter (or NIL if there | |||
is no hierarchy) is returned. This permits a client to get the | is no hierarchy) is returned. This permits a client to get the | |||
hierarchy delimiter (or find out that the mailbox names are flat) | hierarchy delimiter (or find out that the mailbox names are flat) | |||
even when no mailboxes by that name currently exist. | even when no mailboxes by that name currently exist. | |||
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. | |||
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, that we call "canonical LIST pattern" later in this document. | form, which we call a "canonical LIST pattern": the canonical pattern | |||
To define the term "canonical LIST pattern" formally: it refers to | constructed internally by the server from the reference and mailbox | |||
the canonical pattern constructed internally by the server from the | name arguments. | |||
reference and mailbox name arguments. | ||||
Note: The interpretation of the reference argument is | Note: The interpretation of the reference argument is | |||
implementation-defined. It depends upon whether the server | implementation defined. It depends on whether the server | |||
implementation has a concept of the "current working directory" | implementation has a concept of the "current working directory" | |||
and leading "break out characters", which override the current | and leading "break out characters", which override the current | |||
working directory. | working directory. | |||
For example, on a server which exports a UNIX or NT filesystem, | For example, on a server that exports a UNIX or NT file system, | |||
the reference argument contains the current working directory, and | the reference argument contains the current working directory, and | |||
the mailbox name argument would contain the name as interpreted in | the mailbox name argument contains the name as interpreted in the | |||
the current working directory. | current working directory. | |||
If a server implementation has no concept of break out characters, | If a server implementation has no concept of break out characters, | |||
the canonical form is normally the reference name appended with | the canonical form is normally the reference name appended with | |||
the mailbox name. Note that if the server implements the | the mailbox name. Note that if the server implements the | |||
namespace convention (Section 5.1.2.1), "#" is a break out | namespace convention (Section 5.1.2.1), "#" is a break out | |||
character and must be treated as such. | character and must be treated as such. | |||
If the reference argument is not a level of mailbox hierarchy | If the reference argument is not a level of mailbox hierarchy | |||
(that is, it is a \NoInferiors name), and/or the reference | (that is, it is a \NoInferiors name), and/or the reference | |||
argument does not end with the hierarchy delimiter, it is | argument does not end with the hierarchy delimiter, it is | |||
implementation-dependent how this is interpreted. For example, a | interpreted as implementation dependent. For example, a reference | |||
reference of "foo/bar" and mailbox name of "rag/baz" could be | of "foo/bar" and mailbox name of "rag/baz" could be interpreted as | |||
interpreted as "foo/bar/rag/baz", "foo/barrag/baz", or "foo/rag/ | "foo/bar/rag/baz", "foo/barrag/baz", or "foo/rag/baz". A client | |||
baz". A client SHOULD NOT use such a reference argument except at | SHOULD NOT use such a reference argument except at the explicit | |||
the explicit request of the user. A hierarchical browser MUST NOT | request of the user. A hierarchical browser MUST NOT make any | |||
make any assumptions about server interpretation of the reference | assumptions about server interpretation of the reference unless | |||
unless the reference is a level of mailbox hierarchy AND ends with | the reference is a level of mailbox hierarchy AND ends with the | |||
the hierarchy delimiter. | hierarchy delimiter. | |||
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 also | interpreted form SHOULD prefix the interpreted form. It SHOULD also | |||
be in the same form as the reference name argument. This rule | be in the same form as the reference name argument. This rule | |||
permits the client to determine if the returned mailbox name is in | permits the client to determine if the returned mailbox name is in | |||
the context of the reference argument, or if something about the | the context of the reference argument or if something about the | |||
mailbox argument overrode the reference argument. Without this rule, | mailbox argument overrode the reference argument. Without this rule, | |||
the client would have to have knowledge of the server's naming | the client would have to have knowledge of the server's naming | |||
semantics including what characters are "breakouts" that override a | semantics including what characters are "breakouts" that override a | |||
naming context. | naming context. | |||
Here are some examples of how references | Here are some examples of how references and mailbox names might be | |||
and mailbox names might be interpreted on a UNIX-based | interpreted on a UNIX-based server: | |||
server: | ||||
Reference Mailbox Name Interpretation | +==============+==============+===================+ | |||
------------ ------------ -------------- | | Reference | Mailbox Name | Interpretation | | |||
~smith/Mail/ foo.* ~smith/Mail/foo.* | +==============+==============+===================+ | |||
archive/ % archive/% | | ~smith/Mail/ | foo.* | ~smith/Mail/foo.* | | |||
#news. comp.mail.* #news.comp.mail.* | +--------------+--------------+-------------------+ | |||
~smith/Mail/ /usr/doc/foo /usr/doc/foo | | archive/ | % | archive/% | | |||
archive/ ~fred/Mail/* ~fred/Mail/* | +--------------+--------------+-------------------+ | |||
| #news. | comp.mail.* | #news.comp.mail.* | | ||||
+--------------+--------------+-------------------+ | ||||
| ~smith/Mail/ | /usr/doc/foo | /usr/doc/foo | | ||||
+--------------+--------------+-------------------+ | ||||
| archive/ | ~fred/Mail/* | ~fred/Mail/* | | ||||
+--------------+--------------+-------------------+ | ||||
The first three examples demonstrate interpretations in | Table 1 | |||
the context of the reference argument. Note that | ||||
"~smith/Mail" SHOULD NOT be transformed into something | ||||
like "/u2/users/smith/Mail", or it would be impossible | ||||
for the client to determine that the interpretation was | ||||
in the context of the reference. | ||||
The character "*" is a wildcard, and matches zero or more characters | The first three examples above demonstrate interpretations in the | |||
context of the reference argument. Note that "~smith/Mail" SHOULD | ||||
NOT be transformed into something like "/u2/users/smith/Mail", or it | ||||
would be impossible for the client to determine that the | ||||
interpretation was in the context of the reference. | ||||
The character "*" is a wildcard and matches zero or more characters | ||||
at this position. The character "%" is similar to "*", but it does | at this position. The character "%" is similar to "*", but it does | |||
not match a hierarchy delimiter. If the "%" wildcard is the last | not match a hierarchy delimiter. If the "%" wildcard is the last | |||
character of a mailbox name argument, matching levels of hierarchy | character of a mailbox name argument, matching levels of hierarchy | |||
are also returned. If these levels of hierarchy are not also | are also returned. If these levels of hierarchy are not also | |||
selectable mailboxes, they are returned with the \Noselect mailbox | selectable mailboxes, they are returned with the \Noselect mailbox | |||
name attribute (see the description of the LIST response | name attribute (see the description of the LIST response | |||
(Section 7.3.1) for more details). | (Section 7.3.1) for more details). | |||
Any syntactically valid pattern that is not accepted by a server for | Any syntactically valid pattern that is not accepted by a server for | |||
any reason MUST be silently ignored. I.e. it results in no LIST | any reason MUST be silently ignored, i.e., it results in no LIST | |||
responses and the LIST command still returns tagged OK response. | responses, and the LIST command still returns a tagged OK response. | |||
Selection options tell the server to limit the mailbox names that are | Selection options tell the server to limit the mailbox names that are | |||
selected by the LIST operation. If selection options are used, the | selected by the LIST operation. If selection options are used, the | |||
mailboxes returned are those that match both the list of canonical | mailboxes returned are those that match both the list of canonical | |||
LIST patterns and the selection options. Unless a particular | LIST patterns and the selection options. Unless a particular | |||
selection option provides special rules, the selection options are | selection option provides special rules, the selection options are | |||
cumulative: a mailbox that matches the mailbox patterns is selected | cumulative: a mailbox that matches the mailbox patterns is selected | |||
only if it also matches all of the selection options. (An example of | only if it also matches all of the selection options. (An example of | |||
a selection option with special rules is the RECURSIVEMATCH option.) | a selection option with special rules is the RECURSIVEMATCH option.) | |||
skipping to change at page 51, line 37 ¶ | skipping to change at line 2402 ¶ | |||
string (one capability may enable multiple options), and a client | string (one capability may enable multiple options), and a client | |||
MUST NOT send an option for which the server has not advertised | MUST NOT send an option for which the server has not advertised | |||
support. A server MUST respond to options it does not recognize with | support. A server MUST respond to options it does not recognize with | |||
a BAD response. The client SHOULD NOT specify any option more than | a BAD response. The client SHOULD NOT specify any option more than | |||
once; however, if the client does this, the server MUST act as if it | once; however, if the client does this, the server MUST act as if it | |||
received the option only once. The order in which options are | received the option only once. The order in which options are | |||
specified by the client is not significant. | specified by the client is not significant. | |||
In general, each selection option except RECURSIVEMATCH will have a | In general, each selection option except RECURSIVEMATCH will have a | |||
corresponding return option with the same name. The REMOTE selection | corresponding return option with the same name. The REMOTE selection | |||
option is an anomaly in this regard, and does not have a | option is an anomaly in this regard and does not have a corresponding | |||
corresponding return option. That is because it expands, rather than | return option. That is because it expands, rather than restricts, | |||
restricts, the set of mailboxes that are returned. Future extensions | the set of mailboxes that are returned. Future extensions to this | |||
to this specification should keep this parallelism in mind and define | specification should keep this parallelism in mind and define a pair | |||
a pair of corresponding selection and return options. | of corresponding selection and return options. | |||
Server implementations are permitted to "hide" otherwise accessible | Server implementations are permitted to "hide" otherwise accessible | |||
mailboxes from the wildcard characters, by preventing certain | mailboxes from the wildcard characters, by preventing certain | |||
characters or names from matching a wildcard in certain situations. | characters or names from matching a wildcard in certain situations. | |||
For example, a UNIX-based server might restrict the interpretation of | For example, a UNIX-based server might restrict the interpretation of | |||
"*" so that an initial "/" character does not match. | "*" so that an initial "/" character does not match. | |||
The special name INBOX is included in the output from LIST, if INBOX | The special name INBOX is included in the output from LIST, if INBOX | |||
is supported by this server for this user and if the uppercase string | is supported by this server for this user and if the uppercase string | |||
"INBOX" matches the interpreted reference and mailbox name arguments | "INBOX" matches the interpreted reference and mailbox name arguments | |||
with wildcards as described above. The criteria for omitting INBOX | with wildcards as described above. The criteria for omitting INBOX | |||
is whether SELECT INBOX will return failure; it is not relevant | is whether SELECT INBOX will return a failure; it is not relevant | |||
whether the user's real INBOX resides on this or some other server. | whether the user's real INBOX resides on this or some other server. | |||
6.3.9.1. LIST Selection Options | 6.3.9.1. LIST Selection Options | |||
The selection options defined in this specification are as follows: | The selection options defined in this specification are as follows: | |||
SUBSCRIBED - causes the LIST command to list subscribed names, | SUBSCRIBED | |||
rather than the existing mailboxes. This will often be a subset | Causes the LIST command to list subscribed names rather than the | |||
of the actual mailboxes. It's also possible for this list to | existing mailboxes. This will often be a subset of the actual | |||
contain the names of mailboxes that don't exist. In any case, the | mailboxes. It's also possible for this list to contain the names | |||
list MUST include exactly those mailbox names that match the | of mailboxes that don't exist. In any case, the list MUST include | |||
canonical list pattern and are subscribed to. | exactly those mailbox names that match the canonical list pattern | |||
and are subscribed to. | ||||
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 when | attribute MUST be supported and MUST be accurately computed when | |||
the SUBSCRIBED selection option is specified. | the SUBSCRIBED selection option is specified. | |||
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). | |||
REMOTE - causes the LIST command to show remote mailboxes as well as | REMOTE | |||
local ones, as described in [RFC2193]. This option is intended to | Causes the LIST command to show remote mailboxes as well as local | |||
ones, as described in [RFC2193]. This option is intended to | ||||
replace the RLIST command and, in conjunction with the SUBSCRIBED | replace the RLIST command and, in conjunction with the SUBSCRIBED | |||
selection option, the RLSUB command. Servers that don't support | selection option, the RLSUB command. Servers that don't support | |||
the concept of remote mailboxes just ignore this option. | the concept of remote mailboxes can ignore this option. | |||
This option defines a mailbox attribute, "\Remote", that indicates | This option defines a mailbox attribute, "\Remote", that indicates | |||
that a mailbox is a remote mailbox. The "\Remote" attribute MUST | that a mailbox is a remote mailbox. The "\Remote" attribute MUST | |||
be accurately computed when the REMOTE option is specified. | be accurately computed when the REMOTE option is specified. | |||
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. In | any, to remote mailboxes, in addition to local ones. In | |||
particular, it has no interaction with RECURSIVEMATCH (see below). | 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 | request for (RECURSIVEMATCH) is also invalid. A request for | |||
(REMOTE RECURSIVEMATCH SUBSCRIBED) is asking for all subscribed | (REMOTE RECURSIVEMATCH SUBSCRIBED) is asking for all subscribed | |||
mailboxes, both local and remote. | mailboxes, both local and remote. | |||
RECURSIVEMATCH - this option forces the server to return information | RECURSIVEMATCH | |||
about parent mailboxes that don't match other selection options, | Forces the server to return information about parent mailboxes | |||
but have some submailboxes that do. Information about children is | that don't match other selection options but have some | |||
returned in the CHILDINFO extended data item, as described in | submailboxes that do. Information about children is returned in | |||
Section 6.3.9.6. | the CHILDINFO extended data item, as described in Section 6.3.9.6. | |||
Note 1: In order for a parent mailbox to be returned, it still has | Note 1: In order for a parent mailbox to be returned, it still | |||
to match the canonical LIST pattern. | has to match the canonical LIST pattern. | |||
Note 2: When returning the CHILDINFO extended data item, it | Note 2: When returning the CHILDINFO extended data item, it | |||
doesn't matter whether or not the submailbox matches the canonical | doesn't matter whether or not the submailbox matches the | |||
LIST pattern. See also example 9 in Section 6.3.9.8. | canonical LIST pattern. See also Example 9 in Section 6.3.9.8. | |||
The RECURSIVEMATCH option MUST NOT occur as the only selection | The RECURSIVEMATCH option MUST NOT occur as the only selection | |||
option (or only with REMOTE), as it only makes sense when other | option (or only with REMOTE), as it only makes sense when other | |||
selection options are also used. The server MUST return BAD | selection options are also used. The server MUST return a BAD | |||
tagged response in such case. | tagged response in such case. | |||
Note that even if the RECURSIVEMATCH option is specified, the | Note that even if the RECURSIVEMATCH option is specified, the | |||
client MUST still be able to handle a case when a CHILDINFO | client MUST still be able to handle cases when a CHILDINFO | |||
extended data item is returned and there are no submailboxes that | extended data item is returned and there are no submailboxes that | |||
meet the selection criteria of the subsequent LIST command, as | meet the selection criteria of the subsequent LIST command, as | |||
they can be deleted/renamed after the LIST response was sent, but | they can be deleted/renamed after the LIST response was sent but | |||
before the client had a chance to access them. | before the client had a chance to access them. | |||
6.3.9.2. LIST Return Options | 6.3.9.2. LIST Return Options | |||
The return options defined in this specification are as follows: | The return options defined in this specification are as follows: | |||
SUBSCRIBED - causes the LIST command to return subscription state | SUBSCRIBED | |||
for all matching mailbox names. The "\Subscribed" attribute MUST | Causes the LIST command to return subscription state for all | |||
be supported and MUST be accurately computed when the SUBSCRIBED | matching mailbox names. The "\Subscribed" attribute MUST be | |||
return option is specified. Further, all other mailbox attributes | supported and MUST be accurately computed when the SUBSCRIBED | |||
MUST be accurately computed (this differs from the behavior of the | return option is specified. Furthermore, all other mailbox | |||
obsolete LSUB command from RFC 3501). Note that the above | attributes MUST be accurately computed (this differs from the | |||
requirements don't override the requirement for the LIST command | behavior of the obsolete LSUB command from [RFC3501]). Note that | |||
to return results quickly (see Section 6.3.9), i.e. server | the above requirements don't override the requirement for the LIST | |||
implementations need to compute results quickly and accurately. | command to return results quickly (see Section 6.3.9), i.e., | |||
For example, server implementors might need to create quick access | server implementations need to compute results quickly and | |||
indices. | accurately. For example, server implementors might need to create | |||
quick access indices. | ||||
CHILDREN - requests mailbox child information as originally proposed | CHILDREN | |||
in [RFC3348]. See Section 6.3.9.5, below, for details. | Requests mailbox child information as originally proposed in | |||
[RFC3348]. See Section 6.3.9.5, below, for details. | ||||
STATUS - requests STATUS response for each matching mailbox. | STATUS | |||
Requests STATUS response for each matching mailbox. | ||||
This option takes STATUS data items as parameters. For each | This option takes STATUS data items as parameters. For each | |||
selectable mailbox matching the list pattern and selection | selectable mailbox matching the list pattern and selection | |||
options, the server MUST return an untagged LIST response | options, the server MUST return an untagged LIST response followed | |||
followed by an untagged STATUS response containing the | by an untagged STATUS response containing the information | |||
information requested in the STATUS return option, except for | requested in the STATUS return option, except for some cases | |||
some cases described below. | described below. | |||
If an attempted STATUS for a listed mailbox fails because the | If an attempted STATUS for a listed mailbox fails because the | |||
mailbox can't be selected (e.g., if the "l" ACL right [RFC4314] | mailbox can't be selected (e.g., if the "l" Access Control List | |||
is granted to the mailbox and the "r" right is not granted, or | (ACL) right [RFC4314] is granted to the mailbox and the "r" right | |||
due to a race condition between LIST and STATUS changing the | is not granted, or is due to a race condition between LIST and | |||
mailbox to \NoSelect), the STATUS response MUST NOT be returned | STATUS changing the mailbox to \NoSelect), the STATUS response | |||
and the LIST response MUST include the \NoSelect attribute. | MUST NOT be returned, and the LIST response MUST include the | |||
This means the server may have to buffer the LIST reply until | \NoSelect attribute. This means the server may have to buffer the | |||
it has successfully looked up the necessary STATUS information. | LIST reply until it has successfully looked up the necessary | |||
STATUS information. | ||||
If the server runs into unexpected problems while trying to | If the server runs into unexpected problems while trying to look | |||
look up the STATUS information, it MAY drop the corresponding | up the STATUS information, it MAY drop the corresponding STATUS | |||
STATUS reply. In such a situation, the LIST command would | reply. In such a situation, the LIST command would still return a | |||
still return a tagged OK reply. | tagged OK reply. | |||
See the note in the discussion of the STATUS command in | ||||
Section 6.3.11 for information about obtaining status on the | ||||
currently selected mailbox. | ||||
6.3.9.3. General Principles for Returning LIST Responses | 6.3.9.3. General Principles for Returning LIST Responses | |||
This section outlines several principles that can be used by server | This section outlines several principles that can be used by server | |||
implementations of this document to decide whether a LIST response | implementations of this document to decide whether a LIST response | |||
should be returned, as well as how many responses and what kind of | should be returned, as well as how many responses and what kind of | |||
information they may contain. | information they may contain. | |||
1. At most one LIST response should be returned for each mailbox | 1. At most, one LIST response should be returned for each mailbox | |||
name that matches the canonical LIST pattern. Server | name that matches the canonical LIST pattern. Server | |||
implementors must not assume that clients will be able to | implementors must not assume that clients will be able to | |||
assemble mailbox attributes and other information returned in | assemble mailbox attributes and other information returned in | |||
multiple LIST responses. | multiple LIST responses. | |||
2. There are only two reasons for including a matching mailbox name | 2. There are only two reasons for including a matching mailbox name | |||
in the responses to the LIST command (note that the server is | in the responses to the LIST command (note that the server is | |||
allowed to return unsolicited responses at any time, and such | allowed to return unsolicited responses at any time, and such | |||
responses are not governed by this rule): | responses are not governed by this rule): | |||
skipping to change at page 54, line 52 ¶ | skipping to change at line 2569 ¶ | |||
LIST pattern. | LIST pattern. | |||
For more information on this case, see the CHILDINFO extended | For more information on this case, see the CHILDINFO extended | |||
data item described in Section 6.3.9.6. Note that the | data item described in Section 6.3.9.6. Note that the | |||
CHILDINFO extended data item can only be returned when the | CHILDINFO extended data item can only be returned when the | |||
RECURSIVEMATCH selection option is specified. | RECURSIVEMATCH selection option is specified. | |||
3. Attributes returned in the same LIST response are treated | 3. Attributes returned in the same LIST response are treated | |||
additively. For example, the following response | additively. For example, the following response | |||
S: * LIST (\Subscribed \NonExistent) "/" "Fruit/Peach" | S: * LIST (\Subscribed \NonExistent) "/" "Fruit/Peach" | |||
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. | subscribed. | |||
6.3.9.4. Additional LIST-related Requirements on Clients | 6.3.9.4. Additional LIST-Related Requirements on Clients | |||
All clients MUST treat a LIST attribute with a stronger meaning as | All clients MUST treat a LIST attribute with a stronger meaning as | |||
implying any attribute that can be inferred from it. (See | implying any attribute that can be inferred from it. (See | |||
Section 7.3.1 for the list of currently defined attributes). For | Section 7.3.1 for the list of currently defined attributes.) For | |||
example, the client must treat the presence of the \NoInferiors | example, the client must treat the presence of the \NoInferiors | |||
attribute as if the \HasNoChildren attribute was also sent by the | attribute as if the \HasNoChildren attribute was also sent by the | |||
server. | server. | |||
The following table summarizes inference rules. | The following table summarizes inference rules. | |||
+--------------------+-------------------+ | +====================+===================+ | |||
| returned attribute | implied attribute | | | returned attribute | implied attribute | | |||
+--------------------+-------------------+ | +====================+===================+ | |||
| \NoInferiors | \HasNoChildren | | | \NoInferiors | \HasNoChildren | | |||
+--------------------+-------------------+ | ||||
| \NonExistent | \NoSelect | | | \NonExistent | \NoSelect | | |||
+--------------------+-------------------+ | +--------------------+-------------------+ | |||
Table 2 | ||||
6.3.9.5. The CHILDREN Return Option | 6.3.9.5. The CHILDREN Return Option | |||
The CHILDREN return option is simply an indication that the client | The CHILDREN return option is simply an indication that the client | |||
wants information about whether or not mailboxes contain children | wants information about whether or not mailboxes contain child | |||
mailboxes; a server MAY provide it even if the option is not | mailboxes; a server MAY provide it even if the option is not | |||
specified. | specified. | |||
Many IMAP4 clients present to the user a hierarchical view of the | Many IMAP clients present the user with a hierarchical view of the | |||
mailboxes that a user has access to. Rather than initially | 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 | |||
mailbox hierarchy (particularly if there is a large number of | hierarchy (particularly if there is a large number of mailboxes). | |||
mailboxes). The user can then expand the collapsed outline hierarchy | The user can then expand the collapsed outline hierarchy as needed. | |||
as needed. It is common to include within the collapsed hierarchy a | It is common to include a visual clue (such as a ''+'') within the | |||
visual clue (such as a ''+'') to indicate that there are child | collapsed hierarchy to indicate that there are child mailboxes under | |||
mailboxes under a particular mailbox. When the visual clue is | a particular mailbox. When the visual clue is clicked, the hierarchy | |||
clicked, the hierarchy list is expanded to show the child mailboxes. | list is expanded to show the child mailboxes. The CHILDREN return | |||
The CHILDREN return option provides a mechanism for a client to | option provides a mechanism for a client to efficiently determine | |||
efficiently determine whether a particular mailbox has children, | whether a particular mailbox has children, without issuing a LIST "" | |||
without issuing a LIST "" * or a LIST "" % for each mailbox name. | * or a LIST "" % for each mailbox name. The CHILDREN return option | |||
The CHILDREN return option defines two new attributes that MUST be | defines two new attributes that MUST be returned within a LIST | |||
returned within a LIST response: \HasChildren and \HasNoChildren. | response: \HasChildren and \HasNoChildren. Although these attributes | |||
Although these attributes MAY be returned in response to any LIST | MAY be returned in response to any LIST command, the CHILDREN return | |||
command, the CHILDREN return option is provided to indicate that the | option is provided to indicate that the client particularly wants | |||
client particularly wants this information. If the CHILDREN return | this information. If the CHILDREN return option is present, the | |||
option is present, the server MUST return these attributes even if | server MUST return these attributes even if their computation is | |||
their computation is expensive. | expensive. | |||
\HasChildren | \HasChildren | |||
The presence of this attribute indicates that the mailbox has | The presence of this attribute indicates that the mailbox has | |||
child mailboxes. A server SHOULD NOT set this attribute if | child mailboxes. A server SHOULD NOT set this attribute if | |||
there are child mailboxes and the user does not have permission | there are child mailboxes and the user does not have permission | |||
to access any of them. In this case, \HasNoChildren SHOULD be | to access any of them. In this case, \HasNoChildren SHOULD be | |||
used. In many cases, however, a server may not be able to | used. In many cases, however, a server may not be able to | |||
efficiently compute whether a user has access to any child | efficiently 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 must be correct at the time of processing the mailbox, a | |||
mailbox, a client must be prepared to deal with a situation when | client must be prepared to deal with a situation when a mailbox | |||
a mailbox is marked with the \HasChildren attribute, but no | is marked with the \HasChildren attribute, but no child mailbox | |||
child mailbox appears in the response to the LIST command. This | appears in the response to the LIST command. This might happen, | |||
might happen, for example, due to children mailboxes being | for example, due to child mailboxes being deleted or made | |||
deleted or made inaccessible to the user (using access control) | inaccessible to the user (using access control) by another | |||
by another client before the server is able to list them. | client before the server is able to list them. | |||
\HasNoChildren | \HasNoChildren | |||
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. | |||
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. | \HasNoChildren attribute in the same LIST response. | |||
Note: the \HasNoChildren attribute should not be confused with the | Note: the \HasNoChildren attribute should not be confused with the | |||
the \NoInferiors attribute, which indicates that no child mailboxes | \NoInferiors attribute, which indicates that no child mailboxes exist | |||
exist now and none can be created in the future. | now and none can be created in the future. | |||
6.3.9.6. CHILDINFO Extended Data Item | 6.3.9.6. CHILDINFO Extended Data Item | |||
The CHILDINFO extended data item MUST NOT be returned unless the | The CHILDINFO extended data item MUST NOT be returned unless the | |||
client has specified the RECURSIVEMATCH selection option. | client has specified the RECURSIVEMATCH selection option. | |||
The CHILDINFO extended data item in a LIST response describes the | The CHILDINFO extended data item in a LIST response describes the | |||
selection criteria that has caused it to be returned and indicates | selection criteria that has caused it to be returned and indicates | |||
that the mailbox has at least one descendant mailbox that matches the | that the mailbox has at least one descendant mailbox that matches the | |||
selection criteria. | selection criteria. | |||
Note: Some servers allow for mailboxes to exist without requiring | Note: Some servers allow for mailboxes to exist without requiring | |||
their parent to exist. For example, a mailbox "Customers/ABC" can | their parent to exist. For example, the mailbox "Customers/ABC" can | |||
exist while the mailbox "Customers" does not. As CHILDINFO extended | exist while the mailbox "Customers" does not. As the CHILDINFO | |||
data item is not allowed if the RECURSIVEMATCH selection option is | extended data item is not allowed if the RECURSIVEMATCH selection | |||
not specified, such servers SHOULD use the "\NonExistent | option is not specified, such servers SHOULD use the "\NonExistent | |||
\HasChildren" attribute pair to signal to the client that there is a | \HasChildren" attribute pair to signal to the client that there is a | |||
descendant mailbox that matches the selection criteria. See example | descendant mailbox that matches the selection criteria. See Example | |||
11 in Section 6.3.9.8. | 11 in Section 6.3.9.8. | |||
The returned selection criteria allow the client to distinguish a | The returned selection criteria allows the client to distinguish a | |||
solicited response from an unsolicited one, as well as to distinguish | 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. | that specify different criteria. | |||
Servers SHOULD only return a non-matching mailbox name along with | Servers SHOULD 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 SHOULD suppress redundant CHILDINFO responses. | |||
Examples 8 and 10 in Section 6.3.9.8 demonstrate the difference | Examples 8 and 10 in Section 6.3.9.8 demonstrate the difference | |||
between present CHILDINFO extended data item and the "\HasChildren" | between the present CHILDINFO extended data item and the | |||
attribute. | "\HasChildren" attribute. | |||
The following table summarizes interaction between the "\NonExistent" | The following table summarizes interaction between the "\NonExistent" | |||
attribute and CHILDINFO (the first column indicates whether the | attribute and CHILDINFO (the first column indicates whether the | |||
parent mailbox exists): | parent mailbox exists): | |||
+--------+-------------+------------------+-------------------------+ | +========+===========+====================+=====================+ | |||
| exists | meets the | has a child that | returned | | | Exists | Meets the | Has a child that | Returned IMAP4rev2/ | | |||
| | selection | meets the | IMAP4rev2/LIST-EXTENDED | | | | selection | meets the | LIST-EXTENDED | | |||
| | criteria | selection | attributes and | | | | criteria | selection criteria | attributes and | | |||
| | | criteria | CHILDINFO | | | | | | CHILDINFO | | |||
+--------+-------------+------------------+-------------------------+ | +========+===========+====================+=====================+ | |||
| no | no | no | no LIST response | | | no | no | no | no LIST response | | |||
| | | | returned | | | | | | returned | | |||
| yes | no | no | no LIST response | | +--------+-----------+--------------------+---------------------+ | |||
| | | | returned | | | yes | no | no | no LIST response | | |||
| no | yes | no | (\NonExistent <attr>) | | | | | | returned | | |||
| yes | yes | no | (<attr>) | | +--------+-----------+--------------------+---------------------+ | |||
| no | no | yes | (\NonExistent) + | | | no | yes | no | (\NonExistent | | |||
| | | | CHILDINFO | | | | | | <attr>) | | |||
| yes | no | yes | () + CHILDINFO | | +--------+-----------+--------------------+---------------------+ | |||
| no | yes | yes | (\NonExistent <attr>) + | | | yes | yes | no | (<attr>) | | |||
| | | | CHILDINFO | | +--------+-----------+--------------------+---------------------+ | |||
| yes | yes | yes | (<attr>) + CHILDINFO | | | no | no | yes | (\NonExistent) + | | |||
+--------+-------------+------------------+-------------------------+ | | | | | CHILDINFO | | |||
+--------+-----------+--------------------+---------------------+ | ||||
| yes | no | yes | () + CHILDINFO | | ||||
+--------+-----------+--------------------+---------------------+ | ||||
| no | yes | yes | (\NonExistent | | ||||
| | | | <attr>) + CHILDINFO | | ||||
+--------+-----------+--------------------+---------------------+ | ||||
| yes | yes | yes | (<attr>) + | | ||||
| | | | CHILDINFO | | ||||
+--------+-----------+--------------------+---------------------+ | ||||
where <attr> is one or more attributes that correspond to the | Table 3 | |||
selection criteria; for example, for the SUBSCRIBED option the <attr> | ||||
is \Subscribed. | where <attr> is one or more attributes that correspond to the | |||
selection criteria; for example, for the SUBSCRIBED option, the | ||||
<attr> is \Subscribed. | ||||
6.3.9.7. OLDNAME Extended Data Item | 6.3.9.7. OLDNAME Extended Data Item | |||
The OLDNAME extended data item is included when a mailbox name is | The OLDNAME extended data item is included when a mailbox name is | |||
created (with CREATE command), renamed (with RENAME command) or | created (with the CREATE command), renamed (with the RENAME command), | |||
deleted (with DELETE command). (When a mailbox is deleted the | or deleted (with the DELETE command). (When a mailbox is deleted, | |||
"\NonExistent" attribute is also included.) IMAP extensions can | the "\NonExistent" attribute is also included.) IMAP extensions can | |||
specify other conditions when OLDNAME extended data item should be | specify other conditions when the OLDNAME extended data item should | |||
included. | be included. | |||
If the server allows de-normalized mailbox names (see Section 5.1) in | If the server allows denormalized mailbox names (see Section 5.1) in | |||
SELECT/EXAMINE, CREATE, RENAME or DELETE, it SHOULD return an | SELECT/EXAMINE, CREATE, RENAME, or DELETE, it SHOULD return an | |||
unsolicited LIST response that includes OLDNAME extended data item, | unsolicited LIST response that includes the OLDNAME extended data | |||
whenever the supplied mailbox name differs from the resulting | item, whenever the supplied mailbox name differs from the resulting | |||
normalized mailbox name. From the client point of view this is | normalized mailbox name. From the client point of view, this is | |||
indistinguishable from another user renaming or deleting the mailbox, | indistinguishable from another user renaming or deleting the mailbox, | |||
as specified in the previous paragraph. | as specified in the previous paragraph. | |||
A deleted mailbox can be announced like this: | A deleted mailbox can be announced as follows: | |||
S: * LIST (\NonExistent) "." "INBOX.DeletedMailbox" | S: * LIST (\NonExistent) "." "INBOX.DeletedMailbox" | |||
Example of a renamed mailbox: | Example of a renamed mailbox: | |||
S: * LIST () "/" "NewMailbox" ("OLDNAME" ("OldMailbox")) | S: * LIST () "/" "NewMailbox" ("OLDNAME" ("OldMailbox")) | |||
6.3.9.8. LIST Command Examples | 6.3.9.8. LIST Command Examples | |||
This example shows some uses of the basic LIST command: | This example shows some uses of the basic LIST command: | |||
Example: C: A101 LIST "" "" | Example: | |||
S: * LIST (\Noselect) "/" "" | ||||
S: A101 OK LIST Completed | C: A101 LIST "" "" | |||
C: A102 LIST #news.comp.mail.misc "" | S: * LIST (\Noselect) "/" "" | |||
S: * LIST (\Noselect) "." #news. | S: A101 OK LIST Completed | |||
S: A102 OK LIST Completed | C: A102 LIST #news.comp.mail.misc "" | |||
C: A103 LIST /usr/staff/jones "" | S: * LIST (\Noselect) "." #news. | |||
S: * LIST (\Noselect) "/" / | S: A102 OK LIST Completed | |||
S: A103 OK LIST Completed | C: A103 LIST /usr/staff/jones "" | |||
C: A202 LIST ~/Mail/ % | S: * LIST (\Noselect) "/" / | |||
S: * LIST (\Noselect) "/" ~/Mail/foo | S: A103 OK LIST Completed | |||
S: * LIST () "/" ~/Mail/meetings | C: A202 LIST ~/Mail/ % | |||
S: A202 OK LIST completed | S: * LIST (\Noselect) "/" ~/Mail/foo | |||
S: * LIST () "/" ~/Mail/meetings | ||||
S: A202 OK LIST completed | ||||
Extended examples: | Extended examples: | |||
1: The first example shows the complete local hierarchy that will | 1: The first example shows the complete local hierarchy that will | |||
be used for the other examples. | be used for the other examples. | |||
C: A01 LIST "" "*" | C: A01 LIST "" "*" | |||
S: * LIST (\Marked \NoInferiors) "/" "inbox" | S: * LIST (\Marked \NoInferiors) "/" "inbox" | |||
S: * LIST () "/" "Fruit" | S: * LIST () "/" "Fruit" | |||
S: * LIST () "/" "Fruit/Apple" | S: * LIST () "/" "Fruit/Apple" | |||
S: * LIST () "/" "Fruit/Banana" | S: * LIST () "/" "Fruit/Banana" | |||
S: * LIST () "/" "Tofu" | S: * LIST () "/" "Tofu" | |||
S: * LIST () "/" "Vegetable" | S: * LIST () "/" "Vegetable" | |||
S: * LIST () "/" "Vegetable/Broccoli" | S: * LIST () "/" "Vegetable/Broccoli" | |||
S: * LIST () "/" "Vegetable/Corn" | S: * LIST () "/" "Vegetable/Corn" | |||
S: A01 OK done | S: A01 OK done | |||
2: In the next example, we will see the subscribed mailboxes. This | 2: In the next example, we will see the subscribed mailboxes. This | |||
is similar to, but not equivalent with now deprecated, <LSUB "" | is similar to, but not equivalent with, the now deprecated <LSUB | |||
"*"> (see [RFC3501] for more details on LSUB command). Note | "" "*"> (see [RFC3501] for more details on the LSUB command). | |||
that the mailbox called "Fruit/Peach" is subscribed to, but does | Note that the mailbox called "Fruit/Peach" is subscribed to, but | |||
not actually exist (perhaps it was deleted while still | it does not actually exist (perhaps it was deleted while still | |||
subscribed). The "Fruit" mailbox is not subscribed to, but it | subscribed). The "Fruit" mailbox is not subscribed to, but it | |||
has two subscribed children. The "Vegetable" mailbox is | has two subscribed children. The "Vegetable" mailbox is | |||
subscribed and has two children; one of them is subscribed as | subscribed and has two children; one of them is subscribed as | |||
well. | well. | |||
C: A02 LIST (SUBSCRIBED) "" "*" | C: A02 LIST (SUBSCRIBED) "" "*" | |||
S: * LIST (\Marked \NoInferiors \Subscribed) "/" "inbox" | S: * LIST (\Marked \NoInferiors \Subscribed) "/" "inbox" | |||
S: * LIST (\Subscribed) "/" "Fruit/Banana" | S: * LIST (\Subscribed) "/" "Fruit/Banana" | |||
S: * LIST (\Subscribed \NonExistent) "/" "Fruit/Peach" | S: * LIST (\Subscribed \NonExistent) "/" "Fruit/Peach" | |||
S: * LIST (\Subscribed) "/" "Vegetable" | S: * LIST (\Subscribed) "/" "Vegetable" | |||
S: * LIST (\Subscribed) "/" "Vegetable/Broccoli" | S: * LIST (\Subscribed) "/" "Vegetable/Broccoli" | |||
S: A02 OK done | S: A02 OK done | |||
3: The next example shows the use of the CHILDREN option. The | 3: The next example shows the use of the CHILDREN option. The | |||
client, without having to list the second level of hierarchy, | client, without having to list the second level of hierarchy, | |||
now knows which of the top-level mailboxes have submailboxes | now knows which of the top-level mailboxes have submailboxes | |||
(children) and which do not. Note that it's not necessary for | (children) and which do not. Note that it's not necessary for | |||
the server to return the \HasNoChildren attribute for the inbox, | the server to return the \HasNoChildren attribute for the inbox, | |||
because the \NoInferiors attribute already implies that, and has | because the \NoInferiors attribute already implies that and has | |||
a stronger meaning. | a stronger meaning. | |||
C: A03 LIST () "" "%" RETURN (CHILDREN) | C: A03 LIST () "" "%" RETURN (CHILDREN) | |||
S: * LIST (\Marked \NoInferiors) "/" "inbox" | S: * LIST (\Marked \NoInferiors) "/" "inbox" | |||
S: * LIST (\HasChildren) "/" "Fruit" | S: * LIST (\HasChildren) "/" "Fruit" | |||
S: * LIST (\HasNoChildren) "/" "Tofu" | S: * LIST (\HasNoChildren) "/" "Tofu" | |||
S: * LIST (\HasChildren) "/" "Vegetable" | S: * LIST (\HasChildren) "/" "Vegetable" | |||
S: A03 OK done | S: A03 OK done | |||
4: In this example, we see more mailboxes that reside on another | 4: In this example, we see more mailboxes that reside on another | |||
server. This is similar to the command <RLIST "" "%">. | server. This is similar to the command <RLIST "" "%">. | |||
C: A04 LIST (REMOTE) "" "%" RETURN (CHILDREN) | C: A04 LIST (REMOTE) "" "%" RETURN (CHILDREN) | |||
S: * LIST (\Marked \NoInferiors) "/" "inbox" | S: * LIST (\Marked \NoInferiors) "/" "inbox" | |||
S: * LIST (\HasChildren) "/" "Fruit" | S: * LIST (\HasChildren) "/" "Fruit" | |||
S: * LIST (\HasNoChildren) "/" "Tofu" | S: * LIST (\HasNoChildren) "/" "Tofu" | |||
S: * LIST (\HasChildren) "/" "Vegetable" | S: * LIST (\HasChildren) "/" "Vegetable" | |||
S: * LIST (\Remote \HasNoChildren) "/" "Bread" | S: * LIST (\Remote \HasNoChildren) "/" "Bread" | |||
S: * LIST (\HasChildren \Remote) "/" "Meat" | S: * LIST (\HasChildren \Remote) "/" "Meat" | |||
S: A04 OK done | S: A04 OK done | |||
5: The following example also requests the server to include | 5: The following example also requests the server to include | |||
mailboxes that reside on another server. The server returns | mailboxes that reside on another server. The server returns | |||
information about all mailboxes that are subscribed. This is | information about all mailboxes that are subscribed. This is | |||
similar to the command <RLSUB "" "*"> (see [RFC2193] for more | similar to the command <RLSUB "" "*"> (see [RFC2193] for more | |||
details on RLSUB). We also see the use of two selection | details on RLSUB). We also see the use of two selection | |||
options. | options. | |||
C: A05 LIST (REMOTE SUBSCRIBED) "" "*" | C: A05 LIST (REMOTE SUBSCRIBED) "" "*" | |||
S: * LIST (\Marked \NoInferiors \Subscribed) "/" "inbox" | S: * LIST (\Marked \NoInferiors \Subscribed) "/" "inbox" | |||
S: * LIST (\Subscribed) "/" "Fruit/Banana" | S: * LIST (\Subscribed) "/" "Fruit/Banana" | |||
S: * LIST (\Subscribed \NonExistent) "/" "Fruit/Peach" | S: * LIST (\Subscribed \NonExistent) "/" "Fruit/Peach" | |||
S: * LIST (\Subscribed) "/" "Vegetable" | S: * LIST (\Subscribed) "/" "Vegetable" | |||
S: * LIST (\Subscribed) "/" "Vegetable/Broccoli" | S: * LIST (\Subscribed) "/" "Vegetable/Broccoli" | |||
S: * LIST (\Remote \Subscribed) "/" "Bread" | S: * LIST (\Remote \Subscribed) "/" "Bread" | |||
S: A05 OK done | S: A05 OK done | |||
6: The following example requests the server to include mailboxes | 6: 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. This is | subscription information for all returned mailboxes. This is | |||
different from the example above. | different from the example above. | |||
Note that the output of this command is not a superset of the | Note that the output of this command is not a superset of the | |||
output in the previous example, as it doesn't include LIST | output in the previous example, as it doesn't include a LIST | |||
response for the non-existent "Fruit/Peach". | response for the non-existent "Fruit/Peach". | |||
C: A06 LIST (REMOTE) "" "*" RETURN (SUBSCRIBED) | C: A06 LIST (REMOTE) "" "*" RETURN (SUBSCRIBED) | |||
S: * LIST (\Marked \NoInferiors \Subscribed) "/" "inbox" | S: * LIST (\Marked \NoInferiors \Subscribed) "/" "inbox" | |||
S: * LIST () "/" "Fruit" | S: * LIST () "/" "Fruit" | |||
S: * LIST () "/" "Fruit/Apple" | S: * LIST () "/" "Fruit/Apple" | |||
S: * LIST (\Subscribed) "/" "Fruit/Banana" | S: * LIST (\Subscribed) "/" "Fruit/Banana" | |||
S: * LIST () "/" "Tofu" | S: * LIST () "/" "Tofu" | |||
S: * LIST (\Subscribed) "/" "Vegetable" | S: * LIST (\Subscribed) "/" "Vegetable" | |||
S: * LIST (\Subscribed) "/" "Vegetable/Broccoli" | S: * LIST (\Subscribed) "/" "Vegetable/Broccoli" | |||
S: * LIST () "/" "Vegetable/Corn" | S: * LIST () "/" "Vegetable/Corn" | |||
S: * LIST (\Remote \Subscribed) "/" "Bread" | S: * LIST (\Remote \Subscribed) "/" "Bread" | |||
S: * LIST (\Remote) "/" "Meat" | S: * LIST (\Remote) "/" "Meat" | |||
S: A06 OK done | S: A06 OK done | |||
7: The following example demonstrates the difference between the | 7: The following example demonstrates the difference between the | |||
\HasChildren attribute and the CHILDINFO extended data item. | \HasChildren attribute and the CHILDINFO extended data item. | |||
Let's assume there is the following hierarchy: | Let's assume there is the following hierarchy: | |||
C: C01 LIST "" "*" | C: C01 LIST "" "*" | |||
S: * LIST (\Marked \NoInferiors) "/" "inbox" | S: * LIST (\Marked \NoInferiors) "/" "inbox" | |||
S: * LIST () "/" "Foo" | S: * LIST () "/" "Foo" | |||
S: * LIST () "/" "Foo/Bar" | S: * LIST () "/" "Foo/Bar" | |||
S: * LIST () "/" "Foo/Baz" | S: * LIST () "/" "Foo/Baz" | |||
S: * LIST () "/" "Moo" | S: * LIST () "/" "Moo" | |||
S: C01 OK done | S: C01 OK done | |||
If the client asks RETURN (CHILDREN), it will get this: | If the client asks RETURN (CHILDREN), it will get this: | |||
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 | |||
A) Let's also assume that the mailbox "Foo/Baz" is the only | A) 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: | |||
C: C02 LIST (SUBSCRIBED) "" "*" | C: C02 LIST (SUBSCRIBED) "" "*" | |||
S: * LIST (\Subscribed) "/" "Foo/Baz" | S: * LIST (\Subscribed) "/" "Foo/Baz" | |||
S: C02 OK done | S: C02 OK done | |||
Now, if the client issues <LIST (SUBSCRIBED) "" "%">, the server | Now, if the client issues <LIST (SUBSCRIBED) "" "%">, the | |||
will return no mailboxes (as the mailboxes "Moo", "Foo", and | server will return no mailboxes (as the mailboxes "Moo", | |||
"Inbox" are NOT subscribed). However, if the client issues | "Foo", and "Inbox" are NOT subscribed). However, if the | |||
this: | client issues this: | |||
C: C04 LIST (SUBSCRIBED RECURSIVEMATCH) "" "%" | C: C04 LIST (SUBSCRIBED RECURSIVEMATCH) "" "%" | |||
S: * LIST () "/" "Foo" ("CHILDINFO" ("SUBSCRIBED")) | S: * LIST () "/" "Foo" ("CHILDINFO" ("SUBSCRIBED")) | |||
S: C04 OK done | S: C04 OK done | |||
(i.e., the mailbox "Foo" is not subscribed, but it has a child | (that is, the mailbox "Foo" is not subscribed, but it has a | |||
that is.) | child that is), then A1 or A2 occurs. | |||
A1) If the mailbox "Foo" had also been subscribed, the last | A1) If the mailbox "Foo" had also been subscribed, the last | |||
command would return this: | command would return this: | |||
C: C04 LIST (SUBSCRIBED RECURSIVEMATCH) "" "%" | C: C04 LIST (SUBSCRIBED RECURSIVEMATCH) "" "%" | |||
S: * LIST (\Subscribed) "/" "Foo" ("CHILDINFO" ("SUBSCRIBED")) | S: * LIST (\Subscribed) "/" "Foo" ("CHILDINFO" | |||
S: C04 OK done | ("SUBSCRIBED")) | |||
S: C04 OK done | ||||
or even this: | or even this: | |||
C: C04 LIST (SUBSCRIBED RECURSIVEMATCH) "" "%" | C: C04 LIST (SUBSCRIBED RECURSIVEMATCH) "" "%" | |||
S: * LIST (\Subscribed \HasChildren) "/" "Foo" ("CHILDINFO" | S: * LIST (\Subscribed \HasChildren) "/" "Foo" | |||
("SUBSCRIBED")) | ("CHILDINFO" ("SUBSCRIBED")) | |||
S: C04 OK done | S: C04 OK done | |||
A2) If we assume instead that the mailbox "Foo" is not part of | A2) If we assume instead that the mailbox "Foo" is not part | |||
the original hierarchy and is not subscribed, the last command | of the original hierarchy and is not subscribed, the | |||
will give this result: | last command will give this result: | |||
C: C04 LIST (SUBSCRIBED RECURSIVEMATCH) "" "%" | C: C04 LIST (SUBSCRIBED RECURSIVEMATCH) "" "%" | |||
S: * LIST (\NonExistent) "/" "Foo" ("CHILDINFO" ("SUBSCRIBED")) | S: * LIST (\NonExistent) "/" "Foo" ("CHILDINFO" | |||
S: C04 OK done | ("SUBSCRIBED")) | |||
S: C04 OK done | ||||
B) Now, let's assume that no mailbox is subscribed. In this | B) Now, let's assume that no mailbox is subscribed. In this | |||
case, the command <LIST (SUBSCRIBED RECURSIVEMATCH) "" "%"> will | case, the command <LIST (SUBSCRIBED RECURSIVEMATCH) "" "%"> | |||
return no responses, as there are no subscribed children (even | will return no responses, as there are no subscribed | |||
though "Foo" has children). | children (even though "Foo" has children). | |||
C) And finally, suppose that only the mailboxes "Foo" and "Moo" | C) And finally, suppose that only the mailboxes "Foo" and "Moo" | |||
are subscribed. In that case, we see this result: | are subscribed. In that case, we see this result: | |||
C: C04 LIST (SUBSCRIBED RECURSIVEMATCH) "" "%" RETURN (CHILDREN) | C: C04 LIST (SUBSCRIBED RECURSIVEMATCH) "" "%" RETURN | |||
S: * LIST (\HasChildren \Subscribed) "/" "Foo" | (CHILDREN) | |||
S: * LIST (\HasNoChildren \Subscribed) "/" "Moo" | S: * LIST (\HasChildren \Subscribed) "/" "Foo" | |||
S: C04 OK done | S: * LIST (\HasNoChildren \Subscribed) "/" "Moo" | |||
S: C04 OK done | ||||
(which means that the mailbox "Foo" has children, but none of | (which means that the mailbox "Foo" has children, but none | |||
them is subscribed). | of them is subscribed). | |||
8: The following example demonstrates that the CHILDINFO extended | 8: The following example demonstrates that the CHILDINFO extended | |||
data item is returned whether or not children mailboxes match | data item is returned whether or not child mailboxes match the | |||
the canonical LIST pattern. | canonical LIST pattern. | |||
Let's assume there is the following hierarchy: | Let's assume there is the following hierarchy: | |||
C: D01 LIST "" "*" | C: D01 LIST "" "*" | |||
S: * LIST (\Marked \NoInferiors) "/" "inbox" | S: * LIST (\Marked \NoInferiors) "/" "inbox" | |||
S: * LIST () "/" "foo2" | S: * LIST () "/" "foo2" | |||
S: * LIST () "/" "foo2/bar1" | S: * LIST () "/" "foo2/bar1" | |||
S: * LIST () "/" "foo2/bar2" | S: * LIST () "/" "foo2/bar2" | |||
S: * LIST () "/" "baz2" | S: * LIST () "/" "baz2" | |||
S: * LIST () "/" "baz2/bar2" | S: * LIST () "/" "baz2/bar2" | |||
S: * LIST () "/" "baz2/bar22" | S: * LIST () "/" "baz2/bar22" | |||
S: * LIST () "/" "baz2/bar222" | S: * LIST () "/" "baz2/bar222" | |||
S: * LIST () "/" "eps2" | S: * LIST () "/" "eps2" | |||
S: * LIST () "/" "eps2/mamba" | S: * LIST () "/" "eps2/mamba" | |||
S: * LIST () "/" "qux2/bar2" | S: * LIST () "/" "qux2/bar2" | |||
S: D01 OK done | S: D01 OK done | |||
And that the following mailboxes are subscribed: | And that the following mailboxes are subscribed: | |||
C: D02 LIST (SUBSCRIBED) "" "*" | C: D02 LIST (SUBSCRIBED) "" "*" | |||
S: * LIST (\Subscribed) "/" "foo2/bar1" | S: * LIST (\Subscribed) "/" "foo2/bar1" | |||
S: * LIST (\Subscribed) "/" "foo2/bar2" | S: * LIST (\Subscribed) "/" "foo2/bar2" | |||
S: * LIST (\Subscribed) "/" "baz2/bar2" | S: * LIST (\Subscribed) "/" "baz2/bar2" | |||
S: * LIST (\Subscribed) "/" "baz2/bar22" | S: * LIST (\Subscribed) "/" "baz2/bar22" | |||
S: * LIST (\Subscribed) "/" "baz2/bar222" | S: * LIST (\Subscribed) "/" "baz2/bar222" | |||
S: * LIST (\Subscribed) "/" "eps2" | S: * LIST (\Subscribed) "/" "eps2" | |||
S: * LIST (\Subscribed) "/" "eps2/mamba" | S: * LIST (\Subscribed) "/" "eps2/mamba" | |||
S: * LIST (\Subscribed) "/" "qux2/bar2" | S: * LIST (\Subscribed) "/" "qux2/bar2" | |||
S: D02 OK done | S: D02 OK done | |||
The client issues the following command first: | The client issues the following command first: | |||
C: D03 LIST (RECURSIVEMATCH SUBSCRIBED) "" "*2" | C: D03 LIST (RECURSIVEMATCH SUBSCRIBED) "" "*2" | |||
S: * LIST () "/" "foo2" ("CHILDINFO" ("SUBSCRIBED")) | S: * LIST () "/" "foo2" ("CHILDINFO" ("SUBSCRIBED")) | |||
S: * LIST (\Subscribed) "/" "foo2/bar2" | S: * LIST (\Subscribed) "/" "foo2/bar2" | |||
S: * LIST (\Subscribed) "/" "baz2/bar2" | S: * LIST (\Subscribed) "/" "baz2/bar2" | |||
S: * LIST (\Subscribed) "/" "baz2/bar22" | S: * LIST (\Subscribed) "/" "baz2/bar22" | |||
S: * LIST (\Subscribed) "/" "baz2/bar222" | S: * LIST (\Subscribed) "/" "baz2/bar222" | |||
S: * LIST (\Subscribed) "/" "eps2" ("CHILDINFO" ("SUBSCRIBED")) | S: * LIST (\Subscribed) "/" "eps2" ("CHILDINFO" ("SUBSCRIBED")) | |||
S: * LIST (\Subscribed) "/" "qux2/bar2" | S: * LIST (\Subscribed) "/" "qux2/bar2" | |||
S: D03 OK done | S: D03 OK done | |||
and the server may also include (but this would violate a SHOULD | and the server may also include the following (but this would | |||
NOT in Section 3.5, because CHILDINFO is redundant) | violate a restriction in Section 6.3.9.6, because CHILDINFO is | |||
redundant): | ||||
S: * LIST () "/" "baz2" ("CHILDINFO" ("SUBSCRIBED")) | S: * LIST () "/" "baz2" ("CHILDINFO" ("SUBSCRIBED")) | |||
S: * LIST (\NonExistent) "/" "qux2" ("CHILDINFO" ("SUBSCRIBED")) | S: * LIST (\NonExistent) "/" "qux2" ("CHILDINFO" ("SUBSCRIBED")) | |||
The CHILDINFO extended data item is returned for mailboxes | The CHILDINFO extended data item is returned for mailboxes | |||
"foo2", "baz2", and "eps2", because all of them have subscribed | "foo2", "baz2", and "eps2" because all of them have subscribed | |||
children, even though for the mailbox "foo2" only one of the two | children, even though for the mailbox "foo2", only one of the | |||
subscribed children matches the pattern, for the mailbox "baz2" | two subscribed children matches the pattern; for the mailbox | |||
all the subscribed children match the pattern, and for the | "baz2", all of the subscribed children match the pattern; and | |||
mailbox "eps2" none of the subscribed children matches the | for the mailbox "eps2", none of the subscribed children match | |||
pattern. | the pattern. | |||
Note that if the client issues | Note that if the client issues the following: | |||
C: D03 LIST (RECURSIVEMATCH SUBSCRIBED) "" "*" | C: D03 LIST (RECURSIVEMATCH SUBSCRIBED) "" "*" | |||
S: * LIST () "/" "foo2" ("CHILDINFO" ("SUBSCRIBED")) | S: * LIST () "/" "foo2" ("CHILDINFO" ("SUBSCRIBED")) | |||
S: * LIST (\Subscribed) "/" "foo2/bar1" | S: * LIST (\Subscribed) "/" "foo2/bar1" | |||
S: * LIST (\Subscribed) "/" "foo2/bar2" | S: * LIST (\Subscribed) "/" "foo2/bar2" | |||
S: * LIST () "/" "baz2" ("CHILDINFO" ("SUBSCRIBED")) | S: * LIST () "/" "baz2" ("CHILDINFO" ("SUBSCRIBED")) | |||
S: * LIST (\Subscribed) "/" "baz2/bar2" | S: * LIST (\Subscribed) "/" "baz2/bar2" | |||
S: * LIST (\Subscribed) "/" "baz2/bar22" | S: * LIST (\Subscribed) "/" "baz2/bar22" | |||
S: * LIST (\Subscribed) "/" "baz2/bar222" | S: * LIST (\Subscribed) "/" "baz2/bar222" | |||
S: * LIST (\Subscribed) "/" "eps2" ("CHILDINFO" ("SUBSCRIBED")) | S: * LIST (\Subscribed) "/" "eps2" ("CHILDINFO" ("SUBSCRIBED")) | |||
S: * LIST (\Subscribed) "/" "eps2/mamba" | S: * LIST (\Subscribed) "/" "eps2/mamba" | |||
S: * LIST (\Subscribed) "/" "qux2/bar2" | S: * LIST (\Subscribed) "/" "qux2/bar2" | |||
S: D03 OK done | S: D03 OK done | |||
The LIST responses for mailboxes "foo2", "baz2", and "eps2" | the LIST responses for mailboxes "foo2", "baz2", and "eps2" | |||
still have the CHILDINFO extended data item, even though this | still have the CHILDINFO extended data item, even though this | |||
information is redundant and the client can determine it by | information is redundant and the client can determine it by | |||
itself. | itself. | |||
9: The following example shows usage of extended syntax for mailbox | 9: The following example shows usage of an extended syntax for the | |||
pattern. It also demonstrates that the presence of the | mailbox pattern. It also demonstrates that the presence of the | |||
CHILDINFO extended data item doesn't necessarily imply | CHILDINFO extended data item doesn't necessarily imply | |||
\HasChildren. | \HasChildren. | |||
C: a1 LIST "" ("foo") | C: a1 LIST "" ("foo") | |||
S: * LIST () "/" foo | S: * LIST () "/" foo | |||
S: a1 OK done | S: a1 OK done | |||
C: a2 LIST (SUBSCRIBED) "" "foo/*" | C: a2 LIST (SUBSCRIBED) "" "foo/*" | |||
S: * LIST (\Subscribed \NonExistent) "/" foo/bar | S: * LIST (\Subscribed \NonExistent) "/" foo/bar | |||
S: a2 OK done | S: a2 OK done | |||
C: a3 LIST (SUBSCRIBED RECURSIVEMATCH) "" foo RETURN (CHILDREN) | C: a3 LIST (SUBSCRIBED RECURSIVEMATCH) "" foo RETURN (CHILDREN) | |||
S: * LIST (\HasNoChildren) "/" foo ("CHILDINFO" ("SUBSCRIBED")) | S: * LIST (\HasNoChildren) "/" foo ("CHILDINFO" ("SUBSCRIBED")) | |||
S: a3 OK done | S: a3 OK done | |||
10: The following example shows how a server that supports missing | 10: 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 a | specify the RECURSIVEMATCH selection option that there is a | |||
child mailbox that matches the selection criteria. | child mailbox that matches the selection criteria. | |||
C: a1 LIST (REMOTE) "" * | C: a1 LIST (REMOTE) "" * | |||
S: * LIST () "/" music/rock | S: * LIST () "/" music/rock | |||
S: * LIST (\Remote) "/" also/jazz | S: * LIST (\Remote) "/" also/jazz | |||
S: a1 OK done | 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 | |||
Because "music/rock" is the only mailbox under "music", there's | Because "music/rock" is the only mailbox under "music", there's | |||
no need for the server to also return "music". However clients | no need for the server to also return "music". However, clients | |||
must handle both cases. | must handle both cases. | |||
11: The following examples show use of STATUS return option. | 11: The following examples show use of the STATUS return option. | |||
C: A01 LIST "" % RETURN (STATUS (MESSAGES UNSEEN)) | C: A01 LIST "" % RETURN (STATUS (MESSAGES UNSEEN)) | |||
S: * LIST () "." "INBOX" | S: * LIST () "." "INBOX" | |||
S: * STATUS "INBOX" (MESSAGES 17 UNSEEN 16) | S: * STATUS "INBOX" (MESSAGES 17 UNSEEN 16) | |||
S: * LIST () "." "foo" | S: * LIST () "." "foo" | |||
S: * STATUS "foo" (MESSAGES 30 UNSEEN 29) | S: * STATUS "foo" (MESSAGES 30 UNSEEN 29) | |||
S: * LIST (\NoSelect) "." "bar" | S: * LIST (\NoSelect) "." "bar" | |||
S: A01 OK List completed. | S: A01 OK List completed. | |||
The "bar" mailbox isn't selectable, so it has no STATUS reply. | The "bar" mailbox isn't selectable, so it has no STATUS reply. | |||
C: A02 LIST (SUBSCRIBED RECURSIVEMATCH) "" % RETURN (STATUS | 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. | |||
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. | |||
6.3.10. NAMESPACE Command | 6.3.10. NAMESPACE Command | |||
Arguments: none | Arguments: none | |||
Responses: REQUIRED untagged responses: NAMESPACE | Responses: REQUIRED untagged responses: NAMESPACE | |||
Result: OK - command completed | Result: OK - command completed | |||
NO - Can't complete the command | NO - Can't complete the command | |||
BAD - arguments invalid | BAD - arguments invalid | |||
The NAMESPACE command causes a single untagged NAMESPACE response to | The NAMESPACE command causes a single untagged NAMESPACE response to | |||
be returned. The untagged NAMESPACE response contains the prefix and | be returned. The untagged NAMESPACE response contains the prefix and | |||
hierarchy delimiter to the server's Personal Namespace(s), Other | hierarchy delimiter to the server's Personal Namespace(s), Other | |||
Users' Namespace(s), and Shared Namespace(s) that the server wishes | Users' Namespace(s), and Shared Namespace(s) that the server wishes | |||
to expose. The response will contain a NIL for any namespace class | to expose. The response will contain a NIL for any namespace class | |||
that is not available. The namespace-response-extensions ABNF non | that is not available. The namespace-response-extensions ABNF non- | |||
terminal is defined for extensibility and MAY be included in the | terminal is defined for extensibility and MAY be included in the | |||
NAMESPACE response. | NAMESPACE response. | |||
Example 1: | Example 1: | |||
In this example a server supports a single personal namespace. No | In this example, a server supports a single Personal Namespace. No | |||
leading prefix is used on personal mailboxes and "/" is the hierarchy | leading prefix is used on personal mailboxes, and "/" is the | |||
delimiter. | hierarchy delimiter. | |||
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 | |||
Example 2: | Example 2: | |||
A user logged on anonymously to a server. No personal mailboxes are | A user logged on anonymously to a server. No personal mailboxes are | |||
associated with the anonymous user and the user does not have access | 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 "." | shared mailboxes, and the hierarchy delimiter is "." | |||
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 | |||
Example 3: | Example 3: | |||
A server that contains a Personal Namespace and a single Shared | A server that contains a Personal Namespace and a single Shared | |||
Namespace. | Namespace. | |||
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 | |||
Example 4: | Example 4: | |||
A server that contains a Personal Namespace, Other Users' Namespace | A server that contains a Personal Namespace, Other Users' Namespace, | |||
and multiple Shared Namespaces. Note that the hierarchy delimiter | and multiple Shared Namespaces. Note that the hierarchy delimiter | |||
used within each namespace can be different. | used within each namespace can be different. | |||
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 | |||
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 | |||
a namespace. | namespace. | |||
Example 5: | Example 5: | |||
A server that supports only the Personal Namespace, with a leading | A server that supports only the Personal Namespace, with a leading | |||
prefix of INBOX to personal mailboxes and a hierarchy delimiter of | prefix of INBOX to personal mailboxes and a hierarchy delimiter of | |||
"." | ".". | |||
C: A001 NAMESPACE | C: A001 NAMESPACE | |||
S: * NAMESPACE (("INBOX." ".")) NIL NIL | S: * NAMESPACE (("INBOX." ".")) NIL NIL | |||
S: A001 OK NAMESPACE command completed | S: A001 OK NAMESPACE command completed | |||
< Automatically create a mailbox to store sent items.> | Automatically create a mailbox to store sent items. | |||
C: A002 CREATE "INBOX.Sent Mail" | C: A002 CREATE "INBOX.Sent Mail" | |||
S: A002 OK CREATE command completed | S: A002 OK CREATE command completed | |||
Although typically a server will support only a single Personal | 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 MAY be multiples of these, and a client MUST 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 SHOULD let the user select which | |||
namespaces to create the mailbox in or just use the first personal | namespaces to create the mailbox in, or just use the first Personal | |||
namespace. | Namespace. | |||
Example 6: | Example 6: | |||
In this example, a server supports two Personal Namespaces. In | 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 MH | additional Personal Namespace that allows access to mailboxes in an | |||
format mailstore. | MH format mailstore. | |||
The client is configured to save a copy of all mail sent by the user | The client is configured to save a copy of all mail sent by the user | |||
into a mailbox with the \Sent attribute (see Section 7.3.1). | into a mailbox with the \Sent attribute (see Section 7.3.1). | |||
Furthermore, after a message is deleted from a mailbox, the client is | Furthermore, after a message is deleted from a mailbox, the client is | |||
configured to move that message to a mailbox with the \Trash | configured to move that message to a mailbox with the \Trash | |||
attribute. The server signals with the \NonExistent mailbox | attribute. The server signals with the \NonExistent mailbox | |||
attribute that the corresponding mailboxes don't exist yet, and that | attribute that the corresponding mailboxes don't exist yet and that | |||
it is possible to create them. Once created, they could be used for | it is possible to create them. Once created, they could be used for | |||
the \Sent or \Trash purposes and the server will no longer include | \Sent or \Trash purposes, and the server will no longer include the | |||
the \NonExistent mailbox attribute for them. | \NonExistent mailbox attribute for them. | |||
Note that this example demonstrates how some extension parameters can | Note that this example demonstrates how some extension parameters can | |||
be passed to further describe the #mh namespace. See the fictitious | be passed to further describe the #mh namespace. See the fictitious | |||
"X-PARAM" extension parameter. | "X-PARAM" extension parameter. | |||
C: A001 NAMESPACE | C: A001 NAMESPACE | |||
S: * NAMESPACE (("" "/")("#mh/" "/" "X-PARAM" | S: * NAMESPACE (("" "/")("#mh/" "/" "X-PARAM" | |||
("FLAG1" "FLAG2"))) NIL NIL | ("FLAG1" "FLAG2"))) NIL NIL | |||
S: A001 OK NAMESPACE command completed | S: A001 OK NAMESPACE command completed | |||
C: A002 LIST (SPECIAL-USE) "" "*" | C: A002 LIST (SPECIAL-USE) "" "*" | |||
S: * LIST (\NonExistent \Archive) "/" Archives | S: * LIST (\NonExistent \Archive) "/" Archives | |||
S: * LIST (\NonExistent \Drafts) "/" Drafts | S: * LIST (\NonExistent \Drafts) "/" Drafts | |||
S: * LIST (\NonExistent \Junk) "/" Junk | S: * LIST (\NonExistent \Junk) "/" Junk | |||
S: * LIST (\NonExistent \Sent) "/" "Sent Mail" | S: * LIST (\NonExistent \Sent) "/" "Sent Mail" | |||
S: * LIST (\NonExistent \Trash) "/" "Deleted Items" | S: * LIST (\NonExistent \Trash) "/" "Deleted Items" | |||
S: A002 OK LIST Completed | S: A002 OK LIST Completed | |||
C: A003 LIST (SPECIAL-USE) "#mh/" "*" | C: A003 LIST (SPECIAL-USE) "#mh/" "*" | |||
S: * LIST (\NonExistent \Archive) "/" "#mh/Archives" | S: * LIST (\NonExistent \Archive) "/" "#mh/Archives" | |||
S: * LIST (\NonExistent \Drafts) "/" "#mh/Drafts" | S: * LIST (\NonExistent \Drafts) "/" "#mh/Drafts" | |||
S: * LIST (\NonExistent \Junk) "/" "#mh/Junk" | S: * LIST (\NonExistent \Junk) "/" "#mh/Junk" | |||
S: * LIST (\NonExistent \Sent) "/" "#mh/Sent Mail" | S: * LIST (\NonExistent \Sent) "/" "#mh/Sent Mail" | |||
S: * LIST (\NonExistent \Trash) "/" "#mh/Deleted Items" | S: * LIST (\NonExistent \Trash) "/" "#mh/Deleted Items" | |||
S: A003 OK LIST Completed | S: A003 OK LIST Completed | |||
< It is desired to keep only one copy of sent mail. | It is desired to keep only one copy of sent mail. It is unclear | |||
It is unclear which Personal Namespace the client | which Personal Namespace the client should use to create the 'Sent | |||
should use to create the 'Sent Mail' mailbox. | Mail' mailbox. The user is prompted to select a namespace, and only | |||
The user is prompted to select a namespace and only | one 'Sent Mail' mailbox is created. | |||
one 'Sent Mail' mailbox is created. > | ||||
C: A004 CREATE "Sent Mail" | C: A004 CREATE "Sent Mail" | |||
S: A004 OK CREATE command completed | S: A004 OK CREATE command completed | |||
< The client is designed so that it keeps two | The client is designed so that it keeps two 'Deleted Items' | |||
'Deleted Items' mailboxes, one for each namespace. > | mailboxes, one for each namespace. | |||
C: A005 CREATE "Delete Items" | C: A005 CREATE "Delete Items" | |||
S: A005 OK CREATE command completed | S: A005 OK CREATE command completed | |||
C: A006 CREATE "#mh/Deleted Items" | C: A006 CREATE "#mh/Deleted Items" | |||
S: A006 OK CREATE command completed | S: A006 OK CREATE command completed | |||
The next level of hierarchy following the Other Users' Namespace | The next level of hierarchy following the Other Users' Namespace | |||
prefix SHOULD consist of <username>, where <username> is a user name | prefix SHOULD consist of <username>, where <username> is a user name | |||
as per the LOGIN or AUTHENTICATE command. | as per the LOGIN or AUTHENTICATE command. | |||
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. | |||
In response to such a LIST command, a server SHOULD NOT return user | In response to such a LIST command, a server SHOULD NOT return user | |||
skipping to change at page 70, line 21 ¶ | skipping to change at line 3266 ¶ | |||
Alternatively, a server MAY 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. | |||
Example 7: | Example 7: | |||
A server that supports providing a list of other user's mailboxes | A server that supports providing a list of other user's mailboxes | |||
that are accessible to the currently logged on user. | that are accessible to the currently logged on user. | |||
C: A001 NAMESPACE | C: A001 NAMESPACE | |||
S: * NAMESPACE (("" "/")) (("Other Users/" "/")) NIL | S: * NAMESPACE (("" "/")) (("Other Users/" "/")) NIL | |||
S: A001 OK NAMESPACE command completed | S: A001 OK NAMESPACE command completed | |||
C: A002 LIST "" "Other Users/%" | C: A002 LIST "" "Other Users/%" | |||
S: * LIST () "/" "Other Users/Mike" | S: * LIST () "/" "Other Users/Mike" | |||
S: * LIST () "/" "Other Users/Karen" | S: * LIST () "/" "Other Users/Karen" | |||
S: * LIST () "/" "Other Users/Matthew" | S: * LIST () "/" "Other Users/Matthew" | |||
S: * LIST () "/" "Other Users/Tesa" | S: * LIST () "/" "Other Users/Tesa" | |||
S: A002 OK LIST command completed | S: A002 OK LIST command completed | |||
Example 8: | Example 8: | |||
A server that does not support providing a list of other user's | A server that does not support providing a list of other user's | |||
mailboxes that are accessible to the currently logged on user. The | mailboxes that are accessible to the currently logged on user. The | |||
mailboxes are listable if the client includes the name of the other | mailboxes are listable if the client includes the name of the other | |||
user with the Other Users' Namespace prefix. | user with the Other Users' Namespace prefix. | |||
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 | |||
< In this example, the currently logged on user has access to | In this example, the currently logged on user has access to the | |||
the Personal Namespace of user Mike, but the server chose to | Personal Namespace of user Mike, but the server chose to suppress | |||
suppress this information in the LIST response. However, | this information in the LIST response. However, by appending the | |||
by appending the user name Mike (received through user input) | user name Mike (received through user input) to the Other Users' | |||
to the Other Users' Namespace prefix, the client is able | Namespace prefix, the client is able to get a listing of the personal | |||
to get a listing of the personal mailboxes of user Mike. > | mailboxes of user Mike. | |||
C: A002 LIST "" "#Users/%" | C: A002 LIST "" "#Users/%" | |||
S: A002 NO The requested item could not be found. | S: A002 NO The requested item could not be found. | |||
C: A003 LIST "" "#Users/Mike/%" | C: A003 LIST "" "#Users/Mike/%" | |||
S: * LIST () "/" "#Users/Mike/INBOX" | S: * LIST () "/" "#Users/Mike/INBOX" | |||
S: * LIST () "/" "#Users/Mike/Foo" | S: * LIST () "/" "#Users/Mike/Foo" | |||
S: A003 OK LIST command completed. | S: A003 OK LIST command completed. | |||
A prefix string might not contain a hierarchy delimiter, because in | A prefix string might not contain a hierarchy delimiter, because in | |||
some cases it is not needed as part of the prefix. | some cases, it is not needed as part of the prefix. | |||
Example 9: | Example 9: | |||
A server that allows access to the Other Users' Namespace by | 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 AUTHENTICATE | where <username> is a user name as per the LOGIN or AUTHENTICATE | |||
command. | command. | |||
C: A001 NAMESPACE | C: A001 NAMESPACE | |||
S: * NAMESPACE (("" "/")) (("~" "/")) NIL | S: * NAMESPACE (("" "/")) (("~" "/")) NIL | |||
S: A001 OK NAMESPACE command completed | S: A001 OK NAMESPACE command completed | |||
< List the mailboxes for user mark > | List the mailboxes for user mark | |||
C: A002 LIST "" "~mark/%" | C: A002 LIST "" "~mark/%" | |||
S: * LIST () "/" "~mark/INBOX" | S: * LIST () "/" "~mark/INBOX" | |||
S: * LIST () "/" "~mark/foo" | S: * LIST () "/" "~mark/foo" | |||
S: A002 OK LIST command completed | S: A002 OK LIST command completed | |||
6.3.11. STATUS Command | 6.3.11. STATUS Command | |||
Arguments: mailbox name | Arguments: mailbox name | |||
status data item names | ||||
Responses: REQUIRED untagged responses: STATUS | status data item names | |||
Result: OK - status completed | Responses: REQUIRED untagged responses: STATUS | |||
NO - status failure: no status for that name | ||||
BAD - command unknown or arguments invalid | Result: OK - status completed | |||
NO - status failure: no status for that name | ||||
BAD - command unknown or arguments invalid | ||||
The STATUS command requests the status of the indicated mailbox. It | The STATUS command requests the status of the indicated mailbox. It | |||
does not change the currently selected mailbox, nor does it affect | does not change the currently selected mailbox, nor does it affect | |||
the state of any messages in the queried mailbox. | the state of any messages in the queried mailbox. | |||
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 mailbox | query that mailbox's status without deselecting the current mailbox | |||
in the first IMAP4rev2 connection. | in the first IMAP4rev2 connection. | |||
Unlike the LIST command, the STATUS command is not guaranteed to be | Unlike the LIST command, the STATUS command is not guaranteed to be | |||
fast in its response. Under certain circumstances, it can be quite | fast in its response. Under certain circumstances, it can be quite | |||
slow. In some implementations, the server is obliged to open the | slow. In some implementations, the server is obliged to open the | |||
mailbox read-only internally to obtain certain status information. | mailbox as "read-only" internally to obtain certain status | |||
Also unlike the LIST command, the STATUS command does not accept | information. Also unlike the LIST command, the STATUS command does | |||
wildcards. | not accept wildcards. | |||
Note: The STATUS command is intended to access the status of | Note: The STATUS command is intended to access the status of | |||
mailboxes other than the currently selected mailbox. Because the | mailboxes other than the currently selected mailbox. Because the | |||
STATUS command can cause the mailbox to be opened internally, and | STATUS command can cause the mailbox to be opened internally, and | |||
because this information is available by other means on the | because this information is available by other means on the | |||
selected mailbox, the STATUS command SHOULD NOT be used on the | selected mailbox, the STATUS command SHOULD NOT be used on the | |||
currently selected mailbox. However, servers MUST be able to | currently selected mailbox. However, servers MUST be able to | |||
execute STATUS command on the selected mailbox. (This might also | execute the STATUS command on the selected mailbox. (This might | |||
implicitly happen when STATUS return option is used in a LIST | also implicitly happen when the STATUS return option is used in a | |||
command). | LIST command.) | |||
The STATUS command MUST NOT be used as a "check for new messages | The STATUS command MUST NOT be used as a "check for new messages | |||
in the selected mailbox" operation (refer to Section 7 and | in the selected mailbox" operation (refer to Sections 7 and 7.4.1 | |||
Section 7.4.1 for more information about the proper method for new | for more information about the proper method for new message | |||
message checking). | checking). | |||
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 STATUS | depending upon server implementation. Clients should use STATUS | |||
SIZE cautiously. | SIZE cautiously. | |||
The currently defined status data items that can be requested are: | The currently defined status data items that can be requested are: | |||
MESSAGES The number of messages in the mailbox. | MESSAGES | |||
The number of messages in the mailbox. | ||||
UIDNEXT The next unique identifier value of the mailbox. Refer to | UIDNEXT | |||
The next unique identifier value of the mailbox. Refer to | ||||
Section 2.3.1.1 for more information. | Section 2.3.1.1 for more information. | |||
UIDVALIDITY The unique identifier validity value of the mailbox. | UIDVALIDITY | |||
Refer to Section 2.3.1.1 for more information. | The unique identifier validity value of the mailbox. Refer to | |||
Section 2.3.1.1 for more information. | ||||
UNSEEN The number of messages which do not have the \Seen flag set. | UNSEEN | |||
The number of messages that do not have the \Seen flag set. | ||||
DELETED The number of messages which have the \Deleted flag set. | DELETED | |||
The number of messages that have the \Deleted flag set. | ||||
SIZE The total size of the mailbox in octets. This is not strictly | SIZE | |||
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 MUST 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 Section 6.4.5) of all messages in the mailbox. | items (see Section 6.4.5) of all messages in the mailbox. | |||
Example: C: A042 STATUS blurdybloop (UIDNEXT MESSAGES) | Example: | |||
S: * STATUS blurdybloop (MESSAGES 231 UIDNEXT 44292) | ||||
S: A042 OK STATUS completed | C: A042 STATUS blurdybloop (UIDNEXT MESSAGES) | |||
S: * STATUS blurdybloop (MESSAGES 231 UIDNEXT 44292) | ||||
S: A042 OK STATUS completed | ||||
6.3.12. APPEND Command | 6.3.12. APPEND Command | |||
Arguments: mailbox name | Arguments: mailbox name | |||
OPTIONAL flag parenthesized list | ||||
OPTIONAL date/time string | ||||
message literal | ||||
Responses: OPTIONAL untagged response: LIST | OPTIONAL flag parenthesized list | |||
Result: OK - append completed | OPTIONAL date/time string | |||
NO - append error: can't append to that mailbox, error | ||||
in flags or date/time or message text | message literal | |||
BAD - command unknown or arguments invalid | ||||
Responses: OPTIONAL untagged response: LIST | ||||
Result: OK - append completed | ||||
NO - append error: can't append to that mailbox, error | ||||
in flags or date/time or message text | ||||
BAD - command unknown or arguments invalid | ||||
The APPEND command appends the literal argument as a new message to | The APPEND command appends the literal argument as a new message to | |||
the end of the specified destination mailbox. This argument SHOULD | the end of the specified destination mailbox. This argument SHOULD | |||
be in the format of an [RFC-5322] or [I18N-HDRS] message. 8-bit | be in the format of an [RFC5322] or [I18N-HDRS] 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 MUST be able to | |||
reversibly convert 8-bit APPEND data to 7-bit using a [MIME-IMB] | reversibly convert 8-bit APPEND data to 7 bits using a [MIME-IMB] | |||
content transfer encoding. | content transfer encoding. | |||
Note: There may be exceptions, e.g., draft messages, in which | Note: There may be exceptions, such as draft messages, in which | |||
required [RFC-5322] header fields are omitted in the message | required [RFC5322] header fields are omitted in the message | |||
literal argument to APPEND. The full implications of doing so | literal argument to APPEND. The full implications of doing so | |||
must be understood and carefully weighed. | must be understood and carefully weighed. | |||
If a flag parenthesized list is specified, the flags SHOULD be set in | If a flag parenthesized list is specified, the flags SHOULD be set in | |||
the resulting message; otherwise, the flag list of the resulting | the resulting message; otherwise, the flag list of the resulting | |||
message is set to empty by default. | message is set to "empty" by default. | |||
If a date-time is specified, the internal date SHOULD be set in the | If a date-time is specified, the internal date SHOULD be set in the | |||
resulting message; otherwise, the internal date of the resulting | resulting message; otherwise, the internal date of the resulting | |||
message is set to the current date and time by default. | message is set to the current date and time by default. | |||
If the append is unsuccessful for any reason, the mailbox MUST be | If the append is unsuccessful for any reason, the mailbox MUST 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 appending is | keeping the changed mailbox's UIDNEXT value); no partial appending is | |||
permitted. | permitted. | |||
If the destination mailbox does not exist, a server MUST return an | If the destination mailbox does not exist, a server MUST return an | |||
error, and MUST NOT automatically create the mailbox. Unless it is | error and MUST NOT automatically create the mailbox. Unless it is | |||
certain that the destination mailbox can not be created, the server | certain that the destination mailbox cannot be created, the server | |||
MUST send the response code "[TRYCREATE]" as the prefix of the text | MUST send the response code "[TRYCREATE]" as the prefix of the text | |||
of the tagged NO response. This gives a hint to the client that it | of the tagged NO response. This gives a hint to the client that it | |||
can attempt a CREATE command and retry the APPEND if the CREATE is | can attempt a CREATE command and retry the APPEND if the CREATE is | |||
successful. | successful. | |||
On successful completion of an APPEND, the server returns an | On successful completion of an APPEND, the server returns an | |||
APPENDUID response code (see Section 7.1), unless specified otherwise | APPENDUID response code (see Section 7.1), unless otherwise specified | |||
below. | below. | |||
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 server | can APPEND to the mailbox, but not SELECT or EXAMINE it, the server | |||
MUST NOT send an APPENDUID response code as it would disclose | MUST NOT send an APPENDUID response code as it would disclose | |||
information about the mailbox. | information about the mailbox. | |||
In the case of a mailbox that has UIDNOTSTICKY status (see | In the case of a mailbox that has UIDNOTSTICKY status (see | |||
Section 7.1), the server MAY omit the APPENDUID response code as it | Section 7.1), the server MAY omit the APPENDUID response code as it | |||
is not meaningful. | is not meaningful. | |||
If the mailbox is currently selected, the normal new message actions | If the mailbox is currently selected, normal new message actions | |||
SHOULD occur. Specifically, the server SHOULD notify the client | SHOULD occur. Specifically, the server SHOULD notify the client | |||
immediately via an untagged EXISTS response. If the server does not | immediately via an untagged EXISTS response. If the server does not | |||
do so, the client MAY issue a NOOP command after one or more APPEND | do so, the client MAY issue a NOOP command after one or more APPEND | |||
commands. | commands. | |||
If the server decides to convert (normalize) the mailbox name, it | If the server decides to convert (normalize) the mailbox name, it | |||
SHOULD return an untagged LIST with OLDNAME extended data item, with | SHOULD return an untagged LIST with an OLDNAME extended data item, | |||
the OLDNAME value being the supplied mailbox name and the name | with the OLDNAME value being the supplied mailbox name and the name | |||
parameter being the normalized mailbox name. (See Section 6.3.9.7 | parameter being the normalized mailbox name. (See Section 6.3.9.7 | |||
for more details.) | for more details.) | |||
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 | ||||
Example: C: A003 APPEND saved-messages (\Seen) {297+} | Example: | |||
C: Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST) | ||||
C: From: Fred Foobar <foobar@example.com> | C: A003 APPEND saved-messages (\Seen) {326} | |||
C: Subject: afternoon meeting | S: + Ready for literal data | |||
C: To: mooch@example.com | C: Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST) | |||
C: Message-Id: <B27397-0100000@example.com> | C: From: Fred Foobar <foobar@Blurdybloop.example> | |||
C: MIME-Version: 1.0 | C: Subject: afternoon meeting | |||
C: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII | C: To: mooch@owatagu.siam.edu.example | |||
C: | C: Message-Id: <B27397-0100000@Blurdybloop.example> | |||
C: Hello Joe, do you think we can meet at 3:30 tomorrow? | C: MIME-Version: 1.0 | |||
C: | C: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII | |||
S: A003 OK [APPENDUID 38505 3955] APPEND completed | C: | |||
C: A004 COPY 2:4 meeting | C: Hello Joe, do you think we can meet at 3:30 tomorrow? | |||
S: A004 OK [COPYUID 38505 304,319:320 3956:3958] Done | C: | |||
C: A005 UID COPY 305:310 meeting | S: A003 OK APPEND completed | |||
S: A005 OK No matching messages, so nothing copied | ||||
C: A006 COPY 2 funny | Example: | |||
S: A006 OK Done | ||||
C: A007 SELECT funny | C: A003 APPEND saved-messages (\Seen) {297+} | |||
S: * 1 EXISTS | C: Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST) | |||
S: * OK [UIDVALIDITY 3857529045] Validity session-only | C: From: Fred Foobar <foobar@example.com> | |||
S: * OK [UIDNEXT 2] Predicted next UID | C: Subject: afternoon meeting | |||
S: * NO [UIDNOTSTICKY] Non-persistent UIDs | C: To: mooch@example.com | |||
S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) | C: Message-Id: <B27397-0100000@example.com> | |||
S: * OK [PERMANENTFLAGS (\Deleted \Seen)] Limited | C: MIME-Version: 1.0 | |||
S: * LIST () "." funny | C: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII | |||
S: A007 OK [READ-WRITE] SELECT completed | 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 | ||||
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 | 319; therefore, UIDs 305 through 310 do not exist (refer to | |||
Section 2.3.1.1 for further explanation). A006 is an example of a | Section 2.3.1.1 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. | |||
Note: The APPEND command is not used for message delivery, because | | Note: The APPEND command is not used for message delivery, | |||
it does not provide a mechanism to transfer [SMTP] envelope | | because it does not provide a mechanism to transfer [SMTP] | |||
information. | | envelope information. | |||
6.3.13. IDLE Command | 6.3.13. IDLE Command | |||
Arguments: none | Arguments: none | |||
Responses: continuation data will be requested; the client sends the | Responses: continuation data will be requested; the client sends | |||
continuation data "DONE" to end the command | the continuation data "DONE" to end the command | |||
Result: OK - IDLE completed after client sent "DONE" | Result: OK - IDLE completed after client sent "DONE" | |||
NO - failure: the server will not allow the IDLE command | NO - failure: the server will not allow the IDLE | |||
at this time | command at this time | |||
BAD - command unknown or arguments invalid | BAD - command unknown or arguments invalid | |||
Without the IDLE command a client would need to poll the server for | Without the IDLE command, a client would need to poll the server for | |||
changes to the selected mailbox (new mail, deletions, flag changes). | changes to the selected mailbox (new mail, deletions, and flag | |||
It's often more desirable to have the server transmit updates to the | changes). It's often more desirable to have the server transmit | |||
client in real time. This allows a user to see new mail immediately. | updates to the client in real time. This allows a user to see new | |||
The IDLE command allows a client to tell the server that it's ready | mail immediately. The IDLE command allows a client to tell the | |||
to accept such real-time updates. | server that it's ready to accept such real-time updates. | |||
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 server | client is ready to accept unsolicited update messages. The server | |||
requests a response to the IDLE command using the continuation ("+") | requests a response to the IDLE command using the continuation ("+") | |||
response. The IDLE command remains active until the client responds | response. The IDLE command remains active until the client responds | |||
to the continuation, and as long as an IDLE command is active, the | to the continuation, and as long as an IDLE command is active, the | |||
server is now free to send untagged EXISTS, EXPUNGE, FETCH, and other | server is now free to send untagged EXISTS, EXPUNGE, FETCH, and other | |||
responses at any time. If the server chooses to send unsolicited | responses at any time. If the server chooses to send unsolicited | |||
FETCH responses, they MUST include UID FETCH item. | FETCH responses, they MUST include a UID FETCH item. | |||
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 MAY send any | |||
remaining queued untagged responses and then MUST immediately send | remaining queued untagged responses and then MUST immediately 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 command | commands. As for other commands, the processing of any new command | |||
may cause the sending of unsolicited untagged responses, subject to | may cause the sending of unsolicited untagged responses, subject to | |||
the ambiguity limitations. The client MUST NOT send a command while | the ambiguity limitations. The client MUST NOT send a command while | |||
the server is waiting for the DONE, since the server will not be able | the server is waiting for the DONE, since the server will not be able | |||
to distinguish a command from a continuation. | to distinguish a command from a continuation. | |||
The server MAY consider a client inactive if it has an IDLE command | The server MAY consider a client inactive if it has an IDLE 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 MAY 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 re- | of that, clients using IDLE are advised to terminate IDLE and reissue | |||
issue it at least every 29 minutes to avoid being logged off. This | it at least every 29 minutes to avoid being logged off. This still | |||
still allows a client to receive immediate mailbox updates even | allows a client to receive immediate mailbox updates even though it | |||
though it need only "poll" at half hour intervals. | need only "poll" at half hour intervals. | |||
Example: C: A001 SELECT INBOX | Example: | |||
S: * FLAGS (\Deleted \Seen \Flagged) | ||||
S: * OK [PERMANENTFLAGS (\Deleted \Seen \Flagged)] Limited | C: A001 SELECT INBOX | |||
S: * 3 EXISTS | S: * FLAGS (\Deleted \Seen \Flagged) | |||
S: * OK [UIDVALIDITY 1] | S: * OK [PERMANENTFLAGS (\Deleted \Seen \Flagged)] Limited | |||
S: * OK [UIDNEXT 1] | S: * 3 EXISTS | |||
S: * LIST () "/" INBOX | S: * OK [UIDVALIDITY 1] | |||
S: A001 OK [READ-WRITE] SELECT completed | S: * OK [UIDNEXT 1] | |||
C: A002 IDLE | S: * LIST () "/" INBOX | |||
S: + idling | S: A001 OK [READ-WRITE] SELECT completed | |||
...time passes; new mail arrives... | C: A002 IDLE | |||
S: * 4 EXISTS | S: + idling | |||
C: DONE | ...time passes; new mail arrives... | |||
S: A002 OK IDLE terminated | S: * 4 EXISTS | |||
...another client expunges message 2 now... | C: DONE | |||
C: A003 FETCH 4 ALL | S: A002 OK IDLE terminated | |||
S: * 4 FETCH (...) | ...another client expunges message 2 now... | |||
S: A003 OK FETCH completed | C: A003 FETCH 4 ALL | |||
C: A004 IDLE | S: * 4 FETCH (...) | |||
S: * 2 EXPUNGE | S: A003 OK FETCH completed | |||
S: * 3 EXISTS | C: A004 IDLE | |||
S: + idling | S: * 2 EXPUNGE | |||
...time passes; another client expunges message 3... | S: * 3 EXISTS | |||
S: * 3 EXPUNGE | S: + idling | |||
S: * 2 EXISTS | ...time passes; another client expunges message 3... | |||
...time passes; new mail arrives... | S: * 3 EXPUNGE | |||
S: * 3 EXISTS | S: * 2 EXISTS | |||
C: DONE | ...time passes; new mail arrives... | |||
S: A004 OK IDLE terminated | S: * 3 EXISTS | |||
C: A005 FETCH 3 ALL | C: DONE | |||
S: * 3 FETCH (...) | S: A004 OK IDLE terminated | |||
S: A005 OK FETCH completed | C: A005 FETCH 3 ALL | |||
C: A006 IDLE | S: * 3 FETCH (...) | |||
S: A005 OK FETCH completed | ||||
C: A006 IDLE | ||||
6.4. Client Commands - Selected State | 6.4. Client Commands - Selected State | |||
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. | |||
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, | and the authenticated state commands (SELECT, EXAMINE, NAMESPACE, | |||
CREATE, DELETE, RENAME, SUBSCRIBE, UNSUBSCRIBE, LIST, STATUS, and | CREATE, 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. | |||
6.4.1. CLOSE Command | 6.4.1. CLOSE Command | |||
Arguments: none | Arguments: none | |||
Responses: no specific responses for this command | Responses: no specific responses for this command | |||
Result: OK - close completed, now in authenticated state | Result: OK - close completed, now in authenticated state | |||
BAD - command unknown or arguments invalid | BAD - command unknown or arguments invalid | |||
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 to | \Deleted flag set from the currently selected mailbox, and it returns | |||
the authenticated state from the selected state. No untagged EXPUNGE | to the authenticated state from the selected state. No untagged | |||
responses are sent. | EXPUNGE responses are sent. | |||
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. | |||
Even if a mailbox is selected, a SELECT, EXAMINE, or LOGOUT command | Even if a mailbox is selected, a SELECT, EXAMINE, or LOGOUT command | |||
MAY be issued without previously issuing a CLOSE command. The | MAY be issued without previously issuing a CLOSE command. The | |||
SELECT, EXAMINE, and LOGOUT commands implicitly close the currently | SELECT, EXAMINE, and LOGOUT commands implicitly close the currently | |||
selected mailbox without doing an expunge. However, when many | selected mailbox without doing an expunge. However, when many | |||
messages are deleted, a CLOSE-LOGOUT or CLOSE-SELECT sequence is | messages are deleted, a CLOSE-LOGOUT or CLOSE-SELECT sequence is | |||
considerably faster than an EXPUNGE-LOGOUT or EXPUNGE-SELECT because | considerably faster than an EXPUNGE-LOGOUT or EXPUNGE-SELECT because | |||
no untagged EXPUNGE responses (which the client would probably | no untagged EXPUNGE responses (which the client would probably | |||
ignore) are sent. | ignore) are sent. | |||
Example: C: A341 CLOSE | Example: | |||
S: A341 OK CLOSE completed | ||||
C: A341 CLOSE | ||||
S: A341 OK CLOSE completed | ||||
6.4.2. UNSELECT Command | 6.4.2. UNSELECT Command | |||
Arguments: none | Arguments: none | |||
Responses: no specific responses for this command | Responses: no specific responses for this command | |||
Result: OK - unselect completed, now in authenticated state | Result: OK - unselect completed, now in authenticated state | |||
BAD - no mailbox selected, or argument supplied but none | BAD - no mailbox selected, or argument supplied but | |||
permitted | none permitted | |||
The UNSELECT command frees session's resources associated with the | The UNSELECT command frees a session's resources associated with the | |||
selected mailbox and returns the server to the authenticated state. | selected mailbox and returns the server to the authenticated state. | |||
This command performs the same actions as CLOSE, except that no | This command performs the same actions as CLOSE, except that no | |||
messages are permanently removed from the currently selected mailbox. | messages are permanently removed from the currently selected mailbox. | |||
Example: C: A342 UNSELECT | Example: | |||
S: A342 OK Unselect completed | ||||
C: A342 UNSELECT | ||||
S: A342 OK Unselect completed | ||||
6.4.3. EXPUNGE Command | 6.4.3. EXPUNGE Command | |||
Arguments: none | Arguments: none | |||
Responses: untagged responses: EXPUNGE | Responses: untagged responses: EXPUNGE | |||
Result: OK - expunge completed | Result: OK - expunge completed | |||
NO - expunge failure: can't expunge (e.g., permission | NO - expunge failure: can't expunge (e.g., permission | |||
denied) | denied) | |||
BAD - command unknown or arguments invalid | BAD - command unknown or arguments invalid | |||
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 sent | returning an OK to the client, an untagged EXPUNGE response is sent | |||
for each message that is removed. | for each message that is removed. | |||
Example: C: A202 EXPUNGE | Example: | |||
S: * 3 EXPUNGE | ||||
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 | |||
S: * 8 EXPUNGE | ||||
S: A202 OK EXPUNGE completed | ||||
Note: In this example, messages 3, 4, 7, and 11 had the \Deleted flag | Note: In this example, messages 3, 4, 7, and 11 had the \Deleted flag | |||
set. See the description of the EXPUNGE response (Section 7.5.1) for | set. See the description of the EXPUNGE response (Section 7.5.1) for | |||
further explanation. | further explanation. | |||
6.4.4. SEARCH Command | 6.4.4. SEARCH Command | |||
Arguments: OPTIONAL result specifier | Arguments: OPTIONAL result specifier | |||
OPTIONAL [CHARSET] specification | ||||
searching criteria (one or more) | ||||
Responses: OPTIONAL untagged response: ESEARCH | OPTIONAL [CHARSET] specification | |||
Result: OK - search completed | searching criteria (one or more) | |||
NO - search error: can't search that [CHARSET] or | ||||
criteria | Responses: OPTIONAL untagged response: ESEARCH | |||
BAD - command unknown or arguments invalid | ||||
Result: OK - search completed | ||||
NO - search error: can't search that [CHARSET] or | ||||
criteria | ||||
BAD - command unknown or arguments invalid | ||||
The SEARCH command searches the mailbox for messages that match the | The SEARCH command searches the mailbox for messages that match the | |||
given searching criteria. | given searching criteria. | |||
The SEARCH command may contain result options. Result options | The SEARCH command may contain result options. Result options | |||
control what kind of information is returned about messages matching | control what kind of information is returned about messages matching | |||
the search criteria in an untagged ESEARCH response. If no result | the search criteria in an untagged ESEARCH response. If no result | |||
option is specified or empty list of options is specified "()", ALL | option is specified or empty list of options is specified as "()", | |||
is assumed (see below). The order of individual options is | ALL is assumed (see below). The order of individual options is | |||
arbitrary. Individual options may contain parameters enclosed in | arbitrary. Individual options may contain parameters enclosed in | |||
parentheses. (However, if an option has a mandatory parameter, which | parentheses. (However, if an option has a mandatory parameter, which | |||
can always be represented as a number or a sequence-set, the option | can always be represented as a number or a sequence-set, the option | |||
parameter does not need the enclosing parentheses. See the Formal | parameter does not need the enclosing parentheses. See "Formal | |||
Syntax (Section 9) for more details). If an option has parameters, | Syntax" (Section 9) for more details.) If an option has parameters, | |||
they consist of atoms and/or strings and/or lists in a specific | they consist of atoms and/or strings and/or lists in a specific | |||
order. Any options not defined by extensions that the server | order. Any options not defined by extensions that the server | |||
supports MUST be rejected with a BAD response. | supports MUST be rejected with a BAD response. | |||
Note that IMAP4rev1 used SEARCH responses [RFC3501] instead of | Note that IMAP4rev1 used SEARCH responses [RFC3501] instead of | |||
ESEARCH responses. IMAP4rev2-only clients MUST ignore SEARCH | ESEARCH responses. Clients that support only IMAP4rev2 MUST ignore | |||
responses. | SEARCH responses. | |||
This document specifies the following result options: | This document specifies the following result options: | |||
MIN | MIN | |||
Return the lowest message number/UID that satisfies the SEARCH | ||||
criteria. | ||||
Return the lowest message number/UID that satisfies the SEARCH | If the SEARCH results in no matches, the server MUST NOT include | |||
criteria. | the MIN result option in the ESEARCH response; however, it still | |||
MUST send the ESEARCH response. | ||||
If the SEARCH results in no matches, the server MUST NOT | ||||
include the MIN result option in the ESEARCH response; however, | ||||
it still MUST send the ESEARCH response. | ||||
MAX | MAX | |||
Return the highest message number/UID that satisfies the SEARCH | ||||
criteria. | ||||
Return the highest message number/UID that satisfies the SEARCH | If the SEARCH results in no matches, the server MUST NOT include | |||
criteria. | the MAX result option in the ESEARCH response; however, it still | |||
MUST send the ESEARCH response. | ||||
If the SEARCH results in no matches, the server MUST NOT | ||||
include the MAX result option in the ESEARCH response; however, | ||||
it still MUST send the ESEARCH response. | ||||
ALL | ALL | |||
Return all message numbers/UIDs that satisfy the SEARCH criteria | ||||
using the sequence-set syntax. Note that the client MUST NOT | ||||
assume that messages/UIDs will be listed in any particular order. | ||||
Return all message numbers/UIDs that satisfy the SEARCH | If the SEARCH results in no matches, the server MUST NOT include | |||
criteria using the sequence-set syntax. Note, the client MUST | the ALL result option in the ESEARCH response; however, it still | |||
NOT assume that messages/UIDs will be listed in any particular | MUST send the ESEARCH response. | |||
order. | ||||
If the SEARCH results in no matches, the server MUST NOT | ||||
include the ALL result option in the ESEARCH response; however, | ||||
it still MUST send the ESEARCH response. | ||||
COUNT Return the number of messages that satisfy the SEARCH | COUNT | |||
criteria. This result option MUST always be included in the | Return the number of messages that satisfy the SEARCH criteria. | |||
ESEARCH response. | This result option MUST always be included in the ESEARCH | |||
response. | ||||
SAVE | SAVE | |||
This option tells the server to remember the result of the SEARCH | ||||
or UID SEARCH command (as well as any command based on SEARCH, | ||||
e.g., SORT and THREAD [RFC5256]) and store it in an internal | ||||
variable that we will reference as the "search result variable". | ||||
The client can use the "$" marker to reference the content of this | ||||
internal variable. The "$" marker can be used instead of message | ||||
sequence or UID sequence in order to indicate that the server | ||||
should substitute it with the list of messages from the search | ||||
result variable. Thus, the client can use the result of the | ||||
latest remembered SEARCH command as a parameter to another | ||||
command. See Section 6.4.4.1 for details on how the value of the | ||||
search result variable is determined, how it is affected by other | ||||
commands executed, and how the SAVE return option interacts with | ||||
other return options. | ||||
This option tells the server to remember the result of the | In absence of any other SEARCH result option, the SAVE result | |||
SEARCH or UID SEARCH command (as well as any command based on | option also suppresses any ESEARCH response that would have been | |||
SEARCH, e.g., SORT and THREAD [RFC5256]>) and store it in an | otherwise returned by the SEARCH command. | |||
internal variable that we will reference as the "search result | ||||
variable". The client can use the "$" marker to reference the | ||||
content of this internal variable. The "$" marker can be used | ||||
instead of message sequence or UID sequence in order to | ||||
indicate that the server should substitute it with the list of | ||||
messages from the search result variable. Thus, the client can | ||||
use the result of the latest remembered SEARCH command as a | ||||
parameter to another command. See Section 6.4.4.1 for details | ||||
on how the value of the search result variable is determined, | ||||
how it is affected by other commands executed, and how SAVE | ||||
return option interacts with other return options. | ||||
In absence of any other SEARCH result option, the SAVE result | ||||
option also suppresses any ESEARCH response that would have | ||||
been otherwise returned by the SEARCH command. | ||||
Note: future extensions to this document can allow servers to return | Note: future extensions to this document can allow servers to return | |||
multiple ESEARCH responses for a single extended SEARCH command. | multiple ESEARCH responses for a single extended SEARCH command. | |||
However all options specified above MUST result in a single ESEARCH | However, all options specified above MUST result in a single ESEARCH | |||
response if used by themselves or in combination. This guarantee | response if used by themselves or in combination. This guarantee | |||
simplifies processing in IMAP4rev2 clients. Future SEARCH extensions | simplifies processing in IMAP4rev2 clients. Future SEARCH extensions | |||
that relax this restriction will have to describe how results from | that relax this restriction will have to describe how results from | |||
multiple ESEARCH responses are to be combined. | multiple ESEARCH responses are to be combined. | |||
Searching criteria consist of one or more search keys. | Searching criteria consist of one or more search keys. | |||
When multiple keys are specified, the result is the intersection (AND | When multiple keys are specified, the result is the intersection (AND | |||
function) of all the messages that match those keys. For example, | function) of all the messages that match those keys. For example, | |||
the criteria DELETED FROM "SMITH" SINCE 1-Feb-1994 refers to all | the criteria DELETED FROM "SMITH" SINCE 1-Feb-1994 refers to all | |||
deleted messages from Smith with INTERNALDATE greater than February | deleted messages from Smith with INTERNALDATE greater than February | |||
1, 1994. A search key can also be a parenthesized list of one or | 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 keys). | more search keys (e.g., for use with the OR and NOT keys). | |||
Server implementations MAY exclude [MIME-IMB] body parts with | Server implementations MAY exclude [MIME-IMB] body parts with | |||
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. | |||
The OPTIONAL [CHARSET] specification consists of the word "CHARSET" | The OPTIONAL [CHARSET] specification consists of the word "CHARSET" | |||
followed by a registered [CHARSET] [CHARSET-REG]. It indicates the | followed by the name of a character set from the registry | |||
[CHARSET-REG]. It indicates the [CHARSET] of the strings that appear | ||||
[CHARSET] of the strings that appear in the search criteria. | in the search criteria. [MIME-IMB] content transfer encodings and | |||
[MIME-IMB] content transfer encodings, and [MIME-HDRS] strings in | [MIME-HDRS] strings in [RFC5322]/[MIME-IMB] headers MUST be decoded | |||
[RFC-5322]/[MIME-IMB] headers, MUST be decoded before comparing text. | before comparing text. Servers MUST support US-ASCII and UTF-8 | |||
Servers MUST support US-ASCII and UTF-8 charsets; other [CHARSET]s | charsets; other CHARSETs MAY be supported. Clients SHOULD use UTF-8. | |||
MAY be supported. Clients SHOULD use UTF-8. Note that if "CHARSET" | Note that if CHARSET is not provided, IMAP4rev2 servers MUST assume | |||
is not provided IMAP4rev2 servers MUST assume UTF-8, so selecting | UTF-8, so selecting CHARSET UTF-8 is redundant. It is permitted for | |||
CHARSET UTF-8 is redundant. It is permitted for improved | improved compatibility with existing IMAP4rev1 clients. | |||
compatibility with existing IMAP4rev1 clients. | ||||
If the server does not support the specified [CHARSET], it MUST | If the server does not support the specified [CHARSET], it MUST | |||
return a tagged NO response (not a BAD). This response SHOULD | return a tagged NO response (not a BAD). This response SHOULD | |||
contain the BADCHARSET response code, which MAY list the [CHARSET]s | contain the BADCHARSET response code, which MAY list the CHARSETs | |||
supported by the server. | supported by the server. | |||
In all search keys that use strings and unless specified otherwise, a | In all search keys that use strings, and unless otherwise specified, | |||
message matches the key if the string is a substring of the | a message matches the key if the string is a substring of the | |||
associated text. The matching SHOULD be case-insensitive for | associated text. The matching SHOULD be case insensitive for | |||
characters within ASCII range. Consider using [IMAP-I18N] for | characters within the ASCII range. Consider using [IMAP-I18N] for | |||
language-sensitive case-insensitive searching. Note that the empty | language-sensitive, case-insensitive searching. Note that the empty | |||
string is a substring; this is useful when doing a HEADER search in | string is a substring; this is useful when performing a HEADER search | |||
order to test for a header field presence in the message. | in order to test for a header field presence in the message. | |||
The defined search keys are as follows. Refer to the Formal Syntax | The defined search keys are as follows. Refer to "Formal Syntax" | |||
section for the precise syntactic definitions of the arguments. | (Section 9) for the precise syntactic definitions of the arguments. | |||
<sequence set> Messages with message sequence numbers corresponding | <sequence set> | |||
to the specified message sequence number set. | Messages with message sequence numbers corresponding to the | |||
specified message sequence number set. | ||||
ALL All messages in the mailbox; the default initial key for ANDing. | ALL | |||
All messages in the mailbox; the default initial key for ANDing. | ||||
ANSWERED Messages with the \Answered flag set. | ANSWERED | |||
Messages with the \Answered flag set. | ||||
BCC <string> Messages that contain the specified string in the | BCC <string> | |||
envelope structure's BCC field. | Messages that contain the specified string in the envelope | |||
structure's Blind Carbon Copy (BCC) field. | ||||
BEFORE <date> Messages whose internal date (disregarding time and | BEFORE <date> | |||
timezone) is earlier than the specified date. | Messages whose internal date (disregarding time and timezone) is | |||
earlier than the specified date. | ||||
BODY <string> Messages that contain the specified string in the body | BODY <string> | |||
of the message. Unlike TEXT (see below), this doesn't match any | Messages that contain the specified string in the body of the | |||
header fields. Servers are allowed to implement flexible matching | message. Unlike TEXT (see below), this doesn't match any header | |||
for this search key, for example matching "swim" to both "swam" | fields. Servers are allowed to implement flexible matching for | |||
and "swum" in English language text or only doing full word | this search key, for example, by matching "swim" to both "swam" | |||
and "swum" in English language text or only performing full word | ||||
matching (where "swim" will not match "swimming"). | matching (where "swim" will not match "swimming"). | |||
CC <string> Messages that contain the specified string in the | CC <string> | |||
envelope structure's CC field. | Messages that contain the specified string in the envelope | |||
structure's CC field. | ||||
DELETED Messages with the \Deleted flag set. | ||||
DRAFT Messages with the \Draft flag set. | DELETED | |||
Messages with the \Deleted flag set. | ||||
FLAGGED Messages with the \Flagged flag set. | DRAFT | |||
Messages with the \Draft flag set. | ||||
FROM <string> Messages that contain the specified string in the | FLAGGED | |||
envelope structure's FROM field. | Messages with the \Flagged flag set. | |||
HEADER <field-name> <string> Messages that have a header field with | FROM <string> | |||
the specified field-name (as defined in [RFC-5322]) and that | Messages that contain the specified string in the envelope | |||
contains the specified string in the text of the header field | structure's FROM field. | |||
(what comes after the colon). If the string to search is zero- | ||||
length, this matches all messages that have a header field with | ||||
the specified field-name regardless of the contents. Servers | ||||
should use substring search for this SEARCH item, as clients can | ||||
use it for automatic processing not initiated by end users. For | ||||
example this can be used for searching for Message-ID or Content- | ||||
Type header field values that need to be exact, or for searches in | ||||
header fields that the IMAP server might not know anything about. | ||||
KEYWORD <flag> Messages with the specified keyword flag set. | HEADER <field-name> <string> | |||
Messages that have a header field with the specified field-name | ||||
(as defined in [RFC5322]) and that contain the specified string 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 | ||||
have a header field with the specified field-name regardless of | ||||
the contents. Servers should use a substring search for this | ||||
SEARCH item, as clients can use it for automatic processing not | ||||
initiated by end users. For example, this can be used when | ||||
searching for Message-ID or Content-Type header field values that | ||||
need to be exact or for searches in header fields that the IMAP | ||||
server might not know anything about. | ||||
LARGER <n> Messages with an [RFC-5322] size larger than the | KEYWORD <flag> | |||
specified number of octets. | Messages with the specified keyword flag set. | |||
NOT <search-key> Messages that do not match the specified search | LARGER <n> | |||
key. | Messages with an RFC822.SIZE larger than the specified number of | |||
octets. | ||||
ON <date> Messages whose internal date (disregarding time and | NOT <search-key> | |||
timezone) is within the specified date. | Messages that do not match the specified search key. | |||
OR <search-key1> <search-key2> Messages that match either search | ON <date> | |||
key. | Messages whose internal date (disregarding time and timezone) is | |||
within the specified date. | ||||
SEEN Messages that have the \Seen flag set. | OR <search-key1> <search-key2> | |||
Messages that match either search key. | ||||
SENTBEFORE <date> Messages whose [RFC-5322] Date: header field | SEEN | |||
(disregarding time and timezone) is earlier than the specified | Messages that have the \Seen flag set. | |||
date. | ||||
SENTON <date> Messages whose [RFC-5322] Date: header field | SENTBEFORE <date> | |||
(disregarding time and timezone) is within the specified date. | Messages whose [RFC5322] Date: header field (disregarding time and | |||
timezone) is earlier than the specified date. | ||||
SENTSINCE <date> Messages whose [RFC-5322] Date: header field | SENTON <date> | |||
(disregarding time and timezone) is within or later than the | Messages whose [RFC5322] Date: header field (disregarding time and | |||
specified date. | timezone) is within the specified date. | |||
SINCE <date> Messages whose internal date (disregarding time and | SENTSINCE <date> | |||
Messages whose [RFC5322] Date: header field (disregarding time and | ||||
timezone) is within or later than the specified date. | timezone) is within or later than the specified date. | |||
SMALLER <n> Messages with an [RFC-5322] size smaller than the | SINCE <date> | |||
specified number of octets. | Messages whose internal date (disregarding time and timezone) is | |||
within or later than the specified date. | ||||
SUBJECT <string> Messages that contain the specified string in the | SMALLER <n> | |||
envelope structure's SUBJECT field. | Messages with an RFC822.SIZE smaller than the specified number of | |||
octets. | ||||
TEXT <string> Messages that contain the specified string in the | SUBJECT <string> | |||
header (including MIME header fields) or body of the message. | Messages that contain the specified string in the envelope | |||
Servers are allowed to implement flexible matching for this search | structure's SUBJECT field. | |||
key, for example matching "swim" to both "swam" and "swum" in | ||||
English language text or only doing full word matching (where | ||||
"swim" will not match "swimming"). | ||||
TO <string> Messages that contain the specified string in the | TEXT <string> | |||
envelope structure's TO field. | Messages that contain the specified string in the header | |||
(including MIME header fields) or body of the message. Servers | ||||
are allowed to implement flexible matching for this search key, | ||||
for example, matching "swim" to both "swam" and "swum" in English | ||||
language text or only performing full-word matching (where "swim" | ||||
will not match "swimming"). | ||||
UID <sequence set> Messages with unique identifiers corresponding to | TO <string> | |||
the specified unique identifier set. Sequence set ranges are | Messages that contain the specified string in the envelope | |||
permitted. | structure's TO field. | |||
UNANSWERED Messages that do not have the \Answered flag set. | UID <sequence set> | |||
Messages with unique identifiers corresponding to the specified | ||||
unique identifier set. Sequence-set ranges are permitted. | ||||
UNDELETED Messages that do not have the \Deleted flag set. | UNANSWERED | |||
Messages that do not have the \Answered flag set. | ||||
UNDRAFT Messages that do not have the \Draft flag set. | UNDELETED | |||
Messages that do not have the \Deleted flag set. | ||||
UNFLAGGED Messages that do not have the \Flagged flag set. | UNDRAFT | |||
Messages that do not have the \Draft flag set. | ||||
UNKEYWORD <flag> Messages that do not have the specified keyword | UNFLAGGED | |||
flag set. | Messages that do not have the \Flagged flag set. | |||
UNSEEN Messages that do not have the \Seen flag set. | UNKEYWORD <flag> | |||
Messages that do not have the specified keyword flag set. | ||||
Example: C: A282 SEARCH RETURN (MIN COUNT) FLAGGED | UNSEEN | |||
SINCE 1-Feb-1994 NOT FROM "Smith" | Messages that do not have the \Seen flag set. | |||
S: * ESEARCH (TAG "A282") MIN 2 COUNT 3 | ||||
S: A282 OK SEARCH completed | ||||
Example: C: A283 SEARCH RETURN () FLAGGED | Example: | |||
SINCE 1-Feb-1994 NOT FROM "Smith" | ||||
S: * ESEARCH (TAG "A283") ALL 2,10:11 | ||||
S: A283 OK SEARCH completed | ||||
Example: C: A284 SEARCH TEXT "string not in mailbox" | C: A282 SEARCH RETURN (MIN COUNT) FLAGGED | |||
S: * ESEARCH (TAG "A284") | SINCE 1-Feb-1994 NOT FROM "Smith" | |||
S: A284 OK SEARCH completed | S: * ESEARCH (TAG "A282") MIN 2 COUNT 3 | |||
C: A285 SEARCH CHARSET UTF-8 TEXT {6} | S: A282 OK SEARCH completed | |||
S: + Ready for literal text | ||||
C: XXXXXX | ||||
S: * ESEARCH (TAG "A285") ALL 43 | ||||
S: A285 OK SEARCH completed | ||||
Note: Since this document is restricted to 7-bit ASCII text, it is | Example: | |||
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 | C: A283 SEARCH RETURN () FLAGGED | |||
transaction. | SINCE 1-Feb-1994 NOT FROM "Smith" | |||
S: * ESEARCH (TAG "A283") ALL 2,10:11 | ||||
S: A283 OK SEARCH completed | ||||
Example: | ||||
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 | ||||
The following example demonstrates finding the first unseen message | The following example demonstrates finding the first unseen message | |||
in the mailbox: | in the mailbox: | |||
Example: C: A284 SEARCH RETURN (MIN) UNSEEN | Example: | |||
S: * ESEARCH (TAG "A284") MIN 4 | ||||
S: A284 OK SEARCH completed | C: A284 SEARCH RETURN (MIN) UNSEEN | |||
S: * ESEARCH (TAG "A284") MIN 4 | ||||
S: A284 OK SEARCH completed | ||||
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. | |||
Example: C: A285 UID SEARCH RETURN (MIN MAX) 1:5000 | Example: | |||
S: * ESEARCH (TAG "A285") UID MIN 7 MAX 3800 | ||||
S: A285 OK SEARCH completed | C: A285 UID SEARCH RETURN (MIN MAX) 1:5000 | |||
S: * ESEARCH (TAG "A285") UID MIN 7 MAX 3800 | ||||
S: A285 OK SEARCH completed | ||||
The following example demonstrates returning the number of deleted | The following example demonstrates returning the number of deleted | |||
messages: | messages: | |||
Example: C: A286 SEARCH RETURN (COUNT) DELETED | Example: | |||
S: * ESEARCH (TAG "A286") COUNT 15 | ||||
S: A286 OK SEARCH completed | ||||
6.4.4.1. SAVE result option and SEARCH result variable | C: A286 SEARCH RETURN (COUNT) DELETED | |||
S: * ESEARCH (TAG "A286") COUNT 15 | ||||
S: A286 OK SEARCH completed | ||||
6.4.4.1. SAVE Result Option and SEARCH Result Variable | ||||
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. | |||
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. | |||
Any of the following SEARCH commands MUST NOT change the search | Any of the following SEARCH commands MUST NOT change the search | |||
result variable: | result variable: | |||
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, | |||
a SEARCH command with no SAVE result option that caused the server | a SEARCH command with no SAVE result option that caused the server | |||
to return NO tagged response, | to return NO tagged response, and | |||
a successful SEARCH command with no SAVE result option. | a successful SEARCH command with no SAVE result option. | |||
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. | |||
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 | MUST automatically adjust them when notifying the client about | |||
expunged messages, as described in Section 7.5.1. | expunged messages, as described in Section 7.5.1. | |||
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. | |||
Note that even if the "$" marker contains the empty sequence of | Note that even if the "$" marker contains the empty sequence of | |||
messages, it must be treated by all commands accepting message sets | messages, it must be treated by all commands accepting message sets | |||
as parameters as a valid, but non-matching list of messages. For | as 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 Section 6.4.4.4. | no FETCH responses. See also Example 5 in Section 6.4.4.4. | |||
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. | |||
When the SAVE result option is combined with the MIN or MAX result | When the SAVE result option is combined with the MIN or MAX result | |||
option, and both ALL and COUNT result options are absent, the | option, and both ALL and COUNT result options are absent, the | |||
corresponding MIN/MAX is returned (if the search result is not | corresponding MIN/MAX is returned (if the search result is not | |||
empty), but the "$" marker would contain a single message as returned | empty), but the "$" marker would contain a single message as returned | |||
in the MIN/MAX return item. | in the MIN/MAX return item. | |||
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, the "$" | options, and both ALL and COUNT result options are absent, the "$" | |||
marker would contain zero, one or two messages as returned in the | marker would contain zero messages, one message, or two messages as | |||
MIN/MAX return items. | returned in the MIN/MAX return items. | |||
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. | |||
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. | |||
+------------------------------+--------------------+ | +==============================+====================+ | |||
| Combination of Result option | "$" marker value | | | Combination of Result Option | "$" Marker Value | | |||
+------------------------------+--------------------+ | +==============================+====================+ | |||
| SAVE MIN | MIN | | | SAVE MIN | MIN | | |||
+------------------------------+--------------------+ | ||||
| SAVE MAX | MAX | | | SAVE MAX | MAX | | |||
+------------------------------+--------------------+ | ||||
| SAVE MIN MAX | MIN & MAX | | | SAVE MIN MAX | MIN & MAX | | |||
+------------------------------+--------------------+ | ||||
| SAVE * [m] | all found messages | | | SAVE * [m] | all found messages | | |||
+------------------------------+--------------------+ | +------------------------------+--------------------+ | |||
Table 4 | ||||
where '*' means "ALL" and/or "COUNT", and '[m]' means optional "MIN" | where '*' means "ALL" and/or "COUNT", and '[m]' means optional "MIN" | |||
and/or "MAX" | and/or "MAX" | |||
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. | |||
6.4.4.2. Multiple Commands in Progress | 6.4.4.2. Multiple Commands in Progress | |||
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 Section 5.5, a server MUST execute the two commands in | directed by Section 5.5, a server MUST execute the two commands in | |||
the order they were received. | the order they were received. | |||
A client MAY pipeline a SEARCH RETURN (SAVE) command with one or more | A client MAY pipeline a SEARCH RETURN (SAVE) command with one or more | |||
command using the "$" marker, as long as this doesn't create an | commands using the "$" marker, as long as this doesn't create an | |||
ambiguity, as described in Section 5.5. Examples 7-9 in | ambiguity, as described in Section 5.5. Examples 7-9 in | |||
Section 6.4.4.4 explain this in more details. | Section 6.4.4.4 explain this in more details. | |||
6.4.4.3. Refusing to Save Search Results | 6.4.4.3. Refusing to Save Search Results | |||
In some cases, the server MAY refuse to save a SEARCH (SAVE) result, | In some cases, the server MAY refuse to save a SEARCH (SAVE) result, | |||
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. In this case, the server MUST return a tagged NO response | reached. In this case, the server MUST return a tagged NO response | |||
containing the NOTSAVED response code and set the search result | containing the NOTSAVED response code and set the search result | |||
variable to the empty sequence, as described in Section 6.4.4.1. | variable to the empty sequence, as described in Section 6.4.4.1. | |||
6.4.4.4. Examples showing use of SAVE result option | 6.4.4.4. Examples Showing Use of the SAVE Result Option | |||
Only in this section: explanatory comments in examples that start | Only in this section: explanatory comments in examples that start | |||
with // are not part of the protocol. | with // are not part of the protocol. | |||
1) The following example demonstrates how the client can use the | 1. The following example demonstrates how the client can use the | |||
result of a SEARCH command to FETCH headers of interesting messages: | result of a SEARCH command to FETCH headers of interesting | |||
messages: | ||||
Example 1: | Example 1: | |||
C: A282 SEARCH RETURN (SAVE) FLAGGED SINCE 1-Feb-1994 | ||||
NOT FROM "Smith" | ||||
S: A282 OK SEARCH completed, result saved | ||||
C: A283 FETCH $ (UID INTERNALDATE FLAGS BODY.PEEK[HEADER]) | ||||
S: * 2 FETCH (UID 14 ... | ||||
S: * 84 FETCH (UID 100 ... | ||||
S: * 882 FETCH (UID 1115 ... | ||||
S: A283 OK completed | ||||
The client can also pipeline the two commands: | C: A282 SEARCH RETURN (SAVE) FLAGGED SINCE 1-Feb-1994 | |||
NOT FROM "Smith" | ||||
S: A282 OK SEARCH completed, result saved | ||||
C: A283 FETCH $ (UID INTERNALDATE FLAGS BODY.PEEK[HEADER]) | ||||
S: * 2 FETCH (UID 14 ... | ||||
S: * 84 FETCH (UID 100 ... | ||||
S: * 882 FETCH (UID 1115 ... | ||||
S: A283 OK completed | ||||
Example 2: | The client can also pipeline the two commands: | |||
C: A282 SEARCH RETURN (SAVE) FLAGGED SINCE 1-Feb-1994 | ||||
NOT FROM "Smith" | ||||
C: A283 FETCH $ (UID INTERNALDATE FLAGS BODY.PEEK[HEADER]) | ||||
S: A282 OK SEARCH completed | ||||
S: * 2 FETCH (UID 14 ... | ||||
S: * 84 FETCH (UID 100 ... | ||||
S: * 882 FETCH (UID 1115 ... | ||||
S: A283 OK completed | ||||
2) The following example demonstrates that the result of one SEARCH | Example 2: | |||
command can be used as input to another SEARCH command: | ||||
Example 3: | C: A282 SEARCH RETURN (SAVE) FLAGGED SINCE 1-Feb-1994 | |||
C: A300 SEARCH RETURN (SAVE) SINCE 1-Jan-2004 | NOT FROM "Smith" | |||
NOT FROM "Smith" | C: A283 FETCH $ (UID INTERNALDATE FLAGS BODY.PEEK[HEADER]) | |||
S: A300 OK SEARCH completed | S: A282 OK SEARCH completed | |||
C: A301 UID SEARCH UID $ SMALLER 4096 | S: * 2 FETCH (UID 14 ... | |||
S: * ESEARCH (TAG "A301") UID ALL 17,900,901 | S: * 84 FETCH (UID 100 ... | |||
S: A301 OK completed | S: * 882 FETCH (UID 1115 ... | |||
S: A283 OK completed | ||||
Note that the second command in Example 3 can be replaced with: | 2. The following example demonstrates that the result of one SEARCH | |||
C: A301 UID SEARCH $ SMALLER 4096 | command can be used as input to another SEARCH command: | |||
and the result of the command would be the same. | ||||
3) The following example shows that the "$" marker can be combined | Example 3: | |||
with other message numbers using the OR SEARCH criterion. | ||||
Example 4: | C: A300 SEARCH RETURN (SAVE) SINCE 1-Jan-2004 | |||
C: P282 SEARCH RETURN (SAVE) SINCE 1-Feb-1994 | NOT FROM "Smith" | |||
NOT FROM "Smith" | S: A300 OK SEARCH completed | |||
S: P282 OK SEARCH completed | C: A301 UID SEARCH UID $ SMALLER 4096 | |||
C: P283 SEARCH CHARSET UTF-8 (OR $ 1,3000:3021) TEXT {8+} | S: * ESEARCH (TAG "A301") UID ALL 17,900,901 | |||
C: YYYYYYYY | S: A301 OK completed | |||
S: * ESEARCH (TAG "P283") ALL 882,1102,3003,3005:3006 | ||||
S: P283 OK completed | ||||
Note: Since this document format is restricted to 7-bit ASCII text, | Note that the second command in Example 3 can be replaced with: | |||
it is not possible to show actual UTF-8 data. The "YYYYYYYY" is a | ||||
placeholder for what would be 8 octets of 8-bit data in an actual | ||||
transaction. | ||||
4) The following example demonstrates that a failed SEARCH sets the | C: A301 UID SEARCH $ SMALLER 4096 | |||
search result variable to the empty list. The server doesn't | ||||
implement the KOI8-R charset. | ||||
Example 5: | and the result of the command would be the same. | |||
C: B282 SEARCH RETURN (SAVE) SINCE 1-Feb-1994 | ||||
NOT FROM "Smith" | ||||
S: B282 OK SEARCH completed | ||||
C: B283 SEARCH RETURN (SAVE) CHARSET KOI8-R | ||||
(OR $ 1,3000:3021) TEXT {4} | ||||
C: XXXX | ||||
S: B283 NO [BADCHARSET UTF-8] KOI8-R is not supported | ||||
//After this command the saved result variable contains | ||||
//no messages. A client that wants to reissue the B283 | ||||
//SEARCH command with another CHARSET would have to reissue | ||||
//the B282 command as well. One possible workaround for | ||||
//this is to include the desired CHARSET parameter | ||||
//in the earliest SEARCH RETURN (SAVE) command in a | ||||
//sequence of related SEARCH commands, to cause | ||||
//the earliest SEARCH in the sequence to fail. | ||||
//A better approach might be to always use CHARSET UTF-8 | ||||
//instead. | ||||
Note: Since this document format is restricted to 7-bit ASCII text, | 3. The following example shows that the "$" marker can be combined | |||
it is not possible to show actual KOI8-R data. The "XXXX" is a | with other message numbers using the OR SEARCH criterion. | |||
placeholder for what would be 4 octets of 8-bit data in an actual | ||||
transaction. | ||||
5) The following example demonstrates that it is not an error to use | Example 4: | |||
the "$" marker when it contains no messages. | ||||
Example 6: | C: P282 SEARCH RETURN (SAVE) SINCE 1-Feb-1994 | |||
C: E282 SEARCH RETURN (SAVE) SINCE 28-Oct-2006 | NOT FROM "Smith" | |||
NOT FROM "Eric" | S: P282 OK SEARCH completed | |||
C: E283 COPY $ "Other Messages" | C: P283 SEARCH CHARSET UTF-8 (OR $ 1,3000:3021) TEXT {8+} | |||
//The "$" contains no messages | C: мать | |||
S: E282 OK SEARCH completed | S: * ESEARCH (TAG "P283") ALL 882,1102,3003,3005:3006 | |||
S: E283 OK COPY completed, nothing copied | S: P283 OK completed | |||
Example 7: | 4. The following example demonstrates that a failed SEARCH sets the | |||
C: F282 SEARCH RETURN (SAVE) KEYWORD $Junk | search result variable to the empty list. The server doesn't | |||
C: F283 COPY $ "Junk" | implement the KOI8-R charset. | |||
C: F284 STORE $ +FLAGS.Silent (\Deleted) | ||||
S: F282 OK SEARCH completed | ||||
S: F283 OK COPY completed | ||||
S: F284 OK STORE completed | ||||
Example 8: | Example 5: | |||
C: G282 SEARCH RETURN (SAVE) KEYWORD $Junk | ||||
C: G283 SEARCH RETURN (ALL) SINCE 28-Oct-2006 | ||||
FROM "Eric" | ||||
// The server can execute the two SEARCH commands | ||||
// in any order, as they don't have any dependency. | ||||
// For example, it may return: | ||||
S: * ESEARCH (TAG "G283") ALL 3:15,27,29:103 | ||||
S: G283 OK SEARCH completed | ||||
S: G282 OK SEARCH completed | ||||
The following example demonstrates that the result of the second | C: B282 SEARCH RETURN (SAVE) SINCE 1-Feb-1994 | |||
SEARCH RETURN (SAVE) always overrides the result of the first. | NOT FROM "Smith" | |||
S: B282 OK SEARCH completed | ||||
C: B283 SEARCH RETURN (SAVE) CHARSET KOI8-R | ||||
(OR $ 1,3000:3021) TEXT {4} | ||||
C: XXXX | ||||
S: B283 NO [BADCHARSET UTF-8] KOI8-R is not supported | ||||
//After this command, the saved result variable contains | ||||
//no messages. A client that wants to reissue the B283 | ||||
//SEARCH command with another CHARSET would have to reissue | ||||
//the B282 command as well. One possible workaround for | ||||
//this is to include the desired CHARSET parameter | ||||
//in the earliest SEARCH RETURN (SAVE) command in a | ||||
//sequence of related SEARCH commands, to cause | ||||
//the earliest SEARCH in the sequence to fail. | ||||
//A better approach might be to always use CHARSET UTF-8 | ||||
//instead. | ||||
Example 9: | Note: Since this document format is restricted to 7-bit ASCII | |||
C: H282 SEARCH RETURN (SAVE) KEYWORD $Junk | text, it is not possible to show actual KOI8-R data. The "XXXX" | |||
C: H283 SEARCH RETURN (SAVE) SINCE 28-Oct-2006 | is a placeholder for what would be 4 octets of 8-bit data in an | |||
FROM "Eric" | actual transaction. | |||
S: H282 OK SEARCH completed | ||||
S: H283 OK SEARCH completed | ||||
// At this point "$" would contain results of H283 | ||||
The following example demonstrates behavioral difference for | 5. The following example demonstrates that it is not an error to use | |||
different combinations of ESEARCH result options. | the "$" marker when it contains no messages. | |||
Example 10: | Example 6: | |||
C: C282 SEARCH RETURN (ALL) SINCE 12-Feb-2006 | ||||
NOT FROM "Smith" | ||||
S: * ESEARCH (TAG "C283") ALL 2,10:15,21 | ||||
//$ value hasn't changed | ||||
S: C282 OK SEARCH completed | ||||
C: C283 SEARCH RETURN (ALL SAVE) SINCE 12-Feb-2006 | C: E282 SEARCH RETURN (SAVE) SINCE 28-Oct-2006 | |||
NOT FROM "Smith" | NOT FROM "Eric" | |||
S: * ESEARCH (TAG "C283") ALL 2,10:15,21 | C: E283 COPY $ "Other Messages" | |||
//$ value is 2,10:15,21 | //The "$" contains no messages | |||
S: C283 OK SEARCH completed | S: E282 OK SEARCH completed | |||
S: E283 OK COPY completed, nothing copied | ||||
C: C284 SEARCH RETURN (SAVE MIN) SINCE 12-Feb-2006 | Example 7: | |||
NOT FROM "Smith" | ||||
S: * ESEARCH (TAG "C284") MIN 2 | ||||
//$ value is 2 | ||||
S: C284 OK SEARCH completed | ||||
C: C285 SEARCH RETURN (MAX SAVE MIN) SINCE | C: F282 SEARCH RETURN (SAVE) KEYWORD $Junk | |||
12-Feb-2006 NOT FROM "Smith" | C: F283 COPY $ "Junk" | |||
S: * ESEARCH (TAG "C285") MIN 2 MAX 21 | C: F284 STORE $ +FLAGS.Silent (\Deleted) | |||
//$ value is 2,21 | S: F282 OK SEARCH completed | |||
S: C285 OK SEARCH completed | S: F283 OK COPY completed | |||
S: F284 OK STORE completed | ||||
C: C286 SEARCH RETURN (MAX SAVE MIN COUNT) | Example 8: | |||
SINCE 12-Feb-2006 NOT FROM "Smith" | ||||
S: * ESEARCH (TAG "C286") MIN 2 MAX 21 COUNT 8 | ||||
//$ value is 2,10:15,21 | ||||
S: C286 OK SEARCH completed | ||||
C: C286 SEARCH RETURN (ALL SAVE MIN) SINCE | C: G282 SEARCH RETURN (SAVE) KEYWORD $Junk | |||
12-Feb-2006 NOT FROM "Smith" | C: G283 SEARCH RETURN (ALL) SINCE 28-Oct-2006 | |||
S: * ESEARCH (TAG "C286") MIN 2 ALL 2,10:15,21 | FROM "Eric" | |||
//$ value is 2,10:15,21 | // The server can execute the two SEARCH commands | |||
S: C286 OK SEARCH completed | // in any order, as they don't have any dependency. | |||
// For example, it may return: | ||||
S: * ESEARCH (TAG "G283") ALL 3:15,27,29:103 | ||||
S: G283 OK SEARCH completed | ||||
S: G282 OK SEARCH completed | ||||
The following example demonstrates that the result of the second | ||||
SEARCH RETURN (SAVE) always overrides the result of the first. | ||||
Example 9: | ||||
C: H282 SEARCH RETURN (SAVE) KEYWORD $Junk | ||||
C: H283 SEARCH RETURN (SAVE) SINCE 28-Oct-2006 | ||||
FROM "Eric" | ||||
S: H282 OK SEARCH completed | ||||
S: H283 OK SEARCH completed | ||||
// At this point "$" would contain results of H283 | ||||
The following example demonstrates behavioral difference for | ||||
different combinations of ESEARCH result options. | ||||
Example 10: | ||||
C: C282 SEARCH RETURN (ALL) SINCE 12-Feb-2006 | ||||
NOT FROM "Smith" | ||||
S: * ESEARCH (TAG "C283") ALL 2,10:15,21 | ||||
//$ 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 | ||||
NOT FROM "Smith" | ||||
S: * ESEARCH (TAG "C284") MIN 2 | ||||
//$ value is 2 | ||||
S: C284 OK SEARCH completed | ||||
C: C285 SEARCH RETURN (MAX SAVE MIN) SINCE | ||||
12-Feb-2006 NOT FROM "Smith" | ||||
S: * ESEARCH (TAG "C285") MIN 2 MAX 21 | ||||
//$ value is 2,21 | ||||
S: C285 OK SEARCH completed | ||||
C: C286 SEARCH RETURN (MAX SAVE MIN COUNT) | ||||
SINCE 12-Feb-2006 NOT FROM "Smith" | ||||
S: * ESEARCH (TAG "C286") MIN 2 MAX 21 COUNT 8 | ||||
//$ value is 2,10:15,21 | ||||
S: C286 OK SEARCH completed | ||||
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 | ||||
6.4.5. FETCH Command | 6.4.5. FETCH Command | |||
Arguments: sequence set | Arguments: sequence set | |||
message data item names or macro | ||||
Responses: untagged responses: FETCH | message data item names or macro | |||
Result: OK - fetch completed | Responses: untagged responses: FETCH | |||
NO - fetch error: can't fetch that data | ||||
BAD - command unknown or arguments invalid | Result: OK - fetch completed | |||
NO - fetch error: can't fetch that data | ||||
BAD - command unknown or arguments invalid | ||||
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 or | mailbox. The data items to be fetched can be either a single atom or | |||
a parenthesized list. | a parenthesized list. | |||
Most data items, identified in the formal syntax (Section 9) under | Most data items, identified in the formal syntax (Section 9) under | |||
the msg-att-static rule, are static and MUST NOT change for any | the 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 result | syntax under the msg-att-dynamic rule, MAY change either as a result | |||
of a STORE command or due to external events. | of a STORE command or due to external events. | |||
For example, if a client receives an ENVELOPE for a message when | For example, if a client receives an ENVELOPE for a message when | |||
it already knows the envelope, it can safely ignore the newly | it already knows the envelope, it can safely ignore the newly | |||
transmitted envelope. | transmitted envelope. | |||
There are three macros which specify commonly-used sets of data | There are three macros that specify commonly used sets of data items | |||
items, and can be used instead of data items. A macro must be used | and can be used instead of data items. A macro must be used by | |||
by itself, and not in conjunction with other macros or data items. | itself and not in conjunction with other macros or data items. | |||
ALL Macro equivalent to: (FLAGS INTERNALDATE RFC822.SIZE ENVELOPE) | ALL | |||
Macro equivalent to: (FLAGS INTERNALDATE RFC822.SIZE ENVELOPE) | ||||
FAST Macro equivalent to: (FLAGS INTERNALDATE RFC822.SIZE) | FAST | |||
Macro equivalent to: (FLAGS INTERNALDATE RFC822.SIZE) | ||||
FULL Macro equivalent to: (FLAGS INTERNALDATE RFC822.SIZE ENVELOPE | FULL | |||
Macro equivalent to: (FLAGS INTERNALDATE RFC822.SIZE ENVELOPE | ||||
BODY) | BODY) | |||
Several data items reference "section" or "section-binary". See | Several data items reference "section" or "section-binary". See | |||
Section 6.4.5.1 for their detailed definition. | Section 6.4.5.1 for their detailed definition. | |||
The currently defined data items that can be fetched are: | The currently defined data items that can be fetched are: | |||
BINARY[<section-binary>]<<partial>> | BINARY[<section-binary>]<<partial>> | |||
Requests that the specified section be transmitted after | ||||
performing decoding of the section's Content-Transfer-Encoding. | ||||
Requests that the specified section be transmitted after | The <partial> argument, if present, requests that a subset of the | |||
performing Content-Transfer-Encoding-related decoding. | data be returned. The semantics of a partial FETCH BINARY command | |||
are the same as for a partial FETCH BODY command, with the | ||||
The <partial> argument, if present, requests that a subset of | exception that the <partial> arguments refer to the DECODED | |||
the data be returned. The semantics of a partial FETCH BINARY | section data. | |||
command are the same as for a partial FETCH BODY command, with | ||||
the exception that the <partial> arguments refer to the DECODED | ||||
section data. | ||||
Note that this data item can only be requested for leaf (i.e. | Note that this data item can only be requested for leaf body | |||
non multipart/*, non message/rfc822 and non message/global) | parts: those that have media types other than multipart/*, | |||
body parts. | message/rfc822, or message/global. | |||
BINARY.PEEK[<section-binary>]<<partial>> An alternate form of | BINARY.PEEK[<section-binary>]<<partial>> | |||
BINARY[<section-binary>] that does not implicitly set the \Seen | An alternate form of BINARY[<section-binary>] that does not | |||
flag. | implicitly set the \Seen flag. | |||
BINARY.SIZE[<section-binary>] | BINARY.SIZE[<section-binary>] | |||
Requests the decoded size of the section (i.e., the size to expect | ||||
in response to the corresponding FETCH BINARY request). | ||||
Requests the decoded size of the section (i.e., the size to | Note: client authors are cautioned that this might be an expensive | |||
expect in response to the corresponding FETCH BINARY request). | operation for some server implementations. Needlessly issuing | |||
this request could result in degraded performance due to servers | ||||
Note: client authors are cautioned that this might be an | having to calculate the value every time the request is issued. | |||
expensive operation for some server implementations. | ||||
Needlessly issuing this request could result in degraded | ||||
performance due to servers having to calculate the value every | ||||
time the request is issued. | ||||
Note that this data item can only be requested for leaf (i.e. | Note that this data item can only be requested for leaf body | |||
non multipart/*, non message/rfc822 and non message/global) | parts: those that have media types other than multipart/*, | |||
body parts. | message/rfc822, or message/global. | |||
BODY Non-extensible form of BODYSTRUCTURE. | BODY | |||
Non-extensible form of BODYSTRUCTURE. | ||||
BODY[<section>]<<partial>> | BODY[<section>]<<partial>> | |||
The text of a particular body section. If BODY[] is specified | ||||
(the section specification is omitted), the FETCH is requesting | ||||
the [RFC5322] expression of the entire message. | ||||
The text of a particular body section. | It is possible to fetch a substring of the designated text. This | |||
is done by appending an open angle bracket ("<"), the octet | ||||
position of the first desired octet, a period, the maximum number | ||||
of octets desired, and a close angle bracket (">") to the part | ||||
specifier. If the starting octet is beyond the end of the text, | ||||
an empty string is returned. | ||||
It is possible to fetch a substring of the designated text. | Any partial fetch that attempts to read beyond the end of the text | |||
This is done by appending an open angle bracket ("<"), the | is truncated as appropriate. A partial fetch that starts at octet | |||
octet position of the first desired octet, a period, the | 0 is returned as a partial fetch, even if this truncation | |||
maximum number of octets desired, and a close angle bracket | happened. | |||
(">") to the part specifier. If the starting octet is beyond | ||||
the end of the text, an empty string is returned. | ||||
Any partial fetch that attempts to read beyond the end of the | Note: This means that BODY[]<0.2048> of a 1500-octet message | |||
text is truncated as appropriate. A partial fetch that starts | will return BODY[]<0> with a literal of size 1500, not BODY[]. | |||
at octet 0 is returned as a partial fetch, even if this | ||||
truncation happened. | ||||
Note: This means that BODY[]<0.2048> of a 1500-octet message | Note: A substring fetch of a HEADER.FIELDS or HEADER.FIELDS.NOT | |||
will return BODY[]<0> with a literal of size 1500, not | part specifier is calculated after subsetting the header. | |||
BODY[]. | ||||
Note: A substring fetch of a HEADER.FIELDS or | The \Seen flag is implicitly set; if this causes the flags to | |||
HEADER.FIELDS.NOT part specifier is calculated after | change, they SHOULD be included as part of the FETCH responses. | |||
subsetting the header. | ||||
The \Seen flag is implicitly set; if this causes the flags to | BODY.PEEK[<section>]<<partial>> | |||
change, they SHOULD be included as part of the FETCH responses. | An alternate form of BODY[<section>] that does not implicitly set | |||
the \Seen flag. | ||||
BODY.PEEK[<section>]<<partial>> An alternate form of BODY[<section>] | BODYSTRUCTURE | |||
that does not implicitly set the \Seen flag. | The [MIME-IMB] body structure of the message. This is computed by | |||
the server by parsing the [MIME-IMB] header fields in the | ||||
[RFC5322] header and [MIME-IMB] headers. See Section 7.5.2 for | ||||
more details. | ||||
BODYSTRUCTURE The [MIME-IMB] body structure of the message. This is | ENVELOPE | |||
computed by the server by parsing the [MIME-IMB] header fields in | The envelope structure of the message. This is computed by the | |||
the [RFC-5322] header and [MIME-IMB] headers. See Section 7.5.2 | server by parsing the [RFC5322] header into the component parts, | |||
for more details. | defaulting various fields as necessary. See Section 7.5.2 for | |||
more details. | ||||
ENVELOPE The envelope structure of the message. This is computed by | FLAGS | |||
the server by parsing the [RFC-5322] header into the component | The flags that are set for this message. | |||
parts, defaulting various fields as necessary. See Section 7.5.2 | ||||
for more details. | ||||
FLAGS The flags that are set for this message. | INTERNALDATE | |||
The internal date of the message. | ||||
INTERNALDATE The internal date of the message. | RFC822.SIZE | |||
The size of the message, as defined in Section 2.3.4. | ||||
RFC822.SIZE The [RFC-5322] size of the message. | UID | |||
The unique identifier for the message. | ||||
UID The unique identifier for the message. | Example: | |||
Example: C: A654 FETCH 2:4 (FLAGS BODY[HEADER.FIELDS (DATE FROM)]) | C: A654 FETCH 2:4 (FLAGS BODY[HEADER.FIELDS (DATE FROM)]) | |||
S: * 2 FETCH .... | S: * 2 FETCH .... | |||
S: * 3 FETCH .... | S: * 3 FETCH .... | |||
S: * 4 FETCH .... | S: * 4 FETCH .... | |||
S: A654 OK FETCH completed | S: A654 OK FETCH completed | |||
6.4.5.1. FETCH section specification | 6.4.5.1. FETCH Section Specification | |||
Several FETCH data items reference "section" or "section-binary". | 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 or | delimited by periods. A part specifier is either a part number or | |||
one of the following: HEADER, HEADER.FIELDS, HEADER.FIELDS.NOT, MIME, | one of the following: HEADER, HEADER.FIELDS, HEADER.FIELDS.NOT, MIME, | |||
and TEXT. (Non numeric part specifiers have to be the last specifier | and TEXT. (Non-numeric part specifiers have to be the last specifier | |||
in a section specification.) An empty section specification refers | in a section specification.) An empty section specification refers | |||
to the entire message, including the header. | to the entire message, including the header. | |||
Every message has at least one part number. Non-[MIME-IMB] messages, | Every message has at least one part number. Messages that do not use | |||
and non-multipart [MIME-IMB] messages with no encapsulated message, | MIME, and MIME messages that are not multipart and have no | |||
only have a part 1. | encapsulated message within them, only have a part 1. | |||
Multipart messages are assigned consecutive part numbers, as they | Multipart messages are assigned consecutive part numbers, as they | |||
occur in the message. If a particular part is of type message or | occur in the message. If a particular part is of type message or | |||
multipart, its parts MUST be indicated by a period followed by the | multipart, its parts MUST be indicated by a period followed by the | |||
part number within that nested multipart part. | part number within that nested multipart part. | |||
A part of type MESSAGE/RFC822 or MESSAGE/GLOBAL also has nested part | A part of type MESSAGE/RFC822 or MESSAGE/GLOBAL also has nested part | |||
numbers, referring to parts of the MESSAGE part's body. | numbers, referring to parts of the MESSAGE part's body. | |||
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 one | specifiers can be the sole part specifier or can be prefixed by one | |||
or more numeric part specifiers, provided that the numeric part | or more numeric part specifiers, provided that the numeric part | |||
specifier refers to a part of type MESSAGE/RFC822 or MESSAGE/GLOBAL. | specifier refers to a part of type MESSAGE/RFC822 or MESSAGE/GLOBAL. | |||
The MIME part specifier MUST be prefixed by one or more numeric part | The MIME part specifier MUST be prefixed by one or more numeric part | |||
specifiers. | specifiers. | |||
The HEADER, HEADER.FIELDS, and HEADER.FIELDS.NOT part specifiers | The HEADER, HEADER.FIELDS, and HEADER.FIELDS.NOT part specifiers | |||
refer to the [RFC-5322] header of the message or of an encapsulated | refer to the [RFC5322] header of the message or of an encapsulated | |||
[MIME-IMT] MESSAGE/RFC822 or MESSAGE/GLOBAL message. HEADER.FIELDS | [MIME-IMT] MESSAGE/RFC822 or MESSAGE/GLOBAL message. HEADER.FIELDS | |||
and HEADER.FIELDS.NOT are followed by a list of field-name (as | and HEADER.FIELDS.NOT are followed by a list of field-names (as | |||
defined in [RFC-5322]) names, and return a subset of the header. The | defined in [RFC5322]) and return a subset of the header. The subset | |||
subset returned by HEADER.FIELDS contains only those header fields | returned by HEADER.FIELDS contains only those header fields with a | |||
with a field-name that matches one of the names in the list; | field-name that matches one of the names in the list; similarly, the | |||
similarly, the subset returned by HEADER.FIELDS.NOT contains only the | subset returned by HEADER.FIELDS.NOT contains only the header fields | |||
header fields with a non-matching field-name. The field-matching is | with a non-matching field-name. The field-matching is ASCII-range | |||
ASCII range case-insensitive but otherwise exact. Subsetting does | case insensitive but is otherwise exact. Subsetting does not exclude | |||
not exclude the [RFC-5322] delimiting blank line between the header | the [RFC5322] delimiting blank line between the header and the body; | |||
and the body; the blank line is included in all header fetches, | the blank line is included in all header fetches, except in the case | |||
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. | |||
The MIME part specifier refers to the [MIME-IMB] header for this | The MIME part specifier refers to the [MIME-IMB] header for this | |||
part. | part. | |||
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 [RFC-5322] header. | omitting the [RFC5322] header. | |||
Here is an example of a complex message with some of its part | Here is an example of a complex message with some of its part | |||
specifiers: | specifiers: | |||
HEADER ([RFC-5322] header of the message) | HEADER ([RFC5322] header of the message) | |||
TEXT ([RFC-5322] text body of the message) MULTIPART/MIXED | TEXT ([RFC5322] text body of the message) MULTIPART/MIXED | |||
1 TEXT/PLAIN | 1 TEXT/PLAIN | |||
2 APPLICATION/OCTET-STREAM | 2 APPLICATION/OCTET-STREAM | |||
3 MESSAGE/RFC822 | 3 MESSAGE/RFC822 | |||
3.HEADER ([RFC-5322] header of the message) | 3.HEADER ([RFC5322] header of the message) | |||
3.TEXT ([RFC-5322] text body of the message) MULTIPART/MIXED | 3.TEXT ([RFC5322] text body of the message) MULTIPART/MIXED | |||
3.1 TEXT/PLAIN | 3.1 TEXT/PLAIN | |||
3.2 APPLICATION/OCTET-STREAM | 3.2 APPLICATION/OCTET-STREAM | |||
4 MULTIPART/MIXED | 4 MULTIPART/MIXED | |||
4.1 IMAGE/GIF | 4.1 IMAGE/GIF | |||
4.1.MIME ([MIME-IMB] header for the IMAGE/GIF) | 4.1.MIME ([MIME-IMB] header for the IMAGE/GIF) | |||
4.2 MESSAGE/RFC822 | 4.2 MESSAGE/RFC822 | |||
4.2.HEADER ([RFC-5322] header of the message) | 4.2.HEADER ([RFC5322] header of the message) | |||
4.2.TEXT ([RFC-5322] text body of the message) MULTIPART/MIXED | 4.2.TEXT ([RFC5322] text body of the message) MULTIPART/MIXED | |||
4.2.1 TEXT/PLAIN | 4.2.1 TEXT/PLAIN | |||
4.2.2 MULTIPART/ALTERNATIVE | 4.2.2 MULTIPART/ALTERNATIVE | |||
4.2.2.1 TEXT/PLAIN | 4.2.2.1 TEXT/PLAIN | |||
4.2.2.2 TEXT/RICHTEXT | 4.2.2.2 TEXT/RICHTEXT | |||
6.4.6. STORE Command | 6.4.6. STORE Command | |||
Arguments: sequence set | Arguments: sequence set | |||
message data item name | ||||
value for message data item | ||||
Responses: untagged responses: FETCH | message data item name | |||
Result: OK - store completed | value for message data item | |||
NO - store error: can't store that data | ||||
BAD - command unknown or arguments invalid | Responses: untagged responses: FETCH | |||
Result: OK - store completed | ||||
NO - store error: can't store that data | ||||
BAD - command unknown or arguments invalid | ||||
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 data | mailbox. Normally, STORE will return the updated value of the data | |||
with an untagged FETCH response. A suffix of ".SILENT" in the data | with an untagged FETCH response. A suffix of ".SILENT" in the data | |||
item name prevents the untagged FETCH, and the server SHOULD assume | item name prevents the untagged FETCH, and the server SHOULD assume | |||
that the client has determined the updated value itself or does not | that the client has determined the updated value itself or does not | |||
care about the updated value. | care about the updated value. | |||
Note: Regardless of whether or not the ".SILENT" suffix was used, | Note: Regardless of whether or not the ".SILENT" suffix was used, | |||
the server SHOULD send an untagged FETCH response if a change to a | the server SHOULD send an untagged FETCH response if a change to a | |||
message's flags from an external source is observed. The intent | message's flags from an external source is observed. The intent | |||
is that the status of the flags is determinate without a race | is that the status of the flags is determinate without a race | |||
condition. | condition. | |||
The currently defined data items that can be stored are: | The currently defined data items that can be stored are: | |||
FLAGS <flag list> Replace the flags for the message with the | FLAGS <flag list> | |||
argument. The new value of the flags is returned as if a FETCH of | Replace the flags for the message with the argument. The new | |||
those flags was done. | value of the flags is returned as if a FETCH of those flags was | |||
done. | ||||
FLAGS.SILENT <flag list> Equivalent to FLAGS, but without returning | FLAGS.SILENT <flag list> | |||
a new value. | Equivalent to FLAGS, but without returning a new value. | |||
+FLAGS <flag list> Add the argument to the flags for the message. | +FLAGS <flag list> | |||
The new value of the flags is returned as if a FETCH of those | Add the argument to the flags for the message. The new value of | |||
flags was done. | the flags is returned as if a FETCH of those flags was done. | |||
+FLAGS.SILENT <flag list> Equivalent to +FLAGS, but without | +FLAGS.SILENT <flag list> | |||
returning a new value. | Equivalent to +FLAGS, but without returning a new value. | |||
-FLAGS <flag list> Remove the argument from the flags for the | -FLAGS <flag list> | |||
message. The new value of the flags is returned as if a FETCH of | Remove the argument from the flags for the message. The new value | |||
those flags was done. | of the flags is returned as if a FETCH of those flags was done. | |||
-FLAGS.SILENT <flag list> Equivalent to -FLAGS, but without | -FLAGS.SILENT <flag list> | |||
returning a new value. | Equivalent to -FLAGS, but without returning a new value. | |||
Example: C: A003 STORE 2:4 +FLAGS (\Deleted) | Example: | |||
S: * 2 FETCH (FLAGS (\Deleted \Seen)) | ||||
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)) | |||
S: * 4 FETCH (FLAGS (\Deleted \Flagged \Seen)) | ||||
S: A003 OK STORE completed | ||||
6.4.7. COPY Command | 6.4.7. COPY Command | |||
Arguments: sequence set | Arguments: sequence set | |||
mailbox name | ||||
Responses: no specific responses for this command | mailbox name | |||
Result: OK - copy completed | Responses: no specific responses for this command | |||
NO - copy error: can't copy those messages or to that | ||||
name | Result: OK - copy completed | |||
BAD - command unknown or arguments invalid | NO - copy error: can't copy those messages or to that | |||
name | ||||
BAD - command unknown or arguments invalid | ||||
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) SHOULD be preserved in the copy. | |||
If the destination mailbox does not exist, a server MUST return an | If the destination mailbox does not exist, a server MUST return an | |||
error. It MUST NOT automatically create the mailbox. Unless it is | error. It MUST NOT automatically create the mailbox. Unless it is | |||
certain that the destination mailbox can not be created, the server | certain that the destination mailbox can not be created, the server | |||
MUST send the response code "[TRYCREATE]" as the prefix of the text | MUST send the response code "[TRYCREATE]" as the prefix of the text | |||
of the tagged NO response. This gives a hint to the client that it | of the tagged NO response. This gives a hint to the client that it | |||
can attempt a CREATE command and retry the COPY if the CREATE is | can attempt a CREATE command and retry the COPY if the CREATE is | |||
successful. | successful. | |||
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 MUST 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 MUST NOT be done. | |||
On successful completion of a COPY, the server returns a COPYUID | On successful completion of a COPY, the server returns a COPYUID | |||
response code (see Section 7.1). Two exception to this requirement | response code (see Section 7.1). Two exceptions to this requirement | |||
are listed below. | are listed below. | |||
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 server | can COPY to the mailbox, but not SELECT or EXAMINE it, the server | |||
MUST NOT send an COPYUID response code as it would disclose | MUST NOT send a COPYUID response code as it would disclose | |||
information about the mailbox. | information about the mailbox. | |||
In the case of a mailbox that has UIDNOTSTICKY status (see | In the case of a mailbox that has UIDNOTSTICKY status (see | |||
Section 7.1), the server MAY omit the COPYUID response code as it is | Section 7.1), the server MAY omit the COPYUID response code as it is | |||
not meaningful. | not meaningful. | |||
Example: C: A003 COPY 2:4 MEETING | Example: | |||
S: A003 OK [COPYUID 38505 304,319:320 3956:3958] COPY completed | ||||
C: A003 COPY 2:4 MEETING | ||||
S: A003 OK [COPYUID 38505 304,319:320 3956:3958] COPY completed | ||||
6.4.8. MOVE Command | 6.4.8. MOVE Command | |||
Arguments: sequence set | Arguments: sequence set | |||
mailbox name | ||||
Responses: no specific responses for this command | mailbox name | |||
Result: OK - move completed | Responses: no specific responses for this command | |||
NO - move error: can't move those messages or to that | ||||
name | Result: OK - move completed | |||
BAD - command unknown or arguments invalid | NO - move error: can't move those messages or to that | |||
name | ||||
BAD - command unknown or arguments invalid | ||||
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) SHOULD be preserved. | |||
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: | |||
1. [UID] COPY | 1. [UID] COPY | |||
2. [UID] STORE +FLAGS.SILENT \DELETED | 2. [UID] STORE +FLAGS.SILENT \DELETED | |||
3. UID EXPUNGE | 3. UID EXPUNGE | |||
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 MUST NOT be generated, and the | |||
\Deleted flag MUST NOT be set for any message. | \Deleted flag MUST NOT be set for any message. | |||
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 MUST be either moved | |||
or unaffected. The server MUST leave each message in a state where | or unaffected. The server MUST 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 SHOULD NOT leave any message 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. | |||
If the destination mailbox does not exist, a server MUST return an | If the destination mailbox does not exist, a server MUST return an | |||
error. It MUST NOT automatically create the mailbox. Unless it is | error. It MUST NOT automatically create the mailbox. Unless it is | |||
certain that the destination mailbox can not be created, the server | certain that the destination mailbox cannot be created, the server | |||
MUST send the response code "[TRYCREATE]" as the prefix of the text | MUST send the response code "[TRYCREATE]" as the prefix of the text | |||
of the tagged NO response. This gives a hint to the client that it | of the tagged NO response. This gives a hint to the client that it | |||
can attempt a CREATE command and retry the MOVE if the CREATE is | can attempt a CREATE command and retry the MOVE if the CREATE is | |||
successful. | successful. | |||
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 | |||
Section 7.1, as well as those defined by extensions, are sent as | Section 7.1, as well as those defined by extensions, are sent as | |||
indicated for COPY. | indicated for COPY. | |||
Servers send COPYUID in response to a MOVE or a UID MOVE (see | Servers send COPYUID in response to a MOVE or a UID MOVE (see | |||
Section 6.4.9) command. For additional information about COPYUID see | Section 6.4.9) command. For additional information about COPYUID, | |||
Section 7.1. Note that there are several exceptions listed in | see Section 7.1. Note that there are several exceptions listed in | |||
Section 6.4.7 that allow servers not to return COPYUID. | Section 6.4.7 that allow servers not to return COPYUID. | |||
Servers are also REQUIRED to send the COPYUID response code in an | Servers are also REQUIRED to send the COPYUID response code in an | |||
untagged OK before sending EXPUNGE or similar responses. (Sending | untagged OK before sending EXPUNGE or similar responses. (Sending | |||
COPYUID in the tagged OK, as described in the UIDPLUS specification, | COPYUID in the tagged OK, as described in Section 6.4.7, means that | |||
means that clients first receive an EXPUNGE for a message and | clients first receive an EXPUNGE for a message and afterwards COPYUID | |||
afterwards COPYUID for the same message. It can be unnecessarily | for the same message. It can be unnecessarily difficult to process | |||
difficult to process that sequence usefully.) | that sequence usefully.) | |||
An example: | An example: | |||
C: a UID MOVE 42:69 foo | ||||
S: * OK [COPYUID 432432 42:69 1202:1229] | C: a UID MOVE 42:69 foo | |||
S: * 22 EXPUNGE | S: * OK [COPYUID 432432 42:69 1202:1229] | |||
...More EXPUNGE responses from the server... | S: * 22 EXPUNGE | |||
S: a OK Done | ...More EXPUNGE responses from the server... | |||
S: a OK Done | ||||
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. | |||
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. | |||
skipping to change at page 101, line 8 ¶ | skipping to change at line 4743 ¶ | |||
the client cannot safely send more commands with message sequence | the client cannot safely send more commands with message sequence | |||
number arguments while the server is processing MOVE. | number arguments while the server is processing MOVE. | |||
MOVE and UID MOVE can be pipelined with other commands, but care has | MOVE and UID MOVE can be pipelined with other commands, but care has | |||
to be taken. Both commands modify sequence numbers and also allow | to be taken. Both commands modify sequence numbers and also allow | |||
unrelated EXPUNGE responses. The renumbering of other messages in | unrelated EXPUNGE responses. The renumbering of other messages in | |||
the source mailbox following any EXPUNGE response can be surprising | the source mailbox following any EXPUNGE response can be surprising | |||
and makes it unsafe to pipeline any command that relies on message | and makes it unsafe to pipeline any command that relies on message | |||
sequence numbers after a MOVE or UID MOVE. Similarly, MOVE cannot be | sequence numbers after a MOVE or UID MOVE. Similarly, MOVE cannot be | |||
pipelined with a command that might cause message renumbering. See | pipelined with a command that might cause message renumbering. See | |||
Section 5.5, for more information about ambiguities as well as | Section 5.5 for more information about ambiguities as well as | |||
handling requirements for both clients and servers. | handling requirements for both clients and servers. | |||
6.4.9. UID Command | 6.4.9. UID Command | |||
Arguments: command name | Arguments: command name | |||
command arguments | ||||
Responses: untagged responses: FETCH, ESEARCH, EXPUNGE | command arguments | |||
Result: OK - UID command completed | Responses: untagged responses: FETCH, ESEARCH, EXPUNGE | |||
NO - UID command error | ||||
BAD - command unknown or arguments invalid | Result: OK - UID command completed | |||
NO - UID command error | ||||
BAD - command unknown or arguments invalid | ||||
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 the | appropriate for the associated command. However, the numbers in the | |||
sequence set argument are unique identifiers instead of message | sequence-set argument are unique identifiers instead of message | |||
sequence numbers. Sequence set ranges are permitted, but there is no | sequence numbers. Sequence-set ranges are permitted, but there is no | |||
guarantee that unique identifiers will be contiguous. | guarantee that unique identifiers will be contiguous. | |||
A non-existent unique identifier is ignored without any error message | A non-existent unique identifier is ignored without any error message | |||
generated. Thus, it is possible for a UID FETCH command to return an | 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 return an | OK without any data or a UID COPY, UID MOVE, or UID STORE to return | |||
OK without performing any operations. | an OK without performing any operations. | |||
In the second form, the UID command takes an EXPUNGE command with an | 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. | 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 | |||
have the \Deleted flag set and have a UID that is included in the | both 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 that | 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 affected. | is not included in the specified sequence set, it is not affected. | |||
UID EXPUNGE is particularly useful for disconnected use clients. | UID EXPUNGE is particularly useful for disconnected use clients. By | |||
By using UID EXPUNGE instead of EXPUNGE when resynchronizing with | using UID EXPUNGE instead of EXPUNGE when resynchronizing with the | |||
the server, the client can ensure that it does not inadvertantly | server, the client can ensure that it does not inadvertently remove | |||
remove any messages that have been marked as \Deleted by other | any messages that have been marked as \Deleted by other clients | |||
clients between the time that the client was last connected and | between the time that the client was last connected and the time the | |||
the time the client resynchronizes. | client resynchronizes. | |||
Example: C: A003 UID EXPUNGE 3000:3002 | Example: | |||
S: * 3 EXPUNGE | ||||
S: * 3 EXPUNGE | C: A003 UID EXPUNGE 3000:3002 | |||
S: * 3 EXPUNGE | S: * 3 EXPUNGE | |||
S: A003 OK UID EXPUNGE completed | S: * 3 EXPUNGE | |||
S: * 3 EXPUNGE | ||||
S: A003 OK UID EXPUNGE completed | ||||
In the third form, the UID command takes a SEARCH command with SEARCH | In the third form, the UID command takes a SEARCH command with SEARCH | |||
command arguments. The interpretation of the arguments is the same | command arguments. The interpretation of the arguments is the same | |||
as with SEARCH; however, the numbers returned in a ESEARCH response | as with SEARCH; however, the numbers returned in an ESEARCH response | |||
for a UID SEARCH command are unique identifiers instead of message | for a UID SEARCH command are unique identifiers instead of message | |||
sequence numbers. Also, the corresponding ESEARCH response MUST | sequence numbers. Also, the corresponding ESEARCH response MUST | |||
include the UID indicator. For example, the command UID SEARCH 1:100 | include the UID indicator. For example, the command UID SEARCH 1:100 | |||
UID 443:557 returns the unique identifiers corresponding to the | UID 443:557 returns the unique identifiers corresponding to the | |||
intersection of two sequence sets, the message sequence number range | intersection of two sequence sets, the message sequence number range | |||
1:100 and the UID range 443:557. | 1:100, and the UID range 443:557. | |||
Note: in the above example, the UID range 443:557 appears. The | Note: in the above example, the UID range 443:557 appears. The | |||
same comment about a non-existent unique identifier being ignored | same comment about a non-existent unique identifier being ignored | |||
without any error message also applies here. Hence, even if | without any error message also applies here. Hence, even if | |||
neither UID 443 or 557 exist, this range is valid and would | neither UID 443 or 557 exist, this range is valid and would | |||
include an existing UID 495. | include an existing UID 495. | |||
Also note that a UID range of 559:* always includes the UID of the | Also note that a UID range of 559:* always includes the UID of the | |||
last message in the mailbox, even if 559 is higher than any | last message in the mailbox, even if 559 is higher than any | |||
assigned UID value. This is because the contents of a range are | assigned UID value. This is because the contents of a range are | |||
skipping to change at page 103, line 5 ¶ | skipping to change at line 4831 ¶ | |||
response caused by a UID command, regardless of whether a UID was | response caused by a UID command, regardless of whether a UID was | |||
specified as a message data item to the FETCH. | specified as a message data item to the FETCH. | |||
Note: The rule about including the UID message data item as part of a | Note: The rule about including the UID message data item as part of a | |||
FETCH response primarily applies to the UID FETCH and UID STORE | FETCH response primarily applies to the UID FETCH and UID STORE | |||
commands, including a UID FETCH command that does not include UID as | commands, including a UID FETCH command that does not include UID as | |||
a message data item. Although it is unlikely that the other UID | a message data item. Although it is unlikely that the other UID | |||
commands will cause an untagged FETCH, this rule applies to these | commands will cause an untagged FETCH, this rule applies to these | |||
commands as well. | commands as well. | |||
Example: C: A999 UID FETCH 4827313:4828442 FLAGS | Example: | |||
S: * 23 FETCH (FLAGS (\Seen) UID 4827313) | ||||
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) | |||
S: * 25 FETCH (FLAGS (\Seen) UID 4828442) | ||||
S: A999 OK UID FETCH completed | ||||
6.5. Client Commands - Experimental/Expansion | 6.5. Client Commands - Experimental/Expansion | |||
Each command which is not part of this specification MUST have at | Each command that is not part of this specification MUST have at | |||
least one capability name (see Section 6.1.1) associated with it. | least one capability name (see Section 6.1.1) associated with it. | |||
(Multiple commands can be associated with the same capability name.) | (Multiple commands can be associated with the same capability name.) | |||
Server implementations MUST NOT send any added (not specified in this | Server implementations MUST NOT send any added untagged responses | |||
specification) untagged responses, unless the client requested it by | (not specified in this specification), unless the client requested it | |||
issuing the associated experimental command (specified in an | by issuing the associated experimental command (specified in an | |||
extension document) or the ENABLE command (Section 6.3.1). | extension document) or the ENABLE command (Section 6.3.1). | |||
The following example demonstrates how a client can check for | The following example demonstrates how a client can check for the | |||
presence of a fictitious XPIG-LATIN capability that adds the XPIG- | presence of a fictitious XPIG-LATIN capability that adds the XPIG- | |||
LATIN command and the the XPIG-LATIN untagged response. (Note that | LATIN command and the XPIG-LATIN untagged response. (Note that for | |||
for an extension the command name and the capability name don't have | an extension, the command name and the capability name don't have to | |||
to be the same.) | be the same.) | |||
Example: C: a441 CAPABILITY | Example: | |||
S: * CAPABILITY IMAP4rev2 XPIG-LATIN | ||||
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 | |||
S: * XPIG-LATIN ow-nay eaking-spay ig-pay atin-lay | ||||
S: A442 OK XPIG-LATIN ompleted-cay | ||||
7. Server Responses | 7. Server Responses | |||
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" | |||
(Section 9). | (Section 9). | |||
The client MUST be prepared to accept any response at all times. | The client MUST be prepared to accept any response at all times. | |||
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. | |||
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". | |||
Certain server data MUST be remembered by the client when it is | Certain server data MUST be remembered by the client when it is | |||
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). | |||
Other server data SHOULD be remembered for later reference; if the | Other server data SHOULD be remembered for later reference; if the | |||
client does not need to remember the data, or if remembering the data | 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 | has no obvious purpose (e.g., a SEARCH response when no SEARCH | |||
command is in progress), the data can be ignored. | command is in progress), the data can be ignored. | |||
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 response | messages are found, the server sends an untagged EXISTS response | |||
reflecting the new size of the mailbox. Server implementations that | reflecting the new size of the mailbox. Server implementations that | |||
offer multiple simultaneous access to the same mailbox SHOULD also | offer multiple simultaneous access to the same mailbox SHOULD also | |||
send appropriate unilateral untagged FETCH and EXPUNGE responses if | send appropriate unilateral untagged FETCH and EXPUNGE responses if | |||
another agent changes the state of any message flags or expunges any | another agent changes the state of any message flags or expunges any | |||
messages. | messages. | |||
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. | |||
7.1. Server Responses - Generic Status Responses | 7.1. Server Responses - Generic Status Responses | |||
Status responses are OK, NO, BAD, PREAUTH and BYE. OK, NO, and BAD | 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. | |||
Status responses MAY include an OPTIONAL "response code". A response | Status responses MAY include an OPTIONAL "response 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. | |||
The currently defined response codes are: | The currently defined response codes are: | |||
ALERT | ALERT | |||
The human-readable text contains a special alert that is presented | ||||
The human-readable text contains a special alert that are | to the user in a fashion that calls the user's attention to the | |||
presented to the user in a fashion that calls the user's | message. Content of ALERT response codes received on a connection | |||
attention to the message. Content of ALERT response codes | without TLS or SASL security-layer confidentiality SHOULD be | |||
received on a connection without TLS or SASL security layer | ignored by clients. If displayed, such alerts MUST be clearly | |||
confidentiality SHOULD be ignored by clients. If displayed, | marked as potentially suspicious. (Note that some existing | |||
such alerts MUST be clearly marked as potentially suspicious. | clients are known to hyperlink returned text, which make them very | |||
(Note that some existing clients are known to hyperlink | dangerous.) Alerts received after successful establishment of a | |||
returned text which make them very dangerous.) Alerts received | TLS/SASL confidentiality layer MUST be presented to the user. | |||
after successful establishment of a TLS/SASL confidentiality | ||||
layer MUST be presented to the user. | ||||
ALREADYEXISTS | ALREADYEXISTS | |||
The operation attempts to create something that already exists, | ||||
such as when a CREATE or RENAME command attempts to create a | ||||
mailbox and there is already one of that name. | ||||
The operation attempts to create something that already exists, | C: o356 RENAME this that | |||
such as when the CREATE or RENAME directories attempt to create | S: o356 NO [ALREADYEXISTS] Mailbox "that" already exists | |||
a mailbox and there is already one of that name. | ||||
C: o356 RENAME this that | ||||
S: o356 NO [ALREADYEXISTS] Mailbox "that" already exists | ||||
APPENDUID | APPENDUID | |||
Followed by the UIDVALIDITY of the destination mailbox and the UID | ||||
assigned to the appended message in the destination mailbox, it | ||||
indicates that the message has been appended to the destination | ||||
mailbox with that UID. | ||||
Followed by the UIDVALIDITY of the destination mailbox and the | If the server also supports the [MULTIAPPEND] extension, and if | |||
UID assigned to the appended message in the destination | multiple messages were appended in the APPEND command, then the | |||
mailbox, indicates that the message has been appended to the | second value is a UID set containing the UIDs assigned to the | |||
destination mailbox with that UID. | appended messages, in the order they were transmitted in the | |||
APPEND command. This UID set may not contain extraneous UIDs or | ||||
If the server also supports the [MULTIAPPEND] extension, and if | the symbol "*". | |||
multiple messages were appended in the APPEND command, then the | ||||
second value is a UID set containing the UIDs assigned to the | ||||
appended messages, in the order they were transmitted in the | ||||
APPEND command. This UID set may not contain extraneous UIDs | ||||
or the symbol "*". | ||||
Note: the UID set form of the APPENDUID response code MUST | Note: the UID set form of the APPENDUID response code MUST NOT | |||
NOT be used if only a single message was appended. In | be used if only a single message was appended. In particular, | |||
particular, a server MUST NOT send a range such as 123:123. | a server MUST NOT send a range such as 123:123. This is | |||
This is because a client that does not support [MULTIAPPEND] | because a client that does not support [MULTIAPPEND] expects | |||
expects only a single UID and not a UID set. | only a single UID and not a UID set. | |||
UIDs are assigned in strictly ascending order in the mailbox | UIDs are assigned in strictly ascending order in the mailbox | |||
(refer to Section 2.3.1.1); note that a range of 12:10 is | (refer to Section 2.3.1.1); note that a range of 12:10 is exactly | |||
exactly equivalent to 10:12 and refers to the sequence | equivalent to 10:12 and refers to the sequence 10,11,12. | |||
10,11,12. | ||||
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. | |||
AUTHENTICATIONFAILED | AUTHENTICATIONFAILED | |||
Authentication failed for some reason on which the server is | ||||
unwilling to elaborate. Typically, this includes "unknown user" | ||||
and "bad password". | ||||
Authentication failed for some reason on which the server is | This is the same as not sending any response code, except that | |||
unwilling to elaborate. Typically, this includes "unknown | when a client sees AUTHENTICATIONFAILED, it knows that the problem | |||
user" and "bad password". | wasn't, e.g., UNAVAILABLE, so there's no point in trying the same | |||
login/password again later. | ||||
This is the same as not sending any response code, except that | ||||
when a client sees AUTHENTICATIONFAILED, it knows that the | ||||
problem wasn't, e.g., UNAVAILABLE, so there's no point in | ||||
trying the same login/password again later. | ||||
C: b LOGIN "fred" "foo" | C: b LOGIN "fred" "foo" | |||
S: b NO [AUTHENTICATIONFAILED] Authentication failed | S: b NO [AUTHENTICATIONFAILED] Authentication failed | |||
AUTHORIZATIONFAILED | AUTHORIZATIONFAILED | |||
Authentication succeeded in using the authentication identity, but | ||||
the server cannot or will not allow the authentication identity to | ||||
act as the requested authorization identity. This is only | ||||
applicable when the authentication and authorization identities | ||||
are different. | ||||
Authentication succeeded in using the authentication identity, | C: c1 AUTHENTICATE PLAIN | |||
but the server cannot or will not allow the authentication | [...] | |||
identity to act as the requested authorization identity. This | S: c1 NO [AUTHORIZATIONFAILED] No such authorization-ID | |||
is only applicable when the authentication and authorization | ||||
identities are different. | ||||
C: c1 AUTHENTICATE PLAIN | ||||
[...] | ||||
S: c1 NO [AUTHORIZATIONFAILED] No such authorization-ID | ||||
C: c2 AUTHENTICATE PLAIN | C: c2 AUTHENTICATE PLAIN | |||
[...] | [...] | |||
S: c2 NO [AUTHORIZATIONFAILED] Authenticator is not an admin | S: c2 NO [AUTHORIZATIONFAILED] Authenticator is not an admin | |||
BADCHARSET | BADCHARSET | |||
Optionally followed by a parenthesized list of charsets. A SEARCH | ||||
Optionally followed by a parenthesized list of charsets. A | failed because the given charset is not supported by this | |||
SEARCH failed because the given charset is not supported by | implementation. If the optional list of charsets is given, this | |||
this implementation. If the optional list of charsets is | lists the charsets that are supported by this implementation. | |||
given, this lists the charsets that are supported by this | ||||
implementation. | ||||
CANNOT | CANNOT | |||
This operation violates some invariant of the server and can never | ||||
succeed. | ||||
The operation violates some invariant of the server and can | C: l create "///////" | |||
never succeed. | S: l NO [CANNOT] Adjacent slashes are not supported | |||
C: l create "///////" | ||||
S: l NO [CANNOT] Adjacent slashes are not supported | ||||
CAPABILITY | CAPABILITY | |||
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 capabilities | |||
initial OK or PREAUTH response to transmit an initial | list. It can also appear in tagged responses to LOGIN or | |||
capabilities list. It can also appear in tagged responses to | AUTHENTICATE commands. This makes it unnecessary for a client to | |||
LOGIN or AUTHENTICATE commands. This makes it unnecessary for | send a separate CAPABILITY command if it recognizes this response | |||
a client to send a separate CAPABILITY command if it recognizes | code and there was no change to the TLS and/or authentication | |||
this response code and there was no change to the TLS and/or | state since it was received. | |||
authentication state since it was received. | ||||
CLIENTBUG | CLIENTBUG | |||
The server has detected a client bug. This can accompany any of | ||||
OK, NO, and BAD, depending on what the client bug is. | ||||
The server has detected a client bug. This can accompany all | C: k1 select "/archive/projects/experiment-iv" | |||
of OK, NO, and BAD, depending on what the client bug is. | [...] | |||
S: k1 OK [READ-ONLY] Done | ||||
C: k1 select "/archive/projects/experiment-iv" | C: k2 status "/archive/projects/experiment-iv" (messages) | |||
[...] | [...] | |||
S: k1 OK [READ-ONLY] Done | S: k2 OK [CLIENTBUG] Done | |||
C: k2 status "/archive/projects/experiment-iv" (messages) | ||||
[...] | ||||
S: k2 OK [CLIENTBUG] Done | ||||
CLOSED | CLOSED | |||
The CLOSED response code has no parameters. A server returns the | ||||
CLOSED response code when the currently selected mailbox is closed | ||||
implicitly using the SELECT or EXAMINE command on another mailbox. | ||||
The CLOSED response code serves as a boundary between responses | ||||
for the previously opened mailbox (which was closed) and the newly | ||||
selected mailbox; all responses before the CLOSED response code | ||||
relate to the mailbox that was closed, and all subsequent | ||||
responses relate to the newly opened mailbox. | ||||
The CLOSED response code has no parameters. A server return | There is no need to return the CLOSED response code on completion | |||
the CLOSED response code when the currently selected mailbox is | of the CLOSE or the UNSELECT command (or similar), whose purpose | |||
closed implicitly using the SELECT/EXAMINE command on another | is to close the currently selected mailbox without opening a new | |||
mailbox. The CLOSED response code serves as a boundary between | one. | |||
responses for the previously opened mailbox (which was closed) | ||||
and the newly selected mailbox; all responses before the CLOSED | ||||
response code relate to the mailbox that was closed, and all | ||||
subsequent responses relate to the newly opened mailbox. | ||||
There is no need to return the CLOSED response code on | ||||
completion of the CLOSE or the UNSELECT command (or similar), | ||||
whose purpose is to close the currently selected mailbox | ||||
without opening a new one. | ||||
CONTACTADMIN | CONTACTADMIN | |||
The user should contact the system administrator or support desk. | ||||
The user should contact the system administrator or support | C: e login "fred" "foo" | |||
desk. | S: e NO [CONTACTADMIN] | |||
C: e login "fred" "foo" | ||||
S: e NO [CONTACTADMIN] | ||||
COPYUID | COPYUID | |||
Followed by the UIDVALIDITY of the destination mailbox, a UID set | ||||
containing the UIDs of the message(s) in the source mailbox that | ||||
were copied to the destination mailbox, followed by another UID | ||||
set containing the UIDs assigned to the copied message(s) in the | ||||
destination mailbox, indicates that the message(s) has been copied | ||||
to the destination mailbox with the stated UID(s). | ||||
Followed by the UIDVALIDITY of the destination mailbox, a UID | The source UID set is in the order the message(s) was copied; the | |||
set containing the UIDs of the message(s) in the source mailbox | destination UID set corresponds to the source UID set and is in | |||
that were copied to the destination mailbox, followed by | the same order. Neither of the UID sets may contain extraneous | |||
another UID set containing the UIDs assigned to the copied | UIDs or the symbol "*". | |||
message(s) in the destination mailbox, indicates that the | ||||
message(s) have been copied to the destination mailbox with the | ||||
stated UID(s). | ||||
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 the same order. Neither of the UID sets may contain | ||||
extraneous UIDs or the symbol "*". | ||||
UIDs are assigned in strictly ascending order in the mailbox | UIDs are assigned in strictly ascending order in the mailbox | |||
(refer to Section 2.3.1.1); note that a range of 12:10 is | (refer to Section 2.3.1.1); note that a range of 12:10 is exactly | |||
exactly equivalent to 10:12 and refers to the sequence | equivalent to 10:12 and refers to the sequence 10,11,12. | |||
10,11,12. | ||||
This response code is returned in a tagged OK response to the | This response code is returned in a tagged OK response to the COPY | |||
COPY/UID COPY command or in the untagged OK response to the | or UID COPY command or in the untagged OK response to the MOVE or | |||
MOVE/UID MOVE command. | UID MOVE command. | |||
CORRUPTION | CORRUPTION | |||
The server discovered that some relevant data (e.g., the mailbox) | ||||
are corrupt. This response code does not include any information | ||||
about what's corrupt, but the server can write that to its | ||||
logfiles. | ||||
The server discovered that some relevant data (e.g., the | C: i select "/archive/projects/experiment-iv" | |||
mailbox) are corrupt. This response code does not include any | S: i NO [CORRUPTION] Cannot open mailbox | |||
information about what's corrupt, but the server can write that | ||||
to its logfiles. | ||||
C: i select "/archive/projects/experiment-iv" | ||||
S: i NO [CORRUPTION] Cannot open mailbox | ||||
EXPIRED | EXPIRED | |||
Either authentication succeeded or the server no longer had the | ||||
necessary data; either way, access is no longer permitted using | ||||
that passphrase. The client or user should get a new passphrase. | ||||
Either authentication succeeded or the server no longer had the | C: d login "fred" "foo" | |||
necessary data; either way, access is no longer permitted using | S: d NO [EXPIRED] That password isn't valid any more | |||
that passphrase. The client or user should get a new | ||||
passphrase. | ||||
C: d login "fred" "foo" | ||||
S: d NO [EXPIRED] That password isn't valid any more | ||||
EXPUNGEISSUED | EXPUNGEISSUED | |||
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. [IMAP-MULTIACCESS] | client may want to issue NOOP soon. [IMAP-MULTIACCESS] discusses | |||
discusses this subject in depth. | this subject in depth. | |||
C: h search from maria@example.com | C: h search from maria@example.com | |||
S: * ESEARCH (TAG "h") ALL 1:3,5,8,13,21,42 | S: * ESEARCH (TAG "h") ALL 1:3,5,8,13,21,42 | |||
S: h OK [EXPUNGEISSUED] Search completed | S: h OK [EXPUNGEISSUED] Search completed | |||
HASCHILDREN | HASCHILDREN | |||
The mailbox delete operation failed because the mailbox has one or | ||||
more children, and the server doesn't allow deletion of mailboxes | ||||
with children. | ||||
The mailbox delete operation failed because the mailbox has one | C: m356 DELETE Notes | |||
or more children and the server doesn't allow deletion of | S: o356 NO [HASCHILDREN] Mailbox "Notes" has children | |||
mailboxes with children. | that need to be deleted first | |||
C: m356 DELETE Notes | ||||
S: o356 NO [HASCHILDREN] Mailbox "Notes" has children that need | ||||
to be deleted first | ||||
INUSE | INUSE | |||
An operation has not been carried out because it involves sawing | ||||
off a branch someone else is sitting on. Someone else may be | ||||
holding an exclusive lock needed for this operation, or the | ||||
operation may involve deleting a resource someone else is using, | ||||
typically a mailbox. | ||||
An operation has not been carried out because it involves | The operation may succeed if the client tries again later. | |||
sawing off a branch someone else is sitting on. Someone else | ||||
may be holding an exclusive lock needed for this operation, or | ||||
the operation may involve deleting a resource someone else is | ||||
using, typically a mailbox. | ||||
The operation may succeed if the client tries again later. | ||||
C: g delete "/archive/projects/experiment-iv" | C: g delete "/archive/projects/experiment-iv" | |||
S: g NO [INUSE] Mailbox in use | S: g NO [INUSE] Mailbox in use | |||
LIMIT | LIMIT | |||
The operation ran up against an implementation limit of some kind, | ||||
such as the number of flags on a single message or the number of | ||||
flags used in a mailbox. | ||||
The operation ran up against an implementation limit of some | C: m STORE 42 FLAGS f1 f2 f3 f4 f5 ... f250 | |||
kind, such as the number of flags on a single message or the | S: m NO [LIMIT] At most 32 flags in one mailbox supported | |||
number of flags used in a mailbox. | ||||
C: m STORE 42 FLAGS f1 f2 f3 f4 f5 ... f250 | ||||
S: m NO [LIMIT] At most 32 flags in one mailbox supported | ||||
NONEXISTENT | NONEXISTENT | |||
The operation attempts to delete something that does not exist. | ||||
Similar to ALREADYEXISTS. | ||||
The operation attempts to delete something that does not exist. | C: p RENAME this that | |||
Similar to ALREADYEXISTS. | S: p NO [NONEXISTENT] No such mailbox | |||
C: p RENAME this that | ||||
S: p NO [NONEXISTENT] No such mailbox | ||||
NOPERM | NOPERM | |||
The access control system (e.g., ACL; see [RFC4314]) does not | ||||
permit this user to carry out an operation, such as selecting or | ||||
creating a mailbox. | ||||
The access control system (e.g., Access Control List (ACL), see | C: f select "/archive/projects/experiment-iv" | |||
[RFC4314]) does not permit this user to carry out an operation, | S: f NO [NOPERM] Access denied | |||
such as selecting or creating a mailbox. | ||||
C: f select "/archive/projects/experiment-iv" | ||||
S: f NO [NOPERM] Access denied | ||||
OVERQUOTA | OVERQUOTA | |||
The user would be over quota after the operation. (The user may | ||||
or may not be over quota already.) | ||||
The user would be over quota after the operation. (The user | Note that if the server sends OVERQUOTA but doesn't support the | |||
may or may not be over quota already.) | IMAP QUOTA extension defined by [RFC2087], then there is a quota, | |||
but the client cannot find out what the quota is. | ||||
Note that if the server sends OVERQUOTA but doesn't support the | ||||
IMAP QUOTA extension defined by [RFC2087], then there is a | ||||
quota, but the client cannot find out what the quota is. | ||||
C: n1 uid copy 1:* oldmail | C: n1 uid copy 1:* oldmail | |||
S: n1 NO [OVERQUOTA] Sorry | S: n1 NO [OVERQUOTA] Sorry | |||
C: n2 uid copy 1:* oldmail | C: n2 uid copy 1:* oldmail | |||
S: n2 OK [OVERQUOTA] You are now over your soft quota | S: n2 OK [OVERQUOTA] You are now over your soft quota | |||
PARSE | PARSE | |||
The human-readable text represents an error in parsing the | ||||
The human-readable text represents an error in parsing the | [RFC5322] header or [MIME-IMB] headers of a message in the | |||
[RFC-5322] header or [MIME-IMB] headers of a message in the | mailbox. | |||
mailbox. | ||||
PERMANENTFLAGS | PERMANENTFLAGS | |||
Followed by a parenthesized list of flags and indicates which of | ||||
the known flags the client can change permanently. Any flags that | ||||
are in the FLAGS untagged response, but not in the PERMANENTFLAGS | ||||
list, cannot be set permanently. The PERMANENTFLAGS list can also | ||||
include the special flag \*, which indicates that it is possible | ||||
to create new keywords by attempting to store those keywords in | ||||
the mailbox. If the client attempts to STORE a flag that is not | ||||
in the PERMANENTFLAGS list, the server will either ignore the | ||||
change or store the state change for the remainder of the current | ||||
session only. | ||||
Followed by a parenthesized list of flags, indicates which of | There is no need for a server that included the special flag \* to | |||
the known flags the client can change permanently. Any flags | return a new PERMANENTFLAGS response code when a new keyword was | |||
that are in the FLAGS untagged response, but not the | successfully set on a message upon client request. However, if | |||
PERMANENTFLAGS list, can not be set permanently. The | the server has a limit on the number of different keywords that | |||
PERMANENTFLAGS list can also include the special flag \*, which | can be stored in a mailbox and that limit is reached, the server | |||
indicates that it is possible to create new keywords by | MUST send a new PERMANENTFLAGS response code without the special | |||
attempting to store those keywords in the mailbox. If the | flag \*. | |||
client attempts to STORE a flag that is not in the | ||||
PERMANENTFLAGS list, the server will either ignore the change | ||||
or store the state change for the remainder of the current | ||||
session only. | ||||
There is no need for a server that included the special flag \* | ||||
to return a new PERMANENTFLAGS response code when a new keyword | ||||
was successfully set on a message upon client request. 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, the | ||||
server MUST send a new PERMANENTFLAGS response code without the | ||||
special flag \*. | ||||
PRIVACYREQUIRED | PRIVACYREQUIRED | |||
The operation is not permitted due to a lack of data | ||||
confidentiality. If TLS is not in use, the client could try | ||||
STARTTLS (see Section 6.2.1) or alternatively reconnect on an | ||||
Implicit TLS port, and then repeat the operation. | ||||
The operation is not permitted due to a lack of data | C: d login "fred" "foo" | |||
confidentiality. If Transport Layer Security (TLS) is not in | S: d NO [PRIVACYREQUIRED] Connection offers no privacy | |||
use, the client could try STARTTLS (see Section 6.2.1) or | ||||
alternatively reconnect on Implicit TLS port, and then repeat | ||||
the operation. | ||||
C: d login "fred" "foo" | ||||
S: d NO [PRIVACYREQUIRED] Connection offers no privacy | ||||
C: d select inbox | C: d select inbox | |||
S: d NO [PRIVACYREQUIRED] Connection offers no privacy | S: d NO [PRIVACYREQUIRED] Connection offers no privacy | |||
READ-ONLY | READ-ONLY | |||
The mailbox is selected as read-only, or its access while selected | ||||
The mailbox is selected read-only, or its access while selected | has changed from read-write to read-only. | |||
has changed from read-write to read-only. | ||||
READ-WRITE | READ-WRITE | |||
The mailbox is selected as read-write, or its access while | ||||
The mailbox is selected read-write, or its access while | selected has changed from read-only to read-write. | |||
selected has changed from read-only to read-write. | ||||
SERVERBUG | SERVERBUG | |||
The server encountered a bug in itself or violated one of its own | ||||
invariants. | ||||
The server encountered a bug in itself or violated one of its | C: j select "/archive/projects/experiment-iv" | |||
own invariants. | S: j NO [SERVERBUG] This should not happen | |||
C: j select "/archive/projects/experiment-iv" | ||||
S: j NO [SERVERBUG] This should not happen | ||||
TRYCREATE | TRYCREATE | |||
An APPEND, COPY, or MOVE attempt is failing because the target | ||||
An APPEND, COPY or MOVE attempt is failing because the target | mailbox does not exist (as opposed to some other reason). This is | |||
mailbox does not exist (as opposed to some other reason). This | a hint to the client that the operation can succeed if the mailbox | |||
is a hint to the client that the operation can succeed if the | is first created by the CREATE command. | |||
mailbox is first created by the CREATE command. | ||||
UIDNEXT | UIDNEXT | |||
Followed by a decimal number, indicates the next unique | Followed by a decimal number and indicates the next unique | |||
identifier value. Refer to Section 2.3.1.1 for more | identifier value. Refer to Section 2.3.1.1 for more information. | |||
information. | ||||
UIDNOTSTICKY | UIDNOTSTICKY | |||
The selected mailbox is supported by a mail store that does not | ||||
support persistent UIDs; that is, UIDVALIDITY will be different | ||||
each time the mailbox is selected. Consequently, APPEND or COPY | ||||
to this mailbox will not return an APPENDUID or COPYUID response | ||||
code. | ||||
The selected mailbox is supported by a mail store that does not | This response code is returned in an untagged NO response to the | |||
support persistent UIDs; that is, UIDVALIDITY will be different | SELECT command. | |||
each time the mailbox is selected. Consequently, APPEND or | ||||
COPY to this mailbox will not return an APPENDUID or COPYUID | ||||
response code. | ||||
This response code is returned in an untagged NO response to | ||||
the SELECT command. | ||||
Note: servers SHOULD NOT have any UIDNOTSTICKY mail stores. | Note: servers SHOULD NOT have any UIDNOTSTICKY mail stores. | |||
This facility exists to support legacy mail stores in which | This facility exists to support legacy mail stores in which it | |||
it is technically infeasible to support persistent UIDs. | is technically infeasible to support persistent UIDs. This | |||
This should be avoided when designing new mail stores. | should be avoided when designing new mail stores. | |||
UIDVALIDITY | UIDVALIDITY | |||
Followed by a decimal number and indicates the unique identifier | ||||
Followed by a decimal number, indicates the unique identifier | validity value. Refer to Section 2.3.1.1 for more information. | |||
validity value. Refer to Section 2.3.1.1 for more information. | ||||
UNAVAILABLE | UNAVAILABLE | |||
Temporary failure because a subsystem is down. For example, an | ||||
IMAP server that uses a Lightweight Directory Access Protocol | ||||
(LDAP) or Radius server for authentication might use this response | ||||
code when the LDAP/Radius server is down. | ||||
Temporary failure because a subsystem is down. For example, an | C: a LOGIN "fred" "foo" | |||
IMAP server that uses a Lightweight Directory Access Protocol | S: a NO [UNAVAILABLE] User's backend down for maintenance | |||
(LDAP) or Radius server for authentication might use this | ||||
response code when the LDAP/Radius server is down. | ||||
C: a LOGIN "fred" "foo" | ||||
S: a NO [UNAVAILABLE] User's backend down for maintenance | ||||
UNKNOWN-CTE | UNKNOWN-CTE | |||
The server does not know how to decode the section's Content- | ||||
The server does not know how to decode the section's Content- | Transfer-Encoding. | |||
Transfer-Encoding. | ||||
Client implementations MUST ignore response codes that they do not | Client implementations MUST ignore response codes that they do not | |||
recognize. | recognize. | |||
7.1.1. OK Response | 7.1.1. OK Response | |||
Contents: OPTIONAL response code | Contents: | |||
OPTIONAL response code | ||||
human-readable text | human-readable text | |||
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 an | command. The human-readable text MAY be presented to the user as an | |||
information message. The untagged form indicates an information-only | information message. The untagged form indicates an information-only | |||
message; the nature of the information MAY be indicated by a response | message; the nature of the information MAY be indicated by a response | |||
code. | code. | |||
The untagged form is also used as one of three possible greetings at | The untagged form is also used as one of three possible greetings at | |||
connection startup. It indicates that the connection is not yet | connection startup. It indicates that the connection is not yet | |||
authenticated and that a LOGIN or an AUTHENTICATE command is needed. | authenticated and that a LOGIN or an AUTHENTICATE command is needed. | |||
Example: S: * OK IMAP4rev2 server ready | Example: | |||
C: A001 LOGIN fred blurdybloop | ||||
S: * OK [ALERT] System shutdown in 10 minutes | S: * OK IMAP4rev2 server ready | |||
S: A001 OK LOGIN Completed | C: A001 LOGIN fred blurdybloop | |||
S: * OK [ALERT] System shutdown in 10 minutes | ||||
S: A001 OK LOGIN Completed | ||||
7.1.2. NO Response | 7.1.2. NO Response | |||
Contents: OPTIONAL response code | Contents: | |||
OPTIONAL response code | ||||
human-readable text | human-readable text | |||
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. | |||
Example: C: A222 COPY 1:2 owatagusiam | Example: | |||
S: * NO Disk is 98% full, please delete unnecessary data | ||||
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 | |||
S: * NO Disk is 99% full, please delete unnecessary data | ||||
S: A223 NO COPY failed: disk is full | ||||
7.1.3. BAD Response | 7.1.3. BAD Response | |||
Contents: OPTIONAL response code | Contents: | |||
OPTIONAL response code | ||||
human-readable text | human-readable text | |||
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. | |||
Example: C: ...very long command line... | Example: | |||
S: * BAD Command line too long | ||||
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! | |||
S: * OK Salvage successful, no data lost | ||||
S: A443 OK Expunge completed | ||||
7.1.4. PREAUTH Response | 7.1.4. PREAUTH Response | |||
Contents: OPTIONAL response code | Contents: | |||
OPTIONAL response code | ||||
human-readable text | human-readable text | |||
The PREAUTH response is always untagged, and is one of three possible | The PREAUTH response is always untagged and is one of three possible | |||
greetings at connection startup. It indicates that the connection | greetings at connection startup. It indicates that the connection | |||
has already been authenticated by external means; thus no LOGIN/ | has already been authenticated by external means; thus, no LOGIN/ | |||
AUTHENTICATE command is needed. | AUTHENTICATE command is needed. | |||
Because PREAUTH moves the connection directly to the authenticated | Because PREAUTH moves the connection directly to the authenticated | |||
state, it effectively prevents the client from using the STARTTLS | state, it effectively prevents the client from using the STARTTLS | |||
command Section 6.2.1. For this reason PREAUTH response SHOULD only | command (Section 6.2.1). For this reason, the PREAUTH response | |||
be returned by servers on connections that are protected by TLS (such | SHOULD only be returned by servers on connections that are protected | |||
as on implicit TLS port [RFC8314]) or protected through other means | by TLS (such as on an Implicit TLS port [RFC8314]) or protected | |||
such as IPSec. Clients that require mandatory TLS MUST close the | through other means such as IPsec. Clients that require mandatory | |||
connection after receiving PREAUTH response on a non protected port. | TLS MUST close the connection after receiving the PREAUTH response on | |||
a non-protected port. | ||||
Example: S: * PREAUTH IMAP4rev2 server logged in as Smith | Example: | |||
S: * PREAUTH IMAP4rev2 server logged in as Smith | ||||
7.1.5. BYE Response | 7.1.5. BYE Response | |||
Contents: OPTIONAL response code | Contents: | |||
OPTIONAL response code | ||||
human-readable text | human-readable text | |||
The BYE response is always untagged, and indicates that the server is | The BYE response is always untagged and indicates that the server is | |||
about to close the connection. The human-readable text MAY be | about to close the connection. The human-readable text MAY 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: | |||
1. as part of a normal logout sequence. The server will close the | 1. as part of a normal logout sequence. The server will close the | |||
connection after sending the tagged OK response to the LOGOUT | connection after sending the tagged OK response to the LOGOUT | |||
command. | command. | |||
2. as a panic shutdown announcement. The server closes the | 2. as a panic shutdown announcement. The server closes the | |||
connection immediately. | connection immediately. | |||
skipping to change at page 115, line 18 ¶ | skipping to change at line 5383 ¶ | |||
3. as an announcement of an inactivity autologout. The server | 3. as an announcement of an inactivity autologout. The server | |||
closes the connection immediately. | closes the connection immediately. | |||
4. as one of three possible greetings at connection startup, | 4. as one of three possible greetings at connection startup, | |||
indicating that the server is not willing to accept a connection | indicating that the server is not willing to accept a connection | |||
from this client. The server closes the connection immediately. | from this client. The server closes the connection immediately. | |||
The difference between a BYE that occurs as part of a normal LOGOUT | The difference between a BYE that occurs as part of a normal LOGOUT | |||
sequence (the first case) and a BYE that occurs because of a failure | sequence (the first case) and a BYE that occurs because of a failure | |||
(the other three cases) is that the connection closes immediately in | (the other three cases) is that the connection closes immediately in | |||
the failure case. In all cases the client SHOULD continue to read | the failure case. In all cases, the client SHOULD continue to read | |||
response data from the server until the connection is closed; this | response data from the server until the connection is closed; this | |||
will ensure that any pending untagged or completion responses are | will ensure that any pending untagged or completion responses are | |||
read and processed. | read and processed. | |||
Example: S: * BYE Autologout; idle for too long | Example: | |||
S: * BYE Autologout; idle for too long | ||||
7.2. Server Responses - Server Status | 7.2. Server Responses - Server Status | |||
These responses are always untagged. This is how server status data | These responses are always untagged. This is how server status data | |||
are transmitted from the server to the client. | are transmitted from the server to the client. | |||
7.2.1. ENABLED Response | 7.2.1. ENABLED Response | |||
Contents: capability listing | Contents: capability listing | |||
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. | |||
Example: S: * ENABLED CONDSTORE QRESYNC | Example: | |||
S: * ENABLED CONDSTORE QRESYNC | ||||
7.2.2. CAPABILITY Response | 7.2.2. CAPABILITY Response | |||
Contents: capability listing | Contents: capability listing | |||
The CAPABILITY response occurs as a result of a CAPABILITY command. | The CAPABILITY response occurs as a result of a CAPABILITY command. | |||
The capability listing contains a space-separated listing of | The capability listing contains a space-separated listing of | |||
capability names that the server supports. The capability listing | capability names that the server supports. The capability listing | |||
MUST include the atom "IMAP4rev2", but note that it doesn't have to | MUST include the atom "IMAP4rev2", but note that it doesn't have to | |||
be the first capability listed. The order of capability names has no | be the first capability listed. The order of capability names has no | |||
significance. | significance. | |||
In addition, client and server implementations MUST implement the | Client and server implementations MUST implement the capabilities | |||
"STARTTLS" and "LOGINDISABLED" (only on the cleartext port), and | "AUTH=PLAIN" (described in [PLAIN]), and MUST implement "STARTTLS" | |||
"AUTH=PLAIN" (described in [PLAIN]) capabilities. See the Security | and "LOGINDISABLED" on the cleartext port. See the Security | |||
Considerations (Section 11) for important information related to | Considerations (Section 11) for important information related to | |||
these capabilities. | these capabilities. | |||
A capability name which begins with "AUTH=" indicates that the server | A capability name that begins with "AUTH=" indicates that the server | |||
supports that particular authentication mechanism [SASL]. | supports that particular authentication mechanism [SASL]. | |||
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 response | disabled, and that the server will respond with a tagged NO response | |||
to any attempt to use the LOGIN command even if the user name and | to any attempt to use the LOGIN command even if the user name and | |||
password are valid. An IMAP client MUST NOT issue the LOGIN command | password are valid (their validity will not be checked). An IMAP | |||
if the server advertises the LOGINDISABLED capability. | client MUST NOT issue the LOGIN command if the server advertises the | |||
LOGINDISABLED capability. | ||||
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. If | extension, revision, or amendment to the IMAP4rev2 protocol. If | |||
IMAP4rev1 capability is not advertised, server responses MUST conform | IMAP4rev1 capability is not advertised, server responses MUST conform | |||
to this document until the client issues a command that uses the | to this document until the client issues a command that uses an | |||
associated capability. If both IMAP4rev1 and IMAP4rev2 capabilities | additional capability. If both IMAP4rev1 and IMAP4rev2 capabilities | |||
are advertised, server responses MUST conform to RFC 3501 until the | are advertised, server responses MUST conform to [RFC3501] until the | |||
client issues a command that uses the associated capability. (For | client issues a command that uses an additional capability. (For | |||
example, the client can issue ENABLE IMAP4rev2 to enable IMAP4rev2 | example, the client can issue ENABLE IMAP4rev2 to enable | |||
specific behaviour). | IMAP4rev2-specific behavior.) | |||
Capability names SHOULD be registered with IANA using RFC Required | Capability names SHOULD be registered with IANA using the RFC | |||
policy. A server SHOULD NOT offer unregistered capability names. | Required policy [RFC8126]. A server SHOULD NOT offer unregistered | |||
capability names. | ||||
Client implementations SHOULD NOT require any capability name other | Client implementations SHOULD NOT require any capability name other | |||
than "IMAP4rev2", and possibly "STARTTLS" and "LOGINDISABLED" (on a | than "IMAP4rev2", and possibly "STARTTLS" and "LOGINDISABLED" (on a | |||
cleartext port). Client implementations MUST ignore any unknown | cleartext port). Client implementations MUST ignore any unknown | |||
capability names. | capability names. | |||
A server MAY send capabilities automatically, by using the CAPABILITY | A server MAY send capabilities automatically, by using the CAPABILITY | |||
response code in the initial PREAUTH or OK responses, and by sending | response code in the initial PREAUTH or OK responses and by sending | |||
an updated CAPABILITY response code in the tagged OK response as part | an updated CAPABILITY response code in the tagged OK response as part | |||
of a successful authentication. It is unnecessary for a client to | of a successful authentication. It is unnecessary for a client to | |||
send a separate CAPABILITY command if it recognizes these automatic | send a separate CAPABILITY command if it recognizes these automatic | |||
capabilities and there was no change to the TLS and/or authentication | capabilities and there was no change to the TLS and/or authentication | |||
state since they were received. | state since they were received. | |||
The list of capabilities returned by a server MAY change during the | The list of capabilities returned by a server MAY change during the | |||
connection. In particular, it is quite common for the server to | connection. In particular, it is quite common for the server to | |||
change list of capabilities after successful TLS negotiation | change the list of capabilities after successful TLS negotiation | |||
(STARTTLS command) and/or after successful authentication | (STARTTLS command) and/or after successful authentication | |||
(AUTHENTICATE or LOGIN commands). | (AUTHENTICATE or LOGIN commands). | |||
Example: S: * CAPABILITY STARTTLS AUTH=GSSAPI IMAP4rev2 LOGINDISABLED | Example: | |||
XPIG-LATIN | ||||
Note that in the above example XPIG-LATIN is a fictitious capability | S: * CAPABILITY STARTTLS AUTH=GSSAPI IMAP4rev2 LOGINDISABLED | |||
XPIG-LATIN | ||||
Note that in the above example, XPIG-LATIN is a fictitious capability | ||||
name. | name. | |||
7.3. Server Responses - Mailbox Status | 7.3. Server Responses - Mailbox Status | |||
These responses are always untagged. This is how mailbox status data | These responses are always untagged. This is how mailbox status data | |||
are transmitted from the server to the client. Many of these | are transmitted from the server to the client. Many of these | |||
responses typically result from a command with the same name. | responses typically result from a command with the same name. | |||
7.3.1. LIST Response | 7.3.1. LIST Response | |||
Contents: name attributes | Contents: | |||
name attributes | ||||
hierarchy delimiter | hierarchy delimiter | |||
name | name | |||
OPTIONAL extension data | OPTIONAL extension data | |||
The LIST response occurs as a result of a LIST command. It returns a | The LIST response occurs as a result of a LIST command. It returns a | |||
single name that matches the LIST specification. There can be | single name that matches the LIST specification. There can be | |||
multiple LIST responses for a single LIST command. | multiple LIST responses for a single LIST command. | |||
The following base mailbox name attributes are defined: | The following base mailbox name attributes are defined: | |||
\NonExistent The "\NonExistent" attribute indicates that a mailbox | \NonExistent | |||
name does not refer to an existing mailbox. Note that this | The "\NonExistent" attribute indicates that a mailbox name does | |||
attribute is not meaningful by itself, as mailbox names that match | not refer to an existing mailbox. Note that this attribute is not | |||
the canonical LIST pattern but don't exist must not be returned | meaningful by itself, as mailbox names that match the canonical | |||
unless one of the two conditions listed below is also satisfied: | LIST pattern but don't exist must not be returned unless one of | |||
the two conditions listed below is also satisfied: | ||||
1. The mailbox name also satisfies the selection criteria (for | 1. The mailbox name also satisfies the selection criteria (for | |||
example, it is subscribed and the "SUBSCRIBED" selection | example, it is subscribed and the "SUBSCRIBED" selection | |||
option has been specified). | option has been specified). | |||
2. "RECURSIVEMATCH" has been specified, and the mailbox name has | 2. "RECURSIVEMATCH" has been specified, and the mailbox name has | |||
at least one descendant mailbox name that does not match the | at least one descendant mailbox name that does not match the | |||
LIST pattern and does match the selection criteria. | LIST pattern and does match the selection criteria. | |||
In practice, this means that the "\NonExistent" attribute is | In practice, this means that the "\NonExistent" attribute is | |||
usually returned with one or more of "\Subscribed", "\Remote", | usually returned with one or more of "\Subscribed", "\Remote", | |||
"\HasChildren", or the CHILDINFO extended data item. | "\HasChildren", or the CHILDINFO extended data item. | |||
The "\NonExistent" attribute implies "\NoSelect". | The "\NonExistent" attribute implies "\NoSelect". | |||
\Noinferiors It is not possible for any child levels of hierarchy to | \Noinferiors | |||
exist under this name; no child levels exist now and none can be | It is not possible for any child levels of hierarchy to exist | |||
created in the future. | under this name; no child levels exist now and none can be created | |||
in the future. | ||||
\Noselect It is not possible to use this name as a selectable | \Noselect | |||
mailbox. | It is not possible to use this name as a selectable mailbox. | |||
\HasChildren The presence of this attribute indicates that the | \HasChildren | |||
mailbox has child mailboxes. A server SHOULD NOT set this | The presence of this attribute indicates that the mailbox has | |||
attribute if there are child mailboxes and the user does not have | child mailboxes. A server SHOULD NOT set this attribute if there | |||
permission to access any of them. In this case, \HasNoChildren | are child mailboxes and the user does not have permission to | |||
SHOULD be used. In many cases, however, a server may not be able | access any of them. In this case, \HasNoChildren SHOULD be used. | |||
to efficiently compute whether a user has access to any child | In many cases, however, a server may not be able to efficiently | |||
mailbox. Note that even though the \HasChildren attribute for a | compute whether a user has access to any child mailboxes. Note | |||
mailbox must be correct at the time of processing of the mailbox, | that even though the \HasChildren attribute for a mailbox must be | |||
a client must be prepared to deal with a situation when a mailbox | correct at the time of processing the mailbox, a client must be | |||
is marked with the \HasChildren attribute, but no child mailbox | prepared to deal with a situation when a mailbox is marked with | |||
appears in the response to the LIST command. This might happen, | the \HasChildren attribute, but no child mailbox appears in the | |||
for example, due to children mailboxes being deleted or made | response to the LIST command. This might happen, for example, due | |||
inaccessible to the user (using access control) by another client | to child mailboxes being deleted or made inaccessible to the user | |||
before the server is able to list them. | (using access control) by another client before the server is able | |||
to list them. | ||||
\HasNoChildren The presence of this attribute indicates that the | \HasNoChildren | |||
mailbox has NO child mailboxes that are accessible to the | The presence of this attribute indicates that the mailbox has NO | |||
currently authenticated user. | child mailboxes that are accessible to the currently authenticated | |||
user. | ||||
\Marked The mailbox has been marked "interesting" by the server; the | \Marked | |||
The mailbox has been marked "interesting" by the server; the | ||||
mailbox probably contains messages that have been added since the | mailbox probably contains messages that have been added since the | |||
last time the mailbox was selected. | last time the mailbox was selected. | |||
\Unmarked The mailbox does not contain any additional messages since | \Unmarked | |||
the last time the mailbox was selected. | The mailbox does not contain any additional messages since the | |||
last time the mailbox was selected. | ||||
\Subscribed The mailbox name was subscribed to using the SUBSCRIBE | \Subscribed | |||
command. | The mailbox name was subscribed to using the SUBSCRIBE command. | |||
\Remote The mailbox is a remote mailbox. | \Remote | |||
The mailbox is a remote mailbox. | ||||
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 | attributes present should act as if both are absent in the LIST | |||
response. | response. | |||
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 child mailboxes | \NoInferiors attribute, which indicates that no child mailboxes | |||
exist now and none can be created in the future. | exist now and none can be created in the future. | |||
If it is not feasible for the server to determine whether or not the | If it is not feasible for the server to determine whether or not the | |||
mailbox is "interesting", the server SHOULD NOT send either \Marked | mailbox is "interesting", the server SHOULD NOT send either \Marked | |||
or \Unmarked. The server MUST NOT send more than one of \Marked, | or \Unmarked. The server MUST NOT send more than one of \Marked, | |||
\Unmarked, and \Noselect for a single mailbox, and MAY send none of | \Unmarked, and \Noselect for a single mailbox, and it MAY send none | |||
these. | of these. | |||
In addition to the base mailbox name attributes defined above, an | In addition to the base mailbox name attributes defined above, an | |||
IMAP server MAY also include any or all of the following attributes | IMAP server MAY also include any or all of the following attributes | |||
that denote "role" (or "special-use") of a mailbox. These attributes | that denote "role" (or "special-use") of a mailbox. These attributes | |||
are included along with base attributes defined above. A given | are included along with base attributes defined above. A given | |||
mailbox may have none, one, or more than one of these attributes. In | mailbox may 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 | some cases, 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 | that mailbox. In other cases, it's advice to a client about what to | |||
expect to find there. | expect to find there. | |||
\All This mailbox presents all messages in the user's message store. | \All | |||
This mailbox presents all messages in the user's message store. | ||||
Implementations MAY omit some messages, such as, perhaps, those in | Implementations MAY omit some messages, such as, perhaps, those in | |||
\Trash and \Junk. When this special use is supported, it is | \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. | |||
\Archive This mailbox is used to archive messages. The meaning of | \Archive | |||
an "archival" mailbox is server-dependent; typically, it will be | This mailbox is used to archive messages. The meaning of an | |||
used to get messages out of the inbox, or otherwise keep them out | "archival" mailbox is server dependent; typically, it will be used | |||
of the user's way, while still making them accessible. | to get messages out of the inbox, or otherwise keep them out of | |||
the user's way, while still making them accessible. | ||||
\Drafts This mailbox is used to hold draft messages -- typically, | \Drafts | |||
messages that are being composed but have not yet been sent. In | This mailbox is used to hold draft messages -- typically, messages | |||
some server implementations, this might be a virtual mailbox, | that are being composed but have not yet been sent. In some | |||
server implementations, this might be a virtual mailbox, | ||||
containing messages from other mailboxes that are marked with the | containing messages from other mailboxes that are marked with the | |||
"\Draft" message flag. Alternatively, this might just be advice | "\Draft" message flag. Alternatively, this might just be advice | |||
that a client put drafts here. | that a client put drafts here. | |||
\Flagged This mailbox presents all messages marked in some way as | \Flagged | |||
This mailbox presents all messages marked in some way as | ||||
"important". When this special use is supported, it is likely to | "important". When this special use is supported, it is likely to | |||
represent a virtual mailbox collecting messages (from other | 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. | |||
\Junk This mailbox is where messages deemed to be junk mail are | \Junk | |||
held. Some server implementations might put messages here | This mailbox is where messages deemed to be junk mail are held. | |||
automatically. Alternatively, this might just be advice to a | Some server implementations might put messages here automatically. | |||
client-side spam filter. | Alternatively, this might just be advice to a client-side spam | |||
filter. | ||||
\Sent This mailbox is used to hold copies of messages that have been | \Sent | |||
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. | |||
\Trash This mailbox is used to hold messages that have been deleted | \Trash | |||
or marked for deletion. In some server implementations, this | This mailbox is used to hold messages that have been deleted or | |||
might be a virtual mailbox, containing messages from other | marked for deletion. In some server implementations, this might | |||
mailboxes that are marked with the "\Deleted" message flag. | be a virtual mailbox, containing messages from other mailboxes | |||
that are marked with the "\Deleted" message flag. Alternatively, | ||||
Alternatively, this might just be advice that a client that | this might just be advice that a client that chooses not to use | |||
chooses not to use the IMAP "\Deleted" model should use this as | the IMAP "\Deleted" model should use as its trash location. In | |||
its trash location. In server implementations that strictly | server implementations that strictly expect the IMAP "\Deleted" | |||
expect the IMAP "\Deleted" model, this special use is likely not | model, this special use is likely not to be supported. | |||
to be supported. | ||||
All of special-use attributes are OPTIONAL, and any given server or | All special-use attributes are OPTIONAL, and any given server 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. | |||
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. | |||
Other mailbox name attributes can be found in the "IMAP Mailbox Name | Other mailbox name attributes can be found in the "IMAP Mailbox Name | |||
Attributes" registry [IMAP-MAILBOX-NAME-ATTRS-REG]. | Attributes" registry [IMAP-MAILBOX-NAME-ATTRS-REG]. | |||
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 hierarchy. | mailboxes and to search higher or lower levels of naming hierarchy. | |||
All children of a top-level hierarchy node MUST use the same | All children of a top-level hierarchy node MUST use the same | |||
separator character. A NIL hierarchy delimiter means that no | separator character. A NIL hierarchy delimiter means that no | |||
hierarchy exists; the name is a "flat" name. | hierarchy exists; the name is a "flat" name. | |||
The name represents an unambiguous left-to-right hierarchy, and MUST | The name represents an unambiguous left-to-right hierarchy and MUST | |||
be valid for use as a reference in LIST command. Unless \Noselect or | be valid for use as a reference in LIST command. Unless \Noselect or | |||
\NonExistent is indicated, the name MUST also be valid as an argument | \NonExistent is indicated, the name MUST also be valid as an argument | |||
for commands, such as SELECT, that accept mailbox names. | for commands, such as SELECT, that accept mailbox names. | |||
The name might be followed by an OPTIONAL series of extended fields, | The name might be followed by an OPTIONAL series of extended fields, | |||
a parenthesized list of tagged data (also referred to as "extended | a parenthesized list of tagged data (also referred to as an "extended | |||
data item"). The first element of an extended field is a string, | data item"). The first element of an extended field is a string, | |||
which identifies the type of data. [RFC5258] specified requirements | which identifies the type of data. [RFC5258] specifies requirements | |||
on string registration (which are called "tags" there; such tags are | on string registration (which are called "tags"; such tags are not to | |||
not to be confused with IMAP command tags), in particular it said | be confused with IMAP command tags); in particular, it states that | |||
that "Tags MUST be registered with IANA". This document doesn't | "Tags MUST be registered with IANA". This document doesn't change | |||
change that. See Section 9.5 of [RFC5258] for the registration | that. See Section 9.5 of [RFC5258] for the registration template. | |||
template. The server MAY return data in the extended fields that was | The server MAY return data in the extended fields that was not | |||
not directly solicited by the client in the corresponding LIST | directly solicited by the client in the corresponding LIST command. | |||
command. For example, the client can enable extra extended fields by | For example, the client can enable extra extended fields by using | |||
using another IMAP extension that make use of the extended LIST | another IMAP extension that makes use of the extended LIST responses. | |||
responses. The client MUST ignore all extended fields it doesn't | The client MUST ignore all extended fields it doesn't recognize. | |||
recognize. | ||||
Example: S: * LIST (\Noselect) "/" ~/Mail/foo | Example: | |||
Example: S: * LIST (\Marked) ":" Tables (tablecloth (("edge" "lacy") | S: * LIST (\Noselect) "/" ~/Mail/foo | |||
("color" "red")) Sample "text") | ||||
S: * LIST () ":" Tables:new (tablecloth ("edge" "lacy") | Example: | |||
Sample ("text" "more text")) | ||||
S: * LIST (\Marked) ":" Tables (tablecloth (("edge" "lacy") | ||||
("color" "red")) Sample "text") | ||||
S: * LIST () ":" Tables:new (tablecloth ("edge" "lacy") | ||||
Sample ("text" "more text")) | ||||
7.3.2. NAMESPACE Response | 7.3.2. NAMESPACE Response | |||
Contents: the prefix and hierarchy delimiter to the server's | Contents: the prefix and hierarchy delimiter to the server's | |||
Personal Namespace(s), Other Users' Namespace(s), and | Personal Namespace(s), Other Users' Namespace(s), and | |||
Shared Namespace(s) | Shared Namespace(s) | |||
The NAMESPACE response occurs as a result of a NAMESPACE command. It | The NAMESPACE response occurs as a result of a NAMESPACE command. It | |||
contains the prefix and hierarchy delimiter to the server's Personal | contains the prefix and hierarchy delimiter to the server's Personal | |||
Namespace(s), Other Users' Namespace(s), and Shared Namespace(s) that | Namespace(s), Other Users' Namespace(s), and Shared Namespace(s) that | |||
the server wishes to expose. The response will contain a NIL for any | the server wishes to expose. The response will contain a NIL for any | |||
namespace class that is not available. Namespace-Response-Extensions | namespace class that is not available. The Namespace-Response- | |||
ABNF non terminal is defined for extensibility and MAY be included in | Extensions ABNF non-terminal is defined for extensibility and MAY be | |||
the response. | included in the response. | |||
Example: S: * NAMESPACE (("" "/")) (("~" "/")) NIL | Example: | |||
S: * NAMESPACE (("" "/")) (("~" "/")) NIL | ||||
7.3.3. STATUS Response | 7.3.3. STATUS Response | |||
Contents: name | Contents: | |||
name | ||||
status parenthesized list | status parenthesized list | |||
The STATUS response occurs as a result of an STATUS command. It | The STATUS response occurs as a result of a 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. | |||
Example: S: * STATUS blurdybloop (MESSAGES 231 UIDNEXT 44292) | Example: | |||
S: * STATUS blurdybloop (MESSAGES 231 UIDNEXT 44292) | ||||
7.3.4. ESEARCH Response | 7.3.4. ESEARCH Response | |||
Contents: one or more search-return-data pairs | Contents: one or more search-return-data pairs | |||
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. | |||
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. | |||
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. | |||
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 | |||
space and the corresponding data. Search data pairs may be returned | a space and the corresponding data. Search data pairs may be | |||
in any order. Unless specified otherwise by an extension, any return | returned in any order. Unless otherwise specified by an extension, | |||
item name SHOULD appear only once in an ESEARCH response. | any return item name SHOULD appear only once in an ESEARCH response. | |||
This document specifies the following return item names: | This document specifies the following return item names: | |||
MIN | MIN | |||
Returns the lowest message number/UID that satisfies the SEARCH | ||||
criteria. | ||||
Returns the lowest message number/UID that satisfies the SEARCH | If the SEARCH results in no matches, the server MUST NOT include | |||
criteria. | the MIN return item in the ESEARCH response; however, it still | |||
MUST send the ESEARCH response. | ||||
If the SEARCH results in no matches, the server MUST NOT | ||||
include the MIN return item in the ESEARCH response; however, | ||||
it still MUST send the ESEARCH response. | ||||
MAX | MAX | |||
Returns the highest message number/UID that satisfies the SEARCH | ||||
criteria. | ||||
Returns the highest message number/UID that satisfies the | If the SEARCH results in no matches, the server MUST NOT include | |||
SEARCH criteria. | the MAX return item in the ESEARCH response; however, it still | |||
MUST send the ESEARCH response. | ||||
If the SEARCH results in no matches, the server MUST NOT | ||||
include the MAX return item in the ESEARCH response; however, | ||||
it still MUST send the ESEARCH response. | ||||
ALL | ALL | |||
Returns all message numbers/UIDs that satisfy the SEARCH criteria | ||||
using the sequence-set syntax. Each set MUST be complete; in | ||||
particular, a UID set is returned in an ESEARCH response only when | ||||
each number in the range corresponds to an existing (matching) | ||||
message. The client MUST NOT assume that messages/UIDs will be | ||||
listed in any particular order. | ||||
Returns all message numbers/UIDs that satisfy the SEARCH | If the SEARCH results in no matches, the server MUST NOT include | |||
criteria using the sequence-set syntax. Note, the client MUST | the ALL return item in the ESEARCH response; however, it still | |||
NOT assume that messages/UIDs will be listed in any particular | MUST send the ESEARCH response. | |||
order. | ||||
If the SEARCH results in no matches, the server MUST NOT | COUNT | |||
include the ALL return item in the ESEARCH response; however, | Returns the number of messages that satisfy the SEARCH criteria. | |||
it still MUST send the ESEARCH response. | This return item MUST always be included in the ESEARCH response. | |||
COUNT Returns the number of messages that satisfy the SEARCH | Example: | |||
criteria. This return item MUST always be included in the ESEARCH | ||||
response. | ||||
Example: S: * ESEARCH UID COUNT 5 ALL 4:19,21,28 | S: * ESEARCH UID COUNT 17 ALL 4:18,21,28 | |||
Example: S: * ESEARCH (TAG "a567") UID COUNT 5 ALL 4:19,21,28 | Example: | |||
Example: S: * ESEARCH COUNT 5 ALL 1:17,21 | S: * ESEARCH (TAG "a567") UID COUNT 17 ALL 4:18,21,28 | |||
Example: | ||||
S: * ESEARCH COUNT 18 ALL 1:17,21 | ||||
7.3.5. FLAGS Response | 7.3.5. FLAGS Response | |||
Contents: flag parenthesized list | Contents: flag parenthesized list | |||
The FLAGS response occurs as a result of a SELECT or EXAMINE command. | The FLAGS response occurs as a result of a SELECT or EXAMINE command. | |||
The flag parenthesized list identifies the flags (at a minimum, the | The flag parenthesized list identifies the flags (at a minimum, the | |||
system-defined flags) that are applicable for this mailbox. Flags | system-defined flags) that are applicable for this mailbox. Flags | |||
other than the system flags can also exist, depending on server | other than the system flags can also exist, depending on server | |||
implementation. | implementation. | |||
The update from the FLAGS response MUST be remembered by the client. | The update from the FLAGS response MUST be remembered by the client. | |||
Example: S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) | Example: | |||
S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) | ||||
7.4. Server Responses - Mailbox Size | 7.4. Server Responses - Mailbox Size | |||
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. | |||
7.4.1. EXISTS Response | 7.4.1. EXISTS Response | |||
Contents: none | Contents: none | |||
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, and | This response occurs as a result of a SELECT or EXAMINE command and | |||
if the size of the mailbox changes (e.g., new messages). | if the size of the mailbox changes (e.g., new messages). | |||
The update from the EXISTS response MUST be remembered by the client. | The update from the EXISTS response MUST be remembered by the client. | |||
Example: S: * 23 EXISTS | Example: | |||
S: * 23 EXISTS | ||||
7.5. Server Responses - Message Status | 7.5. Server Responses - Message Status | |||
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. | |||
7.5.1. EXPUNGE Response | 7.5.1. EXPUNGE Response | |||
skipping to change at page 124, line 17 ¶ | skipping to change at line 5853 ¶ | |||
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 new | mailbox; it is not necessary to send an EXISTS response with the new | |||
value. | value. | |||
As a result of the immediate decrement rule, message sequence numbers | As a result of the immediate decrement rule, message sequence numbers | |||
that appear in a set of successive EXPUNGE responses depend upon | that appear in a set of successive EXPUNGE responses depend upon | |||
whether the messages are removed starting from lower numbers to | whether the messages are removed starting from lower numbers to | |||
higher numbers, or from higher numbers to lower numbers. For | higher numbers, or from higher numbers to lower numbers. For | |||
example, if the last 5 messages in a 9-message mailbox are expunged, | example, if the last 5 messages in a 9-message mailbox are expunged, | |||
a "lower to higher" server will send five untagged EXPUNGE responses | a "lower to higher" server will send five untagged EXPUNGE responses | |||
for message sequence number 5, whereas a "higher to lower server" | for message sequence number 5, whereas a "higher to lower" server | |||
will send successive untagged EXPUNGE responses for message sequence | will send successive untagged EXPUNGE responses for message sequence | |||
numbers 9, 8, 7, 6, and 5. | numbers 9, 8, 7, 6, and 5. | |||
An EXPUNGE response MUST NOT be sent when no command is in progress, | An EXPUNGE response MUST NOT be sent when no command is in progress, | |||
nor while responding to a FETCH, STORE, or SEARCH command. This rule | nor while responding to a FETCH, STORE, or SEARCH command. This rule | |||
is necessary to prevent a loss of synchronization of message sequence | is necessary to prevent a loss of synchronization of message sequence | |||
numbers between client and server. A command is not "in progress" | numbers between client and server. A command is not "in progress" | |||
until the complete command has been received; in particular, a | until the complete command has been received; in particular, a | |||
command is not "in progress" during the negotiation of command | command is not "in progress" during the negotiation of command | |||
continuation. | continuation. | |||
Note: UID FETCH, UID STORE, and UID SEARCH are different commands | Note: UID FETCH, UID STORE, and UID SEARCH are different commands | |||
from FETCH, STORE, and SEARCH. An EXPUNGE response MAY be sent | from FETCH, STORE, and SEARCH. An EXPUNGE response MAY be sent | |||
during a UID command. | during a UID command. | |||
The update from the EXPUNGE response MUST be remembered by the | The update from the EXPUNGE response MUST be remembered by the | |||
client. | client. | |||
Example: S: * 44 EXPUNGE | Example: | |||
S: * 44 EXPUNGE | ||||
7.5.2. FETCH Response | 7.5.2. FETCH Response | |||
Contents: message data | Contents: message data | |||
The FETCH response returns data about a message to the client. The | The FETCH response returns data about a message to the client. The | |||
data are pairs of data item names and their values in parentheses. | data are pairs of data item names, and their values are in | |||
This response occurs as the result of a FETCH or STORE command, as | parentheses. This response occurs as the result of a FETCH or STORE | |||
well as by unilateral server decision (e.g., flag updates). | command, as well as by a unilateral server decision (e.g., flag | |||
updates). | ||||
The current data items are: | The current data items are: | |||
BINARY[<section-binary>]<<number>> | BINARY[<section-binary>]<<number>> | |||
An <nstring> or <literal8> expressing the content of the | An <nstring> or <literal8> expressing the content of the specified | |||
specified section after removing any Content-Transfer-Encoding- | section after removing any encoding specified in the corresponding | |||
related encoding. If <number> is present it refers to the | Content-Transfer-Encoding header field. If <number> is present, | |||
offset within the DECODED section data. | it refers to the offset within the DECODED section data. | |||
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 | |||
not contain the NUL octet, the server SHOULD return the data in | contain the NUL octet, the server SHOULD return the data in a | |||
a <string> instead of a <literal8>; this allows the client to | <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 | |||
having to explicitly scan the data stream for for NULs. | to explicitly scan the data stream for NULs. | |||
Messaging clients and servers have been notoriously lax in | Messaging clients and servers have been notoriously lax in their | |||
their adherence to the Internet CRLF convention for terminating | adherence to the Internet CRLF convention for terminating lines of | |||
lines of textual data (text/* media types) in Internet | textual data (text/* media types) in Internet protocols. When | |||
protocols. When sending data in BINARY[...] FETCH data item, | sending data in a BINARY[...] FETCH data item, servers MUST ensure | |||
servers MUST ensure that textual line-oriented sections are | that textual line-oriented sections are always transmitted using | |||
always transmitted using the IMAP4 CRLF line termination | the IMAP CRLF line termination syntax, regardless of the | |||
syntax, regardless of the underlying storage representation of | underlying storage representation of the data on the server. | |||
the data on the server. | ||||
If the server does not know how to decode the section's | If the server does not know how to decode the section's Content- | |||
Content-Transfer-Encoding, it MUST fail the request and issue a | Transfer-Encoding, it MUST fail the request and issue a "NO" | |||
"NO" response that contains the "UNKNOWN-CTE" response code. | response that contains the "UNKNOWN-CTE" response code. | |||
BINARY.SIZE[<section-binary>] | BINARY.SIZE[<section-binary>] | |||
The size of the section after removing any encoding specified in | ||||
the corresponding Content-Transfer-Encoding header field. The | ||||
value returned MUST match the size of the <nstring> or <literal8> | ||||
that will be returned by the corresponding FETCH BINARY request. | ||||
The size of the section after removing any Content-Transfer- | If the server does not know how to decode the section's Content- | |||
Encoding-related encoding. The value returned MUST match the | Transfer-Encoding, it MUST fail the request and issue a "NO" | |||
size of the <nstring> or <literal8> that will be returned by | response that contains the "UNKNOWN-CTE" response code. | |||
the corresponding FETCH BINARY request. | ||||
If the server does not know how to decode the section's | ||||
Content-Transfer-Encoding, it MUST fail the request and issue a | ||||
"NO" response that contains the "UNKNOWN-CTE" response code. | ||||
BODY A form of BODYSTRUCTURE without extension data. | BODY | |||
A form of BODYSTRUCTURE without extension data. | ||||
BODY[<section>]<<origin octet>> | BODY[<section>]<<origin octet>> | |||
A string expressing the body contents of the specified section. | ||||
The string SHOULD be interpreted by the client according to the | ||||
content transfer encoding, body type, and subtype. | ||||
A string expressing the body contents of the specified section. | If the origin octet is specified, this string is a substring of | |||
The string SHOULD be interpreted by the client according to the | the entire body contents, starting at that origin octet. This | |||
content transfer encoding, body type, and subtype. | means that BODY[]<0> MAY be truncated, but BODY[] is NEVER | |||
truncated. | ||||
If the origin octet is specified, this string is a substring of | ||||
the entire body contents, starting at that origin octet. This | ||||
means that BODY[]<0> MAY be truncated, but BODY[] is NEVER | ||||
truncated. | ||||
Note: The origin octet facility MUST NOT be used by a server | Note: The origin octet facility MUST NOT be used by a server in | |||
in a FETCH response unless the client specifically requested | a FETCH response unless the client specifically requested it by | |||
it by means of a FETCH of a BODY[<section>]<<partial>> data | means of a FETCH of a BODY[<section>]<<partial>> data item. | |||
item. | ||||
8-bit textual data is permitted if a [CHARSET] identifier is | 8-bit textual data is permitted if a [CHARSET] identifier is part | |||
part of the body parameter parenthesized list for this section. | of the body parameter parenthesized list for this section. Note | |||
Note that headers (part specifiers HEADER or MIME, or the | that headers (part specifiers HEADER or MIME, or the header | |||
header portion of a MESSAGE/RFC822 or MESSAGE/GLOBAL part), MAY | portion of a MESSAGE/RFC822 or MESSAGE/GLOBAL part) MAY be in UTF- | |||
be in UTF-8. Note also that the [RFC-5322] delimiting blank | 8. Note also that the [RFC5322] delimiting blank line between the | |||
line between the header and the body is not affected by header | header and the body is not affected by header-line subsetting; the | |||
line subsetting; the blank line is always included as part of | blank line is always included as part of the header data, except | |||
header data, except in the case of a message which has no body | in the case of a message that has no body and no blank line. | |||
and no blank line. | ||||
Non-textual data such as binary data MUST be transfer encoded | Non-textual data such as binary data MUST be transfer encoded into | |||
into a textual form, such as BASE64, prior to being sent to the | a textual form, such as base64, prior to being sent to the client. | |||
client. To derive the original binary data, the client MUST | To derive the original binary data, the client MUST decode the | |||
decode the transfer encoded string. | transfer-encoded string. | |||
BODYSTRUCTURE | BODYSTRUCTURE | |||
A parenthesized list that describes the [MIME-IMB] body structure | ||||
of a message. This is computed by the server by parsing the | ||||
[MIME-IMB] header fields, defaulting various fields as necessary. | ||||
A parenthesized list that describes the [MIME-IMB] body | For example, a simple text message of 48 lines and 2279 octets can | |||
structure of a message. This is computed by the server by | have a body structure of: | |||
parsing the [MIME-IMB] header fields, defaulting various fields | ||||
as necessary. | ||||
For example, a simple text message of 48 lines and 2279 octets | ("TEXT" "PLAIN" ("CHARSET" "US-ASCII") NIL NIL "7BIT" 2279 48) | |||
can have a body structure of: ("TEXT" "PLAIN" ("CHARSET" "US- | ||||
ASCII") NIL NIL "7BIT" 2279 48) | ||||
Multiple parts are indicated by parenthesis nesting. Instead | Multiple parts are indicated by parenthesis nesting. Instead of a | |||
of a body type as the first element of the parenthesized list, | body type as the first element of the parenthesized list, there is | |||
there is a sequence of one or more nested body structures. The | a sequence of one or more nested body structures. The second | |||
second element of the parenthesized list is the multipart | element of the parenthesized list is the multipart subtype (mixed, | |||
subtype (mixed, digest, parallel, alternative, etc.). | digest, parallel, alternative, etc.). | |||
For example, a two part message consisting of a text and a | For example, a two-part message consisting of a text and a | |||
BASE64-encoded text attachment can have a body structure of: | base64-encoded text attachment can have a body structure of: | |||
(("TEXT" "PLAIN" ("CHARSET" "US-ASCII") NIL NIL "7BIT" 1152 | ||||
23)("TEXT" "PLAIN" ("CHARSET" "US-ASCII" "NAME" "cc.diff") | ||||
"<960723163407.20117h@cac.washington.edu>" "Compiler diff" | ||||
"BASE64" 4554 73) "MIXED") | ||||
Extension data follows the multipart subtype. Extension data | (("TEXT" "PLAIN" ("CHARSET" "US-ASCII") NIL NIL "7BIT" 1152 23) | |||
is never returned with the BODY fetch, but can be returned with | ("TEXT" "PLAIN" ("CHARSET" "US-ASCII" "NAME" "cc.diff") | |||
a BODYSTRUCTURE fetch. Extension data, if present, MUST be in | "<960723163407.20117h@cac.washington.edu>" "Compiler diff" | |||
the defined order. The extension data of a multipart body part | "BASE64" 4554 73) "MIXED") | |||
are in the following order: | ||||
body parameter parenthesized list A parenthesized list of | Extension data follows the multipart subtype. Extension data is | |||
attribute/value pairs [e.g., ("foo" "bar" "baz" "rag") where | never returned with the BODY fetch but can be returned with a | |||
"bar" is the value of "foo", and "rag" is the value of | BODYSTRUCTURE fetch. Extension data, if present, MUST be in the | |||
"baz"] as defined in [MIME-IMB]. Servers SHOULD decode | defined order. The extension data of a multipart body part are in | |||
parameter value continuations and parameter value character | the following order: | |||
sets as described in [RFC2231], for example, if the message | ||||
contains parameters "baz*0", "baz*1" and "baz*2", the server | ||||
should RFC2231-decode them, concatenate and return the | ||||
resulting value as a parameter "baz". Similarly, if the | ||||
message contains parameters "foo*0*" and "foo*1*", the | ||||
server should RFC2231-decode them, convert to UTF-8, | ||||
concatenate and return the resulting value as a parameter | ||||
"foo*". | ||||
body disposition A parenthesized list, consisting of a | body parameter parenthesized list | |||
disposition type string, followed by a parenthesized list of | A parenthesized list of attribute/value pairs (e.g., ("foo" "bar" | |||
disposition attribute/value pairs as defined in | "baz" "rag") where "bar" is the value of "foo", and "rag" is the | |||
[DISPOSITION]. Servers SHOULD decode parameter value | value of "baz") as defined in [MIME-IMB]. Servers SHOULD decode | |||
continuations as described in [RFC2231]. | parameter-value continuations and parameter-value character sets | |||
as described in [RFC2231], for example, if the message contains | ||||
parameters "baz*0", "baz*1", and "baz*2", the server should decode | ||||
them per [RFC2231], concatenate, and return the resulting value as | ||||
a parameter "baz". Similarly, if the message contains parameters | ||||
"foo*0*" and "foo*1*", the server should decode them per | ||||
[RFC2231], convert to UTF-8, concatenate, and return the resulting | ||||
value as a parameter "foo*". | ||||
body language A string or parenthesized list giving the body | body disposition | |||
language value as defined in [LANGUAGE-TAGS]. | A parenthesized list, consisting of a disposition type string, | |||
followed by a parenthesized list of disposition attribute/value | ||||
pairs as defined in [DISPOSITION]. Servers SHOULD decode | ||||
parameter-value continuations as described in [RFC2231]. | ||||
body location A string giving the body content URI as defined | body language | |||
in [LOCATION]. | A string or parenthesized list giving the body language value as | |||
defined in [LANGUAGE-TAGS]. | ||||
Any following extension data are not yet defined in this | body location | |||
version of the protocol. Such extension data can consist of | A string giving the body content URI as defined in [LOCATION]. | |||
zero or more NILs, strings, numbers, or potentially nested | ||||
parenthesized lists of such data. Client implementations that | ||||
do a BODYSTRUCTURE fetch MUST be prepared to accept such | ||||
extension data. Server implementations MUST NOT send such | ||||
extension data until it has been defined by a revision of this | ||||
protocol. | ||||
The basic fields of a non-multipart body part are in the | Any following extension data are not yet defined in this version | |||
following order: | of the protocol. Such extension data can consist of zero or more | |||
NILs, strings, numbers, or potentially nested parenthesized lists | ||||
of such data. Client implementations that do a BODYSTRUCTURE | ||||
fetch MUST be prepared to accept such extension data. Server | ||||
implementations MUST NOT send such extension data until it has | ||||
been defined by a revision of this protocol. | ||||
body type A string giving the content media type name as | The basic fields of a non-multipart body part are in the following | |||
defined in [MIME-IMB]. | order: | |||
body subtype A string giving the content subtype name as | body type | |||
defined in [MIME-IMB]. | A string giving the content media-type name as defined in | |||
[MIME-IMB]. | ||||
body parameter parenthesized list A parenthesized list of | body subtype | |||
attribute/value pairs [e.g., ("foo" "bar" "baz" "rag") where | A string giving the content subtype name as defined in [MIME-IMB]. | |||
"bar" is the value of "foo" and "rag" is the value of "baz"] | ||||
as defined in [MIME-IMB]. | ||||
body id A string giving the Content-ID header field value as | body parameter parenthesized list | |||
defined in Section 7 of [MIME-IMB]. | A parenthesized list of attribute/value pairs (e.g., ("foo" "bar" | |||
"baz" "rag") where "bar" is the value of "foo", and "rag" is the | ||||
value of "baz") as defined in [MIME-IMB]. | ||||
body description A string giving the Content-Description | body id | |||
header field value as defined in Section 8 of [MIME-IMB]. | A string giving the Content-ID header field value as defined in | |||
Section 7 of [MIME-IMB]. | ||||
body encoding A string giving the content transfer encoding as | body description | |||
defined in Section 6 of [MIME-IMB]. | A string giving the Content-Description header field value as | |||
defined in Section 8 of [MIME-IMB]. | ||||
body size A number giving the size of the body in octets. | body encoding | |||
Note that this size is the size in its transfer encoding and | A string giving the content transfer encoding as defined in | |||
not the resulting size after any decoding. | Section 6 of [MIME-IMB]. | |||
A body type of type MESSAGE and subtype RFC822 contains, | body size | |||
immediately after the basic fields, the envelope structure, | A number giving the size of the body in octets. Note that this | |||
body structure, and size in text lines of the encapsulated | size is the size in its transfer encoding and not the resulting | |||
message. | size after any decoding. | |||
A body type of type TEXT contains, immediately after the basic | A body type of type MESSAGE and subtype RFC822 contains, | |||
fields, the size of the body in text lines. Note that this | immediately after the basic fields, the envelope structure, body | |||
size is the size in its content transfer encoding and not the | structure, and size in text lines of the encapsulated message. | |||
resulting size after any decoding. | ||||
Extension data follows the basic fields and the type-specific | A body type of type TEXT contains, immediately after the basic | |||
fields listed above. Extension data is never returned with the | fields, the size of the body in text lines. Note that this size | |||
BODY fetch, but can be returned with a BODYSTRUCTURE fetch. | is the size in its content transfer encoding and not the resulting | |||
Extension data, if present, MUST be in the defined order. | size after any decoding. | |||
The extension data of a non-multipart body part are in the | Extension data follows the basic fields and the type-specific | |||
following order: | fields listed above. Extension data is never returned with the | |||
BODY fetch but can be returned with a BODYSTRUCTURE fetch. | ||||
Extension data, if present, MUST be in the defined order. | ||||
body MD5 A string giving the body MD5 value as defined in | The extension data of a non-multipart body part are in the | |||
[MD5]. | following order: | |||
body disposition A parenthesized list with the same content | body MD5 | |||
and function as the body disposition for a multipart body | A string giving the body MD5 value as defined in [MD5]. | |||
part. | ||||
body language A string or parenthesized list giving the body | body disposition | |||
language value as defined in [LANGUAGE-TAGS]. | A parenthesized list with the same content and function as the | |||
body disposition for a multipart body part. | ||||
body location A string giving the body content URI as defined | body language | |||
in [LOCATION]. | A string or parenthesized list giving the body language value as | |||
defined in [LANGUAGE-TAGS]. | ||||
Any following extension data are not yet defined in this | body location | |||
version of the protocol, and would be as described above under | A string giving the body content URI as defined in [LOCATION]. | |||
multipart extension data. | ||||
ENVELOPE | Any following extension data are not yet defined in this version | |||
of the protocol and would be as described above under multipart | ||||
extension data. | ||||
A parenthesized list that describes the envelope structure of a | ENVELOPE | |||
message. This is computed by the server by parsing the | A parenthesized list that describes the envelope structure of a | |||
[RFC-5322] header into the component parts, defaulting various | message. This is computed by the server by parsing the [RFC5322] | |||
fields as necessary. | header into the component parts, defaulting various fields as | |||
necessary. | ||||
The fields of the envelope structure are in the following | The fields of the envelope structure are in the following order: | |||
order: date, subject, from, sender, reply-to, to, cc, bcc, in- | date, subject, from, sender, reply-to, to, cc, bcc, in-reply-to, | |||
reply-to, and message-id. The date, subject, in-reply-to, and | and message-id. The date, subject, in-reply-to, and message-id | |||
message-id fields are strings. The from, sender, reply-to, to, | fields are strings. The from, sender, reply-to, to, cc, and bcc | |||
cc, and bcc fields are parenthesized lists of address | fields are parenthesized lists of address structures. | |||
structures. | ||||
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 | |||
are in the following order: display name, [SMTP] at-domain-list | in the following order: display name, [SMTP] at-domain-list | |||
(source route, obs-route ABNF production from [RFC-5322]), | (source route and obs-route ABNF production from [RFC5322]), | |||
mailbox name (local-part ABNF production from [RFC-5322]), and | mailbox name (local-part ABNF production from [RFC5322]), and | |||
host name. | hostname. | |||
[RFC-5322] group syntax is indicated by a special form of | [RFC5322] group syntax is indicated by a special form of address | |||
address structure in which the host name field is NIL. If the | structure in which the hostname field is NIL. If the mailbox name | |||
mailbox name field is also NIL, this is an end of group marker | field is also NIL, this is an end-of-group marker (semicolon in | |||
(semi-colon in RFC 822 syntax). If the mailbox name field is | RFC 822 syntax). If the mailbox name field is non-NIL, this is | |||
non-NIL, this is a start of group marker, and the mailbox name | the start of a group marker, and the mailbox name field holds the | |||
field holds the group name phrase. | group name phrase. | |||
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 [RFC-5322] header, the corresponding member | are absent in the [RFC5322] header, the corresponding member of | |||
of the envelope is NIL; if these header fields are present but | the envelope is NIL; if these header fields are present but empty, | |||
empty the corresponding member of the envelope is the empty | the corresponding member of the envelope is the empty string. | |||
string. | ||||
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 SHOULD treat NIL and the | |||
empty string as identical. | empty string as identical. | |||
Note: [RFC-5322] requires that all messages have a valid | Note: [RFC5322] requires that all messages have a valid Date | |||
Date header field. Therefore, for a well-formed message the | header field. Therefore, for a well-formed message, the date | |||
date member in the envelope can not be NIL or the empty | member in the envelope cannot be NIL or the empty string. | |||
string. However it can be NIL for a malformed or a draft | However, it can be NIL for a malformed or draft message. | |||
message. | ||||
Note: [RFC-5322] requires that the In-Reply-To and Message- | Note: [RFC5322] requires that the In-Reply-To and Message-ID | |||
ID header fields, if present, have non-empty content. | header fields, if present, have non-empty content. Therefore, | |||
Therefore, for a well-formed message the in-reply-to and | for a well-formed message, the in-reply-to and message-id | |||
message-id members in the envelope can not be the empty | members in the envelope cannot be the empty string. However, | |||
string. However they can still be the empty string for a | they can still be the empty string for a malformed message. | |||
malformed message. | ||||
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 | |||
[RFC-5322] header, or are present but empty, the corresponding | [RFC5322] header, or are present but empty, the corresponding | |||
member of the envelope is NIL. | member of the envelope is NIL. | |||
If the Sender or Reply-To header fields are absent in the | If the Sender or Reply-To header fields are absent in the | |||
[RFC-5322] header, or are present but empty, the server sets | [RFC5322] header, or are present but empty, the server sets the | |||
the corresponding member of the envelope to be the same value | corresponding member of the envelope to be the same value as the | |||
as the from member (the client is not expected to know to do | from member (the client is not expected to know how to do this). | |||
this). | ||||
Note: [RFC-5322] requires that all messages have a valid | Note: [RFC5322] requires that all messages have a valid From | |||
From header field. Therefore, for a well-formed message the | header field. Therefore, for a well-formed message, the from, | |||
from, sender, and reply-to members in the envelope can not | sender, and reply-to members in the envelope cannot be NIL. | |||
be NIL. However they can be NIL for a malformed or a draft | However, they can be NIL for a malformed or draft message. | |||
message. | ||||
FLAGS A parenthesized list of flags that are set for this message. | FLAGS | |||
A parenthesized list of flags that are set for this message. | ||||
INTERNALDATE A string representing the internal date of the message. | INTERNALDATE | |||
A string representing the internal date of the message. | ||||
RFC822.SIZE A number expressing the [RFC-5322] size of the message. | RFC822.SIZE | |||
A number expressing the size of a message, as described in | ||||
Section 2.3.4. | ||||
UID A number expressing the unique identifier of the message. | UID | |||
A number expressing the unique identifier of the message. | ||||
If the server chooses to send unsolicited FETCH responses, they MUST | If the server chooses to send unsolicited FETCH responses, they MUST | |||
include UID FETCH item. Note that this is a new requirement when | include UID FETCH item. Note that this is a new requirement when | |||
compared to RFC 3501. | compared to [RFC3501]. | |||
Example: S: * 23 FETCH (FLAGS (\Seen) RFC822.SIZE 44827 UID 447) | Example: | |||
S: * 23 FETCH (FLAGS (\Seen) RFC822.SIZE 44827 UID 447) | ||||
7.6. Server Responses - Command Continuation Request | 7.6. Server Responses - Command Continuation Request | |||
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. | |||
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 | |||
response is also used if an argument to any command is a | is also used if an argument to any command is a synchronizing | |||
synchronizing literal. | literal. | |||
The client is not permitted to send the octets of the synchronizing | The client is not permitted to send the octets of the synchronizing | |||
literal unless the server indicates that it is expected. This | literal unless the server indicates that it is expected. This | |||
permits the server to process commands and reject errors on a line- | permits the server to process commands and reject errors on a line- | |||
by-line basis. The remainder of the command, including the CRLF that | by-line basis. The remainder of the command, including the CRLF that | |||
terminates a command, follows the octets of the literal. If there | terminates a command, follows the octets of the literal. If there | |||
are any additional command arguments, the literal octets are followed | are any additional command arguments, the literal octets are followed | |||
by a space and those arguments. | by a space and those arguments. | |||
Example: C: A001 LOGIN {11} | Example: | |||
S: + Ready for additional command text | ||||
C: FRED FOOBAR {7} | ||||
S: + Ready for additional command text | ||||
C: fat man | ||||
S: A001 OK LOGIN completed | ||||
C: A044 BLURDYBLOOP {102856} | ||||
S: A044 BAD No such command as "BLURDYBLOOP" | ||||
8. Sample IMAP4rev2 connection | C: A001 LOGIN {11} | |||
S: + Ready for additional command text | ||||
C: FRED FOOBAR {7} | ||||
S: + Ready for additional command text | ||||
C: fat man | ||||
S: A001 OK LOGIN completed | ||||
C: A044 BLURDYBLOOP {102856} | ||||
S: A044 BAD No such command as "BLURDYBLOOP" | ||||
The following is a transcript of an IMAP4rev2 connection on a non TLS | 8. Sample IMAP4rev2 Connection | |||
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. | port. A long line in this sample is broken for editorial clarity. | |||
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 | |||
C: | PQ== | |||
S: A001 OK SCRAM-SHA-256 authentication successful | C: | |||
C: babc ENABLE IMAP4rev2 | S: A001 OK SCRAM-SHA-256 authentication successful | |||
S: * ENABLED IMAP4rev2 | C: babc ENABLE IMAP4rev2 | |||
S: babc OK Some capabilities enabled | S: * ENABLED IMAP4rev2 | |||
C: a002 select inbox | S: babc OK Some capabilities enabled | |||
S: * 18 EXISTS | C: a002 select inbox | |||
S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) | S: * 18 EXISTS | |||
S: * OK [UIDVALIDITY 3857529045] UIDs valid | S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) | |||
S: * LIST () "/" INBOX ("OLDNAME" ("inbox")) | S: * OK [UIDVALIDITY 3857529045] UIDs valid | |||
S: a002 OK [READ-WRITE] SELECT completed | S: * LIST () "/" INBOX ("OLDNAME" ("inbox")) | |||
C: a003 fetch 12 full | S: a002 OK [READ-WRITE] SELECT completed | |||
S: * 12 FETCH (FLAGS (\Seen) INTERNALDATE "17-Jul-1996 02:44:25 -0700" | C: a003 fetch 12 full | |||
RFC822.SIZE 4286 ENVELOPE ("Wed, 17 Jul 1996 02:23:25 -0700 (PDT)" | S: * 12 FETCH (FLAGS (\Seen) INTERNALDATE | |||
"IMAP4rev2 WG mtg summary and minutes" | "17-Jul-1996 02:44:25 -0700" RFC822.SIZE 4286 ENVELOPE ( | |||
(("Terry Gray" NIL "gray" "cac.washington.edu")) | "Wed, 17 Jul 1996 02:23:25 -0700 (PDT)" | |||
(("Terry Gray" NIL "gray" "cac.washington.edu")) | "IMAP4rev2 WG mtg summary and minutes" | |||
(("Terry Gray" NIL "gray" "cac.washington.edu")) | (("Terry Gray" NIL "gray" "cac.washington.edu")) | |||
((NIL NIL "imap" "cac.washington.edu")) | (("Terry Gray" NIL "gray" "cac.washington.edu")) | |||
((NIL NIL "minutes" "CNRI.Reston.VA.US") | (("Terry Gray" NIL "gray" "cac.washington.edu")) | |||
("John Klensin" NIL "KLENSIN" "MIT.EDU")) NIL NIL | ((NIL NIL "imap" "cac.washington.edu")) | |||
"<B27397-0100000@cac.washington.edu>") | ((NIL NIL "minutes" "CNRI.Reston.VA.US") | |||
BODY ("TEXT" "PLAIN" ("CHARSET" "US-ASCII") NIL NIL "7BIT" 3028 | ("John Klensin" NIL "KLENSIN" "MIT.EDU")) NIL NIL | |||
92)) | "<B27397-0100000@cac.washington.ed>") | |||
S: a003 OK FETCH completed | BODY ("TEXT" "PLAIN" ("CHARSET" "US-ASCII") NIL NIL "7BIT" | |||
C: a004 fetch 12 body[header] | 3028 92)) | |||
S: * 12 FETCH (BODY[HEADER] {342} | S: a003 OK FETCH completed | |||
S: Date: Wed, 17 Jul 1996 02:23:25 -0700 (PDT) | C: a004 fetch 12 body[header] | |||
S: From: Terry Gray <gray@cac.washington.edu> | S: * 12 FETCH (BODY[HEADER] {342} | |||
S: Subject: IMAP4rev2 WG mtg summary and minutes | S: Date: Wed, 17 Jul 1996 02:23:25 -0700 (PDT) | |||
S: To: imap@cac.washington.edu | S: From: Terry Gray <gray@cac.washington.edu> | |||
S: cc: minutes@CNRI.Reston.VA.US, John Klensin <KLENSIN@MIT.EDU> | S: Subject: IMAP4rev2 WG mtg summary and minutes | |||
S: Message-Id: <B27397-0100000@cac.washington.edu> | S: To: imap@cac.washington.edu | |||
S: MIME-Version: 1.0 | S: cc: minutes@CNRI.Reston.VA.US, John Klensin <KLENSIN@MIT.EDU> | |||
S: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII | S: Message-Id: <B27397-0100000@cac.washington.edu> | |||
S: | S: MIME-Version: 1.0 | |||
S: ) | S: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII | |||
S: a004 OK FETCH completed | S: | |||
C: a005 store 12 +flags \deleted | S: ) | |||
S: * 12 FETCH (FLAGS (\Seen \Deleted)) | S: a004 OK FETCH completed | |||
S: a005 OK +FLAGS completed | C: a005 store 12 +flags \deleted | |||
C: a006 logout | S: * 12 FETCH (FLAGS (\Seen \Deleted)) | |||
S: * BYE IMAP4rev2 server terminating connection | S: a005 OK +FLAGS completed | |||
S: a006 OK LOGOUT completed | C: a006 logout | |||
S: * BYE IMAP4rev2 server terminating connection | ||||
S: a006 OK LOGOUT completed | ||||
9. Formal Syntax | 9. Formal Syntax | |||
The following syntax specification uses the Augmented Backus-Naur | The following syntax specification uses the Augmented Backus-Naur | |||
Form (ABNF) notation as specified in [ABNF]. | Form (ABNF) notation as specified in [ABNF]. | |||
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 MUST 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. | |||
Note: [ABNF] rules MUST be followed strictly; in particular: | Note: [ABNF] rules MUST be followed strictly; in particular: | |||
(1) Except as noted otherwise, all alphabetic characters are case- | 1. Unless otherwise noted, all alphabetic characters are case | |||
insensitive. The use of upper or lower case characters to define | insensitive. The use of uppercase or lowercase characters to | |||
token strings is for editorial clarity only. Implementations MUST | define token strings is for editorial clarity only. | |||
accept these strings in a case-insensitive fashion. | Implementations MUST accept these strings in a case-insensitive | |||
fashion. | ||||
(2) In all cases, SP refers to exactly one space. It is NOT | 2. In all cases, SP refers to exactly one space. It is NOT | |||
permitted to substitute TAB, insert additional spaces, or | permitted to substitute TAB, insert additional spaces, or | |||
otherwise treat SP as being equivalent to LWSP. | otherwise treat SP as being equivalent to linear whitespace | |||
(LWSP). | ||||
(3) The ASCII NUL character, %x00, MUST NOT be used anywhere, with | 3. The ASCII NUL character, %x00, MUST NOT be used anywhere, with | |||
the exception of the OCTET production. | the exception of the OCTET production. | |||
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-CHAR = <any CHAR except atom-specials> | atom = 1*ATOM-CHAR | |||
atom-specials = "(" / ")" / "{" / SP / CTL / list-wildcards / | ATOM-CHAR = <any CHAR except atom-specials> | |||
quoted-specials / resp-specials | ||||
authenticate = "AUTHENTICATE" SP auth-type [SP initial-resp] | atom-specials = "(" / ")" / "{" / SP / CTL / list-wildcards / | |||
*(CRLF base64) | quoted-specials / resp-specials | |||
auth-type = atom | authenticate = "AUTHENTICATE" SP auth-type [SP initial-resp] | |||
; Defined by [SASL] | *(CRLF base64) | |||
base64 = *(4base64-char) [base64-terminal] | auth-type = atom | |||
; Authentication mechanism name, as defined by | ||||
; [SASL], Section 7.1 | ||||
base64-char = ALPHA / DIGIT / "+" / "/" | base64 = *(4base64-char) [base64-terminal] | |||
; Case-sensitive | ||||
base64-terminal = (2base64-char "==") / (3base64-char "=") | base64-char = ALPHA / DIGIT / "+" / "/" | |||
; Case sensitive | ||||
body = "(" (body-type-1part / body-type-mpart) ")" | base64-terminal = (2base64-char "==") / (3base64-char "=") | |||
body-extension = nstring / number / number64 / | body = "(" (body-type-1part / body-type-mpart) ")" | |||
"(" body-extension *(SP body-extension) ")" | ||||
; Future expansion. Client implementations | ||||
; MUST accept body-extension fields. Server | ||||
; implementations MUST NOT generate | ||||
; body-extension fields except as defined by | ||||
; future standard or standards-track | ||||
; revisions of this specification. | ||||
body-ext-1part = body-fld-md5 [SP body-fld-dsp [SP body-fld-lang | body-extension = nstring / number / number64 / | |||
[SP body-fld-loc *(SP body-extension)]]] | "(" body-extension *(SP body-extension) ")" | |||
; MUST NOT be returned on non-extensible | ; Future expansion. Client implementations | |||
; "BODY" fetch | ; MUST accept body-extension fields. Server | |||
; implementations MUST NOT generate | ||||
; body-extension fields except as defined by | ||||
; future Standard or Standards Track | ||||
; revisions of this specification. | ||||
body-ext-mpart = body-fld-param [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-fields = body-fld-param SP body-fld-id SP body-fld-desc SP | body-ext-mpart = body-fld-param [SP body-fld-dsp [SP body-fld-lang | |||
body-fld-enc SP body-fld-octets | [SP body-fld-loc *(SP body-extension)]]] | |||
; MUST NOT be returned on non-extensible | ||||
; "BODY" fetch | ||||
body-fld-desc = nstring | body-fields = body-fld-param SP body-fld-id SP body-fld-desc SP | |||
body-fld-enc SP body-fld-octets | ||||
body-fld-dsp = "(" string SP body-fld-param ")" / nil | body-fld-desc = nstring | |||
body-fld-enc = (DQUOTE ("7BIT" / "8BIT" / "BINARY" / "BASE64"/ | ||||
"QUOTED-PRINTABLE") DQUOTE) / string | ||||
; Content-Transfer-Encoding header field value. | ||||
; Defaults to "7BIT" (as per RFC 2045) | ||||
; if not present in the body part. | ||||
body-fld-id = nstring | body-fld-dsp = "(" string SP body-fld-param ")" / nil | |||
body-fld-lang = nstring / "(" string *(SP string) ")" | body-fld-enc = (DQUOTE ("7BIT" / "8BIT" / "BINARY" / "BASE64"/ | |||
"QUOTED-PRINTABLE") DQUOTE) / string | ||||
; Content-Transfer-Encoding header field value. | ||||
; Defaults to "7BIT" (as per RFC 2045) | ||||
; if not present in the body part. | ||||
body-fld-loc = nstring | body-fld-id = nstring | |||
body-fld-lines = number64 | body-fld-lang = nstring / "(" string *(SP string) ")" | |||
body-fld-md5 = nstring | body-fld-loc = nstring | |||
body-fld-octets = number | body-fld-lines = number64 | |||
body-fld-param = "(" string SP string *(SP string SP string) ")" / nil | body-fld-md5 = nstring | |||
body-type-1part = (body-type-basic / body-type-msg / body-type-text) | body-fld-octets = number | |||
[SP body-ext-1part] | ||||
body-type-basic = media-basic SP body-fields | body-fld-param = "(" string SP string *(SP string SP string) ")" / | |||
; MESSAGE subtype MUST NOT be "RFC822" or "GLOBAL" | nil | |||
body-type-mpart = 1*body SP media-subtype | body-type-1part = (body-type-basic / body-type-msg / body-type-text) | |||
[SP body-ext-mpart] | [SP body-ext-1part] | |||
; MULTIPART body part | ||||
body-type-msg = media-message SP body-fields SP envelope | body-type-basic = media-basic SP body-fields | |||
SP body SP body-fld-lines | ; MESSAGE subtype MUST NOT be "RFC822" or | |||
; "GLOBAL" | ||||
body-type-text = media-text SP body-fields SP body-fld-lines | body-type-mpart = 1*body SP media-subtype | |||
[SP body-ext-mpart] | ||||
; MULTIPART body part | ||||
capability = ("AUTH=" auth-type) / atom | body-type-msg = media-message SP body-fields SP envelope | |||
; New capabilities SHOULD be | SP body SP body-fld-lines | |||
; registered with IANA using | ||||
; RFC Required policy, i.e. in | ||||
; a standards-track, an experimental | ||||
; or an informational RFC. | ||||
capability-data = "CAPABILITY" *(SP capability) SP "IMAP4rev2" | body-type-text = media-text SP body-fields SP body-fld-lines | |||
*(SP capability) | ||||
; Servers MUST implement the STARTTLS and LOGINDISABLED | ||||
; (on cleartext port), AUTH=PLAIN capabilities. | ||||
; Servers which offer RFC 1730 compatibility MUST | ||||
; list "IMAP4" as the first capability. | ||||
; Servers which offer RFC 3501 compatibility MUST | capability = ("AUTH=" auth-type) / atom | |||
; list "IMAP4rev1" as one of capabilities. | ; New capabilities SHOULD be | |||
; registered with IANA using the | ||||
; RFC Required policy, i.e., in | ||||
; a Standards Track, an Experimental, | ||||
; or an Informational RFC. | ||||
CHAR = <defined in [ABNF]> | capability-data = "CAPABILITY" *(SP capability) SP "IMAP4rev2" | |||
*(SP capability) | ||||
; See Section 6.1.1 for information about | ||||
; required security-related capabilities. | ||||
; Servers that offer RFC 1730 compatibility MUST | ||||
; list "IMAP4" as the first capability. | ||||
; Servers that offer RFC 3501 compatibility MUST | ||||
; list "IMAP4rev1" as one of the capabilities. | ||||
CHAR8 = %x01-ff | CHAR = <defined in [ABNF]> | |||
; any OCTET except NUL, %x00 | ||||
charset = atom / quoted | CHAR8 = %x01-ff | |||
; any OCTET except NUL, %x00 | ||||
childinfo-extended-item = "CHILDINFO" SP "(" | charset = atom / quoted | |||
list-select-base-opt-quoted | ||||
*(SP list-select-base-opt-quoted) ")" | ||||
; Extended data item (mbox-list-extended-item) | ||||
; returned when the RECURSIVEMATCH | ||||
; selection option is specified. | ||||
; Note 1: the CHILDINFO extended data item tag can be | ||||
; returned with and without surrounding quotes, as per | ||||
; mbox-list-extended-item-tag production. | ||||
; Note 2: The selection options are always returned | ||||
; quoted, unlike their specification in | ||||
; the extended LIST command. | ||||
child-mbox-flag = "\HasChildren" / "\HasNoChildren" | childinfo-extended-item = "CHILDINFO" SP "(" | |||
; attributes for CHILDREN return option, at most one | list-select-base-opt-quoted | |||
; possible per LIST response | *(SP list-select-base-opt-quoted) ")" | |||
; Extended data item (mbox-list-extended-item) | ||||
; returned when the RECURSIVEMATCH | ||||
; selection option is specified. | ||||
; Note 1: the CHILDINFO extended data item tag can be | ||||
; returned with or without surrounding quotes, as per | ||||
; mbox-list-extended-item-tag production. | ||||
; Note 2: The selection options are always returned | ||||
; quoted, unlike their specification in | ||||
; the extended LIST command. | ||||
command = tag SP (command-any / command-auth / command-nonauth / | child-mbox-flag = "\HasChildren" / "\HasNoChildren" | |||
command-select) CRLF | ; attributes for the CHILDREN return option, at most | |||
; Modal based on state | ; one possible per LIST response | |||
command-any = "CAPABILITY" / "LOGOUT" / "NOOP" | command = tag SP (command-any / command-auth / | |||
; Valid in all states | command-nonauth / command-select) CRLF | |||
; Modal based on state | ||||
command-auth = append / create / delete / enable / examine / list / | command-any = "CAPABILITY" / "LOGOUT" / "NOOP" | |||
Namespace-Command / | ; Valid in all states | |||
rename / select / status / subscribe / unsubscribe / | ||||
idle | ||||
; Valid only in Authenticated or Selected state | ||||
command-nonauth = login / authenticate / "STARTTLS" | command-auth = append / create / delete / enable / examine / | |||
; Valid only when in Not Authenticated state | list / namespace-command / rename / | |||
select / status / subscribe / unsubscribe / | ||||
idle | ||||
; Valid only in Authenticated or Selected state | ||||
command-select = "CLOSE" / "UNSELECT" / "EXPUNGE" / copy / | command-nonauth = login / authenticate / "STARTTLS" | |||
move / fetch / store / search / uid | ; Valid only when in Not Authenticated state | |||
; Valid only when in Selected state | ||||
continue-req = "+" SP (resp-text / base64) CRLF | command-select = "CLOSE" / "UNSELECT" / "EXPUNGE" / copy / | |||
copy = "COPY" SP sequence-set SP mailbox | move / fetch / store / search / uid | |||
; Valid only when in Selected state | ||||
create = "CREATE" SP mailbox | continue-req = "+" SP (resp-text / base64) CRLF | |||
; Use of INBOX gives a NO error | ||||
date = date-text / DQUOTE date-text DQUOTE | copy = "COPY" SP sequence-set SP mailbox | |||
date-day = 1*2DIGIT | create = "CREATE" SP mailbox | |||
; Day of month | ; Use of INBOX gives a NO error | |||
date-day-fixed = (SP DIGIT) / 2DIGIT | date = date-text / DQUOTE date-text DQUOTE | |||
; Fixed-format version of date-day | ||||
date-month = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" / | date-day = 1*2DIGIT | |||
"Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec" | ; Day of month | |||
date-text = date-day "-" date-month "-" date-year | date-day-fixed = (SP DIGIT) / 2DIGIT | |||
; Fixed-format version of date-day | ||||
date-year = 4DIGIT | date-month = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" / | |||
"Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec" | ||||
date-time = DQUOTE date-day-fixed "-" date-month "-" date-year | date-text = date-day "-" date-month "-" date-year | |||
SP time SP zone DQUOTE | ||||
delete = "DELETE" SP mailbox | date-year = 4DIGIT | |||
; Use of INBOX gives a NO error | ||||
digit-nz = %x31-39 | date-time = DQUOTE date-day-fixed "-" date-month "-" date-year | |||
; 1-9 | SP time SP zone DQUOTE | |||
eitem-standard-tag = atom | delete = "DELETE" SP mailbox | |||
; a tag for LIST extended data item defined in a Standard | ; Use of INBOX gives a NO error | |||
; Track or Experimental RFC. | ||||
eitem-vendor-tag = vendor-token "-" atom | digit-nz = %x31-39 | |||
; a vendor-specific tag for LIST extended data item | ; 1-9 | |||
enable = "ENABLE" 1*(SP capability) | eitem-standard-tag = atom | |||
; a tag for LIST extended data item defined in a Standard | ||||
; Track or Experimental RFC. | ||||
enable-data = "ENABLED" *(SP capability) | eitem-vendor-tag = vendor-token "-" atom | |||
; a vendor-specific tag for LIST extended data item | ||||
envelope = "(" env-date SP env-subject SP env-from SP | enable = "ENABLE" 1*(SP capability) | |||
env-sender SP env-reply-to SP env-to SP env-cc SP | ||||
env-bcc SP env-in-reply-to SP env-message-id ")" | ||||
env-bcc = "(" 1*address ")" / nil | enable-data = "ENABLED" *(SP capability) | |||
env-cc = "(" 1*address ")" / nil | envelope = "(" env-date SP env-subject SP env-from SP | |||
env-date = nstring | env-sender SP env-reply-to SP env-to SP env-cc SP | |||
env-bcc SP env-in-reply-to SP env-message-id ")" | ||||
env-from = "(" 1*address ")" / nil | env-bcc = "(" 1*address ")" / nil | |||
env-in-reply-to = nstring | env-cc = "(" 1*address ")" / nil | |||
env-message-id = nstring | env-date = nstring | |||
env-reply-to = "(" 1*address ")" / nil | env-from = "(" 1*address ")" / nil | |||
env-sender = "(" 1*address ")" / nil | env-in-reply-to = nstring | |||
env-subject = nstring | env-message-id = nstring | |||
env-to = "(" 1*address ")" / nil | env-reply-to = "(" 1*address ")" / nil | |||
esearch-response = "ESEARCH" [search-correlator] [SP "UID"] | env-sender = "(" 1*address ")" / nil | |||
*(SP search-return-data) | ||||
; ESEARCH response replaces SEARCH response | ||||
; from IMAP4rev1. | ||||
examine = "EXAMINE" SP mailbox | env-subject = nstring | |||
fetch = "FETCH" SP sequence-set SP ("ALL" / "FULL" / "FAST" / | env-to = "(" 1*address ")" / nil | |||
fetch-att / "(" fetch-att *(SP fetch-att) ")") | ||||
fetch-att = "ENVELOPE" / "FLAGS" / "INTERNALDATE" / | esearch-response = "ESEARCH" [search-correlator] [SP "UID"] | |||
"RFC822.SIZE" / | *(SP search-return-data) | |||
"BODY" ["STRUCTURE"] / "UID" / | ; ESEARCH response replaces SEARCH response | |||
"BODY" section [partial] / | ; from IMAP4rev1. | |||
"BODY.PEEK" section [partial] / | ||||
"BINARY" [".PEEK"] section-binary [partial] / | ||||
"BINARY.SIZE" section-binary | ||||
flag = "\Answered" / "\Flagged" / "\Deleted" / | examine = "EXAMINE" SP mailbox | |||
"\Seen" / "\Draft" / flag-keyword / flag-extension | ||||
; Does not include "\Recent" | ||||
flag-extension = "\" atom | fetch = "FETCH" SP sequence-set SP ( | |||
; Future expansion. Client implementations | "ALL" / "FULL" / "FAST" / | |||
; MUST accept flag-extension flags. Server | fetch-att / "(" fetch-att *(SP fetch-att) ")") | |||
; implementations MUST NOT generate | ||||
; flag-extension flags except as defined by | ||||
; future standard or standards-track | ||||
; revisions of this specification. | ||||
; "\Recent" was defined in RFC 3501 | ||||
; and is now deprecated. | ||||
flag-fetch = flag | fetch-att = "ENVELOPE" / "FLAGS" / "INTERNALDATE" / | |||
"RFC822.SIZE" / | ||||
"BODY" ["STRUCTURE"] / "UID" / | ||||
"BODY" section [partial] / | ||||
"BODY.PEEK" section [partial] / | ||||
"BINARY" [".PEEK"] section-binary [partial] / | ||||
"BINARY.SIZE" section-binary | ||||
flag-keyword = "$MDNSent" / "$Forwarded" / "$Junk" / | flag = "\Answered" / "\Flagged" / "\Deleted" / | |||
"$NotJunk" / "$Phishing" / atom | "\Seen" / "\Draft" / flag-keyword / flag-extension | |||
; Does not include "\Recent" | ||||
flag-list = "(" [flag *(SP flag)] ")" | flag-extension = "\" atom | |||
; Future expansion. Client implementations | ||||
; MUST accept flag-extension flags. Server | ||||
; implementations MUST NOT generate | ||||
; flag-extension flags except as defined by | ||||
; a future Standard or Standards Track | ||||
; revisions of this specification. | ||||
; "\Recent" was defined in RFC 3501 | ||||
; and is now deprecated. | ||||
flag-perm = flag / "\*" | flag-fetch = flag / obsolete-flag-recent | |||
greeting = "*" SP (resp-cond-auth / resp-cond-bye) CRLF | flag-keyword = "$MDNSent" / "$Forwarded" / "$Junk" / | |||
"$NotJunk" / "$Phishing" / atom | ||||
header-fld-name = astring | flag-list = "(" [flag *(SP flag)] ")" | |||
header-list = "(" header-fld-name *(SP header-fld-name) ")" | flag-perm = flag / "\*" | |||
idle = "IDLE" CRLF "DONE" | greeting = "*" SP (resp-cond-auth / resp-cond-bye) CRLF | |||
initial-resp = (base64 / "=") | header-fld-name = astring | |||
; "initial response" defined in | ||||
; Section 5.1 of [RFC4422] | ||||
list = "LIST" [SP list-select-opts] SP mailbox SP mbox-or-pat | header-list = "(" header-fld-name *(SP header-fld-name) ")" | |||
[SP list-return-opts] | ||||
list-mailbox = 1*list-char / string | idle = "IDLE" CRLF "DONE" | |||
list-char = ATOM-CHAR / list-wildcards / resp-specials | initial-resp = (base64 / "=") | |||
; "initial response" defined in | ||||
; Section 4 of [SASL] | ||||
list-return-opt = return-option | list = "LIST" [SP list-select-opts] SP | |||
; Note that return-option is the ABNF | mailbox SP mbox-or-pat | |||
; non terminal used by RFC 5258 | [SP list-return-opts] | |||
list-return-opts = "RETURN" SP | list-mailbox = 1*list-char / string | |||
"(" [list-return-opt *(SP list-return-opt)] ")" | ||||
; list return options, e.g., CHILDREN | ||||
list-select-base-opt = "SUBSCRIBED" / option-extension | list-char = ATOM-CHAR / list-wildcards / resp-specials | |||
; options that can be used by themselves | ||||
list-select-base-opt-quoted = DQUOTE list-select-base-opt DQUOTE | list-return-opt = return-option | |||
; Note that return-option is the ABNF | ||||
; non-terminal used by RFC 5258 | ||||
list-select-independent-opt = "REMOTE" / option-extension | list-return-opts = "RETURN" SP | |||
; options that do not syntactically interact with | "(" [list-return-opt *(SP list-return-opt)] ")" | |||
; other options | ; list return options, e.g., CHILDREN | |||
list-select-mod-opt = "RECURSIVEMATCH" / option-extension | list-select-base-opt = "SUBSCRIBED" / option-extension | |||
; options that require a list-select-base-opt | ; options that can be used by themselves | |||
; to also be present | ||||
list-select-opt = list-select-base-opt / list-select-independent-opt | list-select-base-opt-quoted = DQUOTE list-select-base-opt DQUOTE | |||
/ list-select-mod-opt | ||||
; An option registration template is described in | ||||
; Section 9.3 of this document. | ||||
list-select-opts = "(" [ | list-select-independent-opt = "REMOTE" / option-extension | |||
(*(list-select-opt SP) list-select-base-opt | ; options that do not syntactically interact with | |||
*(SP list-select-opt)) | ; other options | |||
/ (list-select-independent-opt | ||||
*(SP list-select-independent-opt)) | ||||
] ")" | ||||
; Any number of options may be in any order. | ||||
; If a list-select-mod-opt appears, then a | ||||
; list-select-base-opt must also appear. | ||||
; This allows these: | ||||
; () | ||||
; (REMOTE) | ||||
; (SUBSCRIBED) | ||||
; (SUBSCRIBED REMOTE) | ||||
; (SUBSCRIBED RECURSIVEMATCH) | ||||
; (SUBSCRIBED REMOTE RECURSIVEMATCH) | ||||
; But does NOT allow these: | ||||
; (RECURSIVEMATCH) | ||||
; (REMOTE RECURSIVEMATCH) | ||||
list-wildcards = "%" / "*" | list-select-mod-opt = "RECURSIVEMATCH" / option-extension | |||
; options that require a list-select-base-opt | ||||
; to also be present | ||||
literal = "{" number64 ["+"] "}" CRLF *CHAR8 | list-select-opt = list-select-base-opt / list-select-independent-opt | |||
; <number64> represents the number of CHAR8s. | / list-select-mod-opt | |||
; A non-synchronizing literal is distinguished from | ||||
; a synchronizing literal by presence of the "+" | ||||
; before the closing "}". | ||||
; Non synchronizing literals are not allowed when | ||||
; sent from server to the client. | ||||
literal8 = "~{" number64 "}" CRLF *OCTET | list-select-opts = "(" [ | |||
; <number64> represents the number of OCTETs | (*(list-select-opt SP) list-select-base-opt | |||
; in the response string. | *(SP list-select-opt)) | |||
/ (list-select-independent-opt | ||||
*(SP list-select-independent-opt)) | ||||
] ")" | ||||
; Any number of options may be in any order. | ||||
; If a list-select-mod-opt appears, then a | ||||
; list-select-base-opt must also appear. | ||||
; This allows these: | ||||
; () | ||||
; (REMOTE) | ||||
; (SUBSCRIBED) | ||||
; (SUBSCRIBED REMOTE) | ||||
; (SUBSCRIBED RECURSIVEMATCH) | ||||
; (SUBSCRIBED REMOTE RECURSIVEMATCH) | ||||
; But does NOT allow these: | ||||
; (RECURSIVEMATCH) | ||||
; (REMOTE RECURSIVEMATCH) | ||||
login = "LOGIN" SP userid SP password | list-wildcards = "%" / "*" | |||
mailbox = "INBOX" / astring | literal = "{" number64 ["+"] "}" CRLF *CHAR8 | |||
; INBOX is case-insensitive. All case variants of | ; <number64> represents the number of CHAR8s. | |||
; INBOX (e.g., "iNbOx") MUST be interpreted as INBOX | ; A non-synchronizing literal is distinguished | |||
; not as an astring. An astring which consists of | ; from a synchronizing literal by the presence of | |||
; the case-insensitive sequence "I" "N" "B" "O" "X" | ; "+" before the closing "}". | |||
; is considered to be INBOX and not an astring. | ; Non-synchronizing literals are not allowed when | |||
; Refer to section 5.1 for further | ; sent from server to the client. | |||
; semantic details of mailbox names. | ||||
mailbox-data = "FLAGS" SP flag-list / "LIST" SP mailbox-list / | literal8 = "~{" number64 "}" CRLF *OCTET | |||
esearch-response / | ; <number64> represents the number of OCTETs | |||
"STATUS" SP mailbox SP "(" [status-att-list] ")" / | ; in the response string. | |||
number SP "EXISTS" / Namespace-Response | ||||
mailbox-list = "(" [mbx-list-flags] ")" SP | login = "LOGIN" SP userid SP password | |||
(DQUOTE QUOTED-CHAR DQUOTE / nil) SP mailbox | ||||
[SP mbox-list-extended] | ||||
; This is the list information pointed to by the ABNF | ||||
; item "mailbox-data", which is defined in [IMAP4] | ||||
mbox-list-extended = "(" [mbox-list-extended-item | mailbox = "INBOX" / astring | |||
*(SP mbox-list-extended-item)] ")" | ; INBOX is case insensitive. All case variants | |||
; of INBOX (e.g., "iNbOx") MUST be interpreted as | ||||
; INBOX, not as an astring. An astring that | ||||
; consists of the case-insensitive sequence | ||||
; "I" "N" "B" "O" "X" is considered | ||||
; to be an INBOX and not an astring. | ||||
; Refer to Section 5.1 for further | ||||
; semantic details of mailbox names. | ||||
mbox-list-extended-item = mbox-list-extended-item-tag SP | mailbox-data = "FLAGS" SP flag-list / "LIST" SP mailbox-list / | |||
tagged-ext-val | esearch-response / | |||
"STATUS" SP mailbox SP "(" [status-att-list] ")" / | ||||
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. | ||||
mbox-list-extended-item-tag = astring | mailbox-list = "(" [mbx-list-flags] ")" SP | |||
; The content MUST conform to either "eitem-vendor-tag" | (DQUOTE QUOTED-CHAR DQUOTE / nil) SP mailbox | |||
; or "eitem-standard-tag" ABNF productions. | [SP mbox-list-extended] | |||
; This is the list information pointed to by the ABNF | ||||
; item "mailbox-data", which is defined above | ||||
mbox-or-pat = list-mailbox / patterns | mbox-list-extended = "(" [mbox-list-extended-item | |||
*(SP mbox-list-extended-item)] ")" | ||||
mbx-list-flags = *(mbx-list-oflag SP) mbx-list-sflag | mbox-list-extended-item = mbox-list-extended-item-tag SP | |||
*(SP mbx-list-oflag) / | tagged-ext-val | |||
mbx-list-oflag *(SP mbx-list-oflag) | ||||
mbx-list-oflag = "\Noinferiors" / child-mbox-flag / | mbox-list-extended-item-tag = astring | |||
"\Subscribed" / "\Remote" / flag-extension | ; The content MUST conform to either | |||
; Other flags; multiple possible per LIST response | ; "eitem-vendor-tag" or "eitem-standard-tag" | |||
; ABNF productions. | ||||
mbx-list-sflag = "\NonExistent" / "\Noselect" / "\Marked" / "\Unmarked" | mbox-or-pat = list-mailbox / patterns | |||
; Selectability flags; only one per LIST response | ||||
media-basic = ((DQUOTE ("APPLICATION" / "AUDIO" / "IMAGE" / | mbx-list-flags = *(mbx-list-oflag SP) mbx-list-sflag | |||
"FONT" / "MESSAGE" / "MODEL" / "VIDEO" ) DQUOTE) | *(SP mbx-list-oflag) / | |||
/ string) | mbx-list-oflag *(SP mbx-list-oflag) | |||
SP media-subtype | ||||
; FONT defined in RFC 8081. | ||||
; MODEL defined in RFC 2077. | ||||
; Other top level media types | ||||
; are defined in [MIME-IMT]. | ||||
media-message = DQUOTE "MESSAGE" DQUOTE SP | mbx-list-oflag = "\Noinferiors" / child-mbox-flag / | |||
DQUOTE ("RFC822" / "GLOBAL") DQUOTE | "\Subscribed" / "\Remote" / flag-extension | |||
; Defined in [MIME-IMT] | ; Other flags; multiple from this list are | |||
; possible per LIST response, but each flag | ||||
; can only appear once per LIST response | ||||
media-subtype = string | mbx-list-sflag = "\NonExistent" / "\Noselect" / "\Marked" / | |||
; Defined in [MIME-IMT] | "\Unmarked" | |||
; Selectability flags; only one per LIST response | ||||
media-text = DQUOTE "TEXT" DQUOTE SP media-subtype | media-basic = ((DQUOTE ("APPLICATION" / "AUDIO" / "IMAGE" / | |||
; Defined in [MIME-IMT] | "FONT" / "MESSAGE" / "MODEL" / "VIDEO" ) DQUOTE) | |||
/ string) | ||||
SP media-subtype | ||||
; FONT defined in [RFC8081]. | ||||
; MODEL defined in [RFC2077]. | ||||
; Other top-level media types | ||||
; are defined in [MIME-IMT]. | ||||
message-data = nz-number SP ("EXPUNGE" / ("FETCH" SP msg-att)) | media-message = DQUOTE "MESSAGE" DQUOTE SP | |||
DQUOTE ("RFC822" / "GLOBAL") DQUOTE | ||||
; Defined in [MIME-IMT] | ||||
move = "MOVE" SP sequence-set SP mailbox | media-subtype = string | |||
; Defined in [MIME-IMT] | ||||
msg-att = "(" (msg-att-dynamic / msg-att-static) | media-text = DQUOTE "TEXT" DQUOTE SP media-subtype | |||
*(SP (msg-att-dynamic / msg-att-static)) ")" | ; Defined in [MIME-IMT] | |||
msg-att-dynamic = "FLAGS" SP "(" [flag-fetch *(SP flag-fetch)] ")" | message-data = nz-number SP ("EXPUNGE" / ("FETCH" SP msg-att)) | |||
; MAY change for a message | ||||
msg-att-static = "ENVELOPE" SP envelope / "INTERNALDATE" SP date-time / | move = "MOVE" SP sequence-set SP mailbox | |||
"RFC822.SIZE" SP number64 / | ||||
"BODY" ["STRUCTURE"] SP body / | ||||
"BODY" section ["<" number ">"] SP nstring / | ||||
"BINARY" section-binary SP (nstring / literal8) / | ||||
"BINARY.SIZE" section-binary SP number / | ||||
"UID" SP uniqueid | ||||
; MUST NOT change for a message | ||||
name-component = 1*UTF8-CHAR | msg-att = "(" (msg-att-dynamic / msg-att-static) | |||
; MUST NOT contain ".", "/", "%", or "*" | *(SP (msg-att-dynamic / msg-att-static)) ")" | |||
namespace = nil / "(" 1*namespace-descr ")" | msg-att-dynamic = "FLAGS" SP "(" [flag-fetch *(SP flag-fetch)] ")" | |||
; MAY change for a message | ||||
namespace-command = "NAMESPACE" | msg-att-static = "ENVELOPE" SP envelope / | |||
"INTERNALDATE" SP date-time / | ||||
"RFC822.SIZE" SP number64 / | ||||
"BODY" ["STRUCTURE"] SP body / | ||||
"BODY" section ["<" number ">"] SP nstring / | ||||
"BINARY" section-binary SP (nstring / literal8) / | ||||
"BINARY.SIZE" section-binary SP number / | ||||
"UID" SP uniqueid | ||||
; MUST NOT change for a message | ||||
namespace-descr = "(" string SP | name-component = 1*UTF8-CHAR | |||
(DQUOTE QUOTED-CHAR DQUOTE / nil) | ; MUST NOT contain ".", "/", "%", or "*" | |||
[namespace-response-extensions] ")" | ||||
namespace-response-extensions = *namespace-response-extension | namespace = nil / "(" 1*namespace-descr ")" | |||
namespace-response-extension = SP string SP | namespace-command = "NAMESPACE" | |||
"(" string *(SP string) ")" | ||||
namespace-response = "NAMESPACE" SP namespace | namespace-descr = "(" string SP | |||
SP namespace SP namespace | (DQUOTE QUOTED-CHAR DQUOTE / nil) | |||
[namespace-response-extensions] ")" | ||||
namespace-response-extensions = *namespace-response-extension | ||||
namespace-response-extension = SP string SP | ||||
"(" string *(SP string) ")" | ||||
namespace-response = "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 | |||
; 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) | |||
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) | |||
oldname-extended-item = "OLDNAME" SP "(" mailbox ")" | obsolete-flag-recent = "\Recent" | |||
; Extended data item (mbox-list-extended-item) | ||||
; returned in a LIST response when a mailbox is | ||||
; renamed or deleted. Also returned when | ||||
; the server canonicalized the provided mailbox | ||||
; name. | ||||
; Note 1: the OLDNAME tag can be returned | ||||
; with or without surrounding quotes, as per | ||||
; mbox-list-extended-item-tag production. | ||||
option-extension = (option-standard-tag / option-vendor-tag) | obsolete-recent-response = number SP "RECENT" | |||
[SP option-value] | ||||
option-standard-tag = atom | obsolete-search-response = "SEARCH" *(SP nz-number) | |||
; an option defined in a Standards Track or | ||||
; Experimental RFC | ||||
option-val-comp = astring / | oldname-extended-item = "OLDNAME" SP "(" mailbox ")" | |||
option-val-comp *(SP option-val-comp) / | ; Extended data item (mbox-list-extended-item) | |||
"(" option-val-comp ")" | ; returned in a LIST response when a mailbox is | |||
; renamed or deleted. Also returned when | ||||
; the server canonicalized the provided mailbox | ||||
; name. | ||||
; Note 1: the OLDNAME tag can be returned | ||||
; with or without surrounding quotes, as per | ||||
; mbox-list-extended-item-tag production. | ||||
option-value = "(" option-val-comp ")" | option-extension = (option-standard-tag / option-vendor-tag) | |||
[SP option-value] | ||||
option-vendor-tag = vendor-token "-" atom | option-standard-tag = atom | |||
; a vendor-specific option, non-standard | ; an option defined in a Standards Track or | |||
; Experimental RFC | ||||
partial-range = number64 ["." nz-number64] | option-val-comp = astring / | |||
; Copied from RFC 5092 (IMAP URL) | option-val-comp *(SP option-val-comp) / | |||
; and updated to support 64bit sizes. | "(" option-val-comp ")" | |||
partial = "<" number64 "." nz-number64 ">" | option-value = "(" option-val-comp ")" | |||
; Partial FETCH request. 0-based offset of | ||||
; the first octet, followed by the number of octets | ||||
; in the fragment. | ||||
password = astring | option-vendor-tag = vendor-token "-" atom | |||
; a vendor-specific option, non-standard | ||||
patterns = "(" list-mailbox ")" | partial-range = number64 ["." nz-number64] | |||
; [RFC5258] supports multiple patterns, | ; Copied from RFC 5092 (IMAP URL) | |||
; but this document only requires one | ; and updated to support 64-bit sizes. | |||
; to be supported. | ||||
; If the server is also implementing | ||||
; [RFC5258], "patterns" syntax from that | ||||
; document must be followed. | ||||
quoted = DQUOTE *QUOTED-CHAR DQUOTE | partial = "<" number64 "." nz-number64 ">" | |||
; Partial FETCH request. 0-based offset of | ||||
; the first octet, followed by the number of | ||||
; octets in the fragment. | ||||
QUOTED-CHAR = <any TEXT-CHAR except quoted-specials> / | password = astring | |||
"\" quoted-specials / UTF8-2 / UTF8-3 / UTF8-4 | ||||
quoted-specials = DQUOTE / "\" | patterns = "(" list-mailbox ")" | |||
; [RFC5258] supports multiple patterns, | ||||
; but this document only requires one | ||||
; to be supported. | ||||
; If the server is also implementing | ||||
; [RFC5258], the "patterns" syntax from | ||||
; that document must be followed. | ||||
rename = "RENAME" SP mailbox SP mailbox | quoted = DQUOTE *QUOTED-CHAR DQUOTE | |||
; Use of INBOX as a destination gives a NO error | ||||
response = *(continue-req / response-data) response-done | QUOTED-CHAR = <any TEXT-CHAR except quoted-specials> / | |||
"\" quoted-specials / UTF8-2 / UTF8-3 / UTF8-4 | ||||
response-data = "*" SP (resp-cond-state / resp-cond-bye / | quoted-specials = DQUOTE / "\" | |||
mailbox-data / message-data / capability-data / | ||||
enable-data) CRLF | ||||
response-done = response-tagged / response-fatal | rename = "RENAME" SP mailbox SP mailbox | |||
; Use of INBOX as a destination gives a NO error | ||||
response-fatal = "*" SP resp-cond-bye CRLF | response = *(continue-req / response-data) response-done | |||
; Server closes connection immediately | ||||
response-tagged = tag SP resp-cond-state CRLF | response-data = "*" SP (resp-cond-state / resp-cond-bye / | |||
mailbox-data / message-data / capability-data / | ||||
enable-data) CRLF | ||||
resp-code-apnd = "APPENDUID" SP nz-number SP append-uid | response-done = response-tagged / response-fatal | |||
resp-code-copy = "COPYUID" SP nz-number SP uid-set SP uid-set | response-fatal = "*" SP resp-cond-bye CRLF | |||
resp-cond-auth = ("OK" / "PREAUTH") SP resp-text | ; Server closes connection immediately | |||
; Authentication condition | ||||
resp-cond-bye = "BYE" SP resp-text | response-tagged = tag SP resp-cond-state CRLF | |||
resp-cond-state = ("OK" / "NO" / "BAD") SP resp-text | resp-code-apnd = "APPENDUID" SP nz-number SP append-uid | |||
; Status condition | ||||
resp-specials = "]" | resp-code-copy = "COPYUID" SP nz-number SP uid-set SP uid-set | |||
resp-text = ["[" resp-text-code "]" SP] [text] | resp-cond-auth = ("OK" / "PREAUTH") SP resp-text | |||
; Authentication condition | ||||
resp-text-code = "ALERT" / | resp-cond-bye = "BYE" SP resp-text | |||
"BADCHARSET" [SP "(" charset *(SP charset) ")" ] / | ||||
capability-data / "PARSE" / | ||||
"PERMANENTFLAGS" SP | ||||
"(" [flag-perm *(SP flag-perm)] ")" / | ||||
"READ-ONLY" / "READ-WRITE" / "TRYCREATE" / | ||||
"UIDNEXT" SP nz-number / "UIDVALIDITY" SP nz-number / | ||||
resp-code-apnd / resp-code-copy / "UIDNOTSTICKY" / | ||||
"UNAVAILABLE" / "AUTHENTICATIONFAILED" / | ||||
"AUTHORIZATIONFAILED" / "EXPIRED" / | ||||
"PRIVACYREQUIRED" / "CONTACTADMIN" / "NOPERM" / | ||||
"INUSE" / "EXPUNGEISSUED" / "CORRUPTION" / | ||||
"SERVERBUG" / "CLIENTBUG" / "CANNOT" / | ||||
"LIMIT" / "OVERQUOTA" / "ALREADYEXISTS" / | ||||
"NONEXISTENT" / "NOTSAVED" / "HASCHILDREN" / | ||||
"CLOSED" / | ||||
"UNKNOWN-CTE" / | ||||
atom [SP 1*<any TEXT-CHAR except "]">] | ||||
return-option = "SUBSCRIBED" / "CHILDREN" / status-option / | resp-cond-state = ("OK" / "NO" / "BAD") SP resp-text | |||
option-extension | ; Status condition | |||
search = "SEARCH" [search-return-opts] | resp-specials = "]" | |||
SP search-program | ||||
search-correlator = SP "(" "TAG" SP tag-string ")" | resp-text = ["[" resp-text-code "]" SP] [text] | |||
search-key = "ALL" / "ANSWERED" / "BCC" SP astring / | resp-text-code = "ALERT" / | |||
"BEFORE" SP date / "BODY" SP astring / | "BADCHARSET" [SP "(" charset *(SP charset) ")" ] / | |||
"CC" SP astring / "DELETED" / "FLAGGED" / | capability-data / "PARSE" / | |||
"FROM" SP astring / "KEYWORD" SP flag-keyword / | "PERMANENTFLAGS" SP | |||
"ON" SP date / "SEEN" / | "(" [flag-perm *(SP flag-perm)] ")" / | |||
"SINCE" SP date / "SUBJECT" SP astring / | "READ-ONLY" / "READ-WRITE" / "TRYCREATE" / | |||
"TEXT" SP astring / "TO" SP astring / | "UIDNEXT" SP nz-number / | |||
"UNANSWERED" / "UNDELETED" / "UNFLAGGED" / | "UIDVALIDITY" SP nz-number / | |||
"UNKEYWORD" SP flag-keyword / "UNSEEN" / | resp-code-apnd / resp-code-copy / "UIDNOTSTICKY" / | |||
; Above this line were in [IMAP2] | "UNAVAILABLE" / "AUTHENTICATIONFAILED" / | |||
"DRAFT" / "HEADER" SP header-fld-name SP astring / | "AUTHORIZATIONFAILED" / "EXPIRED" / | |||
"LARGER" SP number64 / "NOT" SP search-key / | "PRIVACYREQUIRED" / "CONTACTADMIN" / "NOPERM" / | |||
"OR" SP search-key SP search-key / | "INUSE" / "EXPUNGEISSUED" / "CORRUPTION" / | |||
"SENTBEFORE" SP date / "SENTON" SP date / | "SERVERBUG" / "CLIENTBUG" / "CANNOT" / | |||
"SENTSINCE" SP date / "SMALLER" SP number64 / | "LIMIT" / "OVERQUOTA" / "ALREADYEXISTS" / | |||
"UID" SP sequence-set / "UNDRAFT" / sequence-set / | "NONEXISTENT" / "NOTSAVED" / "HASCHILDREN" / | |||
"(" search-key *(SP search-key) ")" | "CLOSED" / | |||
"UNKNOWN-CTE" / | ||||
atom [SP 1*<any TEXT-CHAR except "]">] | ||||
search-modifier-name = tagged-ext-label | return-option = "SUBSCRIBED" / "CHILDREN" / status-option / | |||
option-extension | ||||
search-mod-params = tagged-ext-val | search = "SEARCH" [search-return-opts] | |||
; This non-terminal shows recommended syntax | SP search-program | |||
; for future extensions. | ||||
search-program = ["CHARSET" SP charset SP] | search-correlator = SP "(" "TAG" SP tag-string ")" | |||
search-key *(SP search-key) | ||||
; CHARSET argument to SEARCH MUST be | ||||
; registered with IANA. | ||||
search-ret-data-ext = search-modifier-name SP search-return-value | search-key = "ALL" / "ANSWERED" / "BCC" SP astring / | |||
; Note that not every SEARCH return option | "BEFORE" SP date / "BODY" SP astring / | |||
; is required to have the corresponding | "CC" SP astring / "DELETED" / "FLAGGED" / | |||
; ESEARCH return data. | "FROM" SP astring / "KEYWORD" SP flag-keyword / | |||
"ON" SP date / "SEEN" / | ||||
"SINCE" SP date / "SUBJECT" SP astring / | ||||
"TEXT" SP astring / "TO" SP astring / | ||||
"UNANSWERED" / "UNDELETED" / "UNFLAGGED" / | ||||
"UNKEYWORD" SP flag-keyword / "UNSEEN" / | ||||
; Above this line were in [IMAP2] | ||||
"DRAFT" / "HEADER" SP header-fld-name SP astring / | ||||
"LARGER" SP number64 / "NOT" SP search-key / | ||||
"OR" SP search-key SP search-key / | ||||
"SENTBEFORE" SP date / "SENTON" SP date / | ||||
"SENTSINCE" SP date / "SMALLER" SP number64 / | ||||
"UID" SP sequence-set / "UNDRAFT" / sequence-set / | ||||
"(" search-key *(SP search-key) ")" | ||||
search-return-data = "MIN" SP nz-number / | search-modifier-name = tagged-ext-label | |||
"MAX" SP nz-number / | ||||
"ALL" SP sequence-set / | ||||
"COUNT" SP number / | ||||
search-ret-data-ext | ||||
; All return data items conform to | ||||
; search-ret-data-ext syntax. | ||||
; Note that "$" marker is not allowed | ||||
; after the ALL return data item. | ||||
search-return-opts = SP "RETURN" SP "(" [search-return-opt | search-mod-params = tagged-ext-val | |||
*(SP search-return-opt)] ")" | ; This non-terminal shows recommended syntax | |||
; for future extensions. | ||||
search-return-opt = "MIN" / "MAX" / "ALL" / "COUNT" / | search-program = ["CHARSET" SP charset SP] | |||
"SAVE" / | search-key *(SP search-key) | |||
search-ret-opt-ext | ; CHARSET argument to SEARCH MUST be | |||
; conforms to generic search-ret-opt-ext | ; registered with IANA. | |||
; syntax | ||||
search-ret-opt-ext = search-modifier-name [SP search-mod-params] | search-ret-data-ext = search-modifier-name SP search-return-value | |||
; Note that not every SEARCH return option | ||||
; is required to have the corresponding | ||||
; ESEARCH return data. | ||||
search-return-value = tagged-ext-val | search-return-data = "MIN" SP nz-number / | |||
; Data for the returned search option. | "MAX" SP nz-number / | |||
"ALL" SP sequence-set / | ||||
"COUNT" SP number / | ||||
search-ret-data-ext | ||||
; All return data items conform to | ||||
; search-ret-data-ext syntax. | ||||
; Note that "$" marker is not allowed | ||||
; after the ALL return data item. | ||||
; A single "nz-number"/"number"/"number64" value | search-return-opts = SP "RETURN" SP "(" [search-return-opt | |||
; can be returned as an atom (i.e., without | *(SP search-return-opt)] ")" | |||
; quoting). A sequence-set can be returned | ||||
; as an atom as well. | ||||
section = "[" [section-spec] "]" | search-return-opt = "MIN" / "MAX" / "ALL" / "COUNT" / | |||
"SAVE" / | ||||
search-ret-opt-ext | ||||
; conforms to generic search-ret-opt-ext | ||||
; syntax | ||||
section-binary = "[" [section-part] "]" | search-ret-opt-ext = search-modifier-name [SP search-mod-params] | |||
section-msgtext = "HEADER" / "HEADER.FIELDS" [".NOT"] SP header-list / | search-return-value = tagged-ext-val | |||
"TEXT" | ; Data for the returned search option. | |||
; top-level or MESSAGE/RFC822 or MESSAGE/GLOBAL part | ; A single "nz-number"/"number"/"number64" value | |||
; can be returned as an atom (i.e., without | ||||
; quoting). A sequence-set can be returned | ||||
; as an atom as well. | ||||
section-part = nz-number *("." nz-number) | section = "[" [section-spec] "]" | |||
; body part reference. | ||||
; Allows for accessing nested body parts. | ||||
section-spec = section-msgtext / (section-part ["." section-text]) | section-binary = "[" [section-part] "]" | |||
section-text = section-msgtext / "MIME" | section-msgtext = "HEADER" / | |||
; text other than actual body part (headers, etc.) | "HEADER.FIELDS" [".NOT"] SP header-list / | |||
"TEXT" | ||||
; top-level or MESSAGE/RFC822 or | ||||
; MESSAGE/GLOBAL part | ||||
select = "SELECT" SP mailbox | section-part = nz-number *("." nz-number) | |||
; body part reference. | ||||
; Allows for accessing nested body parts. | ||||
seq-number = nz-number / "*" | section-spec = section-msgtext / (section-part ["." section-text]) | |||
; message sequence number (COPY, FETCH, STORE | ||||
; commands) or unique identifier (UID COPY, | ||||
; UID FETCH, UID STORE commands). | ||||
; * represents the largest number in use. In | ||||
; the case of message sequence numbers, it is | ||||
; the number of messages in a non-empty mailbox. | ||||
; In the case of unique identifiers, it is the | ||||
; unique identifier of the last message in the | ||||
; mailbox or, if the mailbox is empty, the | ||||
; mailbox's current UIDNEXT value. | ||||
; The server should respond with a tagged BAD | ||||
; response to a command that uses a message | ||||
; sequence number greater than the number of | ||||
; messages in the selected mailbox. This | ||||
; includes "*" if the selected mailbox is empty. | ||||
seq-range = seq-number ":" seq-number | section-text = section-msgtext / "MIME" | |||
; two seq-number values and all values between | ; text other than actual body part (headers, | |||
; these two regardless of order. | ; etc.) | |||
; Example: 2:4 and 4:2 are equivalent and indicate | ||||
; values 2, 3, and 4. | ||||
; Example: a unique identifier sequence range of | ||||
; 3291:* includes the UID of the last message in | ||||
; the mailbox, even if that value is less than 3291. | ||||
sequence-set = (seq-number / seq-range) ["," sequence-set] | select = "SELECT" SP mailbox | |||
; set of seq-number values, regardless of order. | ||||
; Servers MAY coalesce overlaps and/or execute the | ||||
; sequence in any order. | ||||
; Example: a message sequence number set of | ||||
; 2,4:7,9,12:* for a mailbox with 15 messages is | ||||
; equivalent to 2,4,5,6,7,9,12,13,14,15 | ||||
; Example: a message sequence number set of *:4,5:7 | ||||
; for a mailbox with 10 messages is equivalent to | ||||
; 10,9,8,7,6,5,4,5,6,7 and MAY be reordered and | ||||
; overlap coalesced to be 4,5,6,7,8,9,10. | ||||
sequence-set =/ seq-last-command | seq-number = nz-number / "*" | |||
; Allow for "result of the last command" indicator. | ; message sequence number (COPY, FETCH, STORE | |||
; commands) or unique identifier (UID COPY, | ||||
; UID FETCH, UID STORE commands). | ||||
; * represents the largest number in use. In | ||||
; the case of message sequence numbers, it is | ||||
; the number of messages in a non-empty mailbox. | ||||
; In the case of unique identifiers, it is the | ||||
; unique identifier of the last message in the | ||||
; mailbox or, if the mailbox is empty, the | ||||
; mailbox's current UIDNEXT value. | ||||
; The server should respond with a tagged BAD | ||||
; response to a command that uses a message | ||||
; sequence number greater than the number of | ||||
; messages in the selected mailbox. This | ||||
; includes "*" if the selected mailbox is empty. | ||||
seq-last-command = "$" | seq-range = seq-number ":" seq-number | |||
; two seq-number values and all values between | ||||
; these two regardless of order. | ||||
; Example: 2:4 and 4:2 are equivalent and | ||||
; indicate values 2, 3, and 4. | ||||
; Example: a unique identifier sequence range of | ||||
; 3291:* includes the UID of the last message in | ||||
; the mailbox, even if that value is less than | ||||
; 3291. | ||||
status = "STATUS" SP mailbox SP | sequence-set = (seq-number / seq-range) ["," sequence-set] | |||
"(" status-att *(SP status-att) ")" | ; set of seq-number values, regardless of order. | |||
; Servers MAY coalesce overlaps and/or execute | ||||
; the sequence in any order. | ||||
; Example: a message sequence number set of | ||||
; 2,4:7,9,12:* for a mailbox with 15 messages is | ||||
; equivalent to 2,4,5,6,7,9,12,13,14,15 | ||||
; Example: a message sequence number set of | ||||
; *:4,5:7 for a mailbox with 10 messages is | ||||
; equivalent to 10,9,8,7,6,5,4,5,6,7 and MAY | ||||
; be reordered and overlap coalesced to be | ||||
; 4,5,6,7,8,9,10. | ||||
status-att = "MESSAGES" / "UIDNEXT" / "UIDVALIDITY" / | sequence-set =/ seq-last-command | |||
"UNSEEN" / "DELETED" / "SIZE" | ; Allow for "result of the last command" | |||
; indicator. | ||||
status-att-val = ("MESSAGES" SP number) / | seq-last-command = "$" | |||
("UIDNEXT" SP nz-number) / | ||||
("UIDVALIDITY" SP nz-number) / | ||||
("UNSEEN" SP number) / | ||||
("DELETED" SP number) / | ||||
("SIZE" SP number64) | ||||
; Extensions to the STATUS responses | ||||
; should extend this production. | ||||
; Extensions should use the generic | ||||
; syntax defined by tagged-ext. | ||||
status-att-list = status-att-val *(SP status-att-val) | status = "STATUS" SP mailbox SP | |||
"(" status-att *(SP status-att) ")" | ||||
status-option = "STATUS" SP "(" status-att *(SP status-att) ")" | status-att = "MESSAGES" / "UIDNEXT" / "UIDVALIDITY" / | |||
; This ABNF production complies with | "UNSEEN" / "DELETED" / "SIZE" | |||
; <option-extension> syntax. | ||||
store = "STORE" SP sequence-set SP store-att-flags | status-att-val = ("MESSAGES" SP number) / | |||
("UIDNEXT" SP nz-number) / | ||||
("UIDVALIDITY" SP nz-number) / | ||||
("UNSEEN" SP number) / | ||||
("DELETED" SP number) / | ||||
("SIZE" SP number64) | ||||
; Extensions to the STATUS responses | ||||
; should extend this production. | ||||
; Extensions should use the generic | ||||
; syntax defined by tagged-ext. | ||||
store-att-flags = (["+" / "-"] "FLAGS" [".SILENT"]) SP | status-att-list = status-att-val *(SP status-att-val) | |||
(flag-list / (flag *(SP flag))) | ||||
string = quoted / literal | status-option = "STATUS" SP "(" status-att *(SP status-att) ")" | |||
subscribe = "SUBSCRIBE" SP mailbox | ; This ABNF production complies with | |||
; <option-extension> syntax. | ||||
tag = 1*<any ASTRING-CHAR except "+"> | store = "STORE" SP sequence-set SP store-att-flags | |||
tag-string = astring | store-att-flags = (["+" / "-"] "FLAGS" [".SILENT"]) SP | |||
; <tag> represented as <astring> | (flag-list / (flag *(SP flag))) | |||
tagged-ext-label = tagged-label-fchar *tagged-label-char | string = quoted / literal | |||
; Is a valid RFC 3501 "atom". | ||||
tagged-label-fchar = ALPHA / "-" / "_" / "." | subscribe = "SUBSCRIBE" SP mailbox | |||
tagged-label-char = tagged-label-fchar / DIGIT / ":" | tag = 1*<any ASTRING-CHAR except "+"> | |||
tagged-ext-comp = astring / | tag-string = astring | |||
tagged-ext-comp *(SP tagged-ext-comp) / | ; <tag> represented as <astring> | |||
"(" tagged-ext-comp ")" | ||||
; Extensions that follow this general | ||||
; syntax should use nstring instead of | ||||
; astring when appropriate in the context | ||||
; of the extension. | ||||
; Note that a message set or a "number" | ||||
; can always be represented as an "atom". | ||||
; An URL should be represented as | ||||
; a "quoted" string. | ||||
tagged-ext-simple = sequence-set / number / number64 | tagged-ext-label = tagged-label-fchar *tagged-label-char | |||
; Is a valid RFC 3501 "atom". | ||||
tagged-ext-val = tagged-ext-simple / | tagged-label-fchar = ALPHA / "-" / "_" / "." | |||
"(" [tagged-ext-comp] ")" | ||||
text = 1*(TEXT-CHAR / UTF8-2 / UTF8-3 / UTF8-4) | tagged-label-char = tagged-label-fchar / DIGIT / ":" | |||
; Non ASCII text can only be returned | ||||
; after ENABLE IMAP4rev2 command | ||||
TEXT-CHAR = <any CHAR except CR and LF> | tagged-ext-comp = astring / | |||
tagged-ext-comp *(SP tagged-ext-comp) / | ||||
"(" tagged-ext-comp ")" | ||||
; Extensions that follow this general | ||||
; syntax should use nstring instead of | ||||
; astring when appropriate in the context | ||||
; of the extension. | ||||
; Note that a message set or a "number" | ||||
; can always be represented as an "atom". | ||||
; A URL should be represented as | ||||
; a "quoted" string. | ||||
time = 2DIGIT ":" 2DIGIT ":" 2DIGIT | tagged-ext-simple = sequence-set / number / number64 | |||
; Hours minutes seconds | ||||
uid = "UID" SP | tagged-ext-val = tagged-ext-simple / | |||
(copy / move / fetch / search / store / uid-expunge) | "(" [tagged-ext-comp] ")" | |||
; Unique identifiers used instead of message | ||||
; sequence numbers | ||||
uid-expunge = "EXPUNGE" SP sequence-set | text = 1*(TEXT-CHAR / UTF8-2 / UTF8-3 / UTF8-4) | |||
; Unique identifiers used instead of message | ; Non-ASCII text can only be returned | |||
; sequence numbers | ; after ENABLE IMAP4rev2 command | |||
uid-set = (uniqueid / uid-range) *("," uid-set) | TEXT-CHAR = <any CHAR except CR and LF> | |||
uid-range = (uniqueid ":" uniqueid) | time = 2DIGIT ":" 2DIGIT ":" 2DIGIT | |||
; two uniqueid values and all values | ; Hours minutes seconds | |||
; between these two regards of order. | ||||
; Example: 2:4 and 4:2 are equivalent. | ||||
uniqueid = nz-number | uid = "UID" SP | |||
; Strictly ascending | (copy / move / fetch / search / store / | |||
uid-expunge) | ||||
; Unique identifiers used instead of message | ||||
; sequence numbers | ||||
unsubscribe = "UNSUBSCRIBE" SP mailbox | uid-expunge = "EXPUNGE" SP sequence-set | |||
; Unique identifiers used instead of message | ||||
; sequence numbers | ||||
userid = astring | uid-set = (uniqueid / uid-range) *("," uid-set) | |||
UTF8-CHAR = <Defined in Section 4 of RFC 3629> | uid-range = (uniqueid ":" uniqueid) | |||
; two uniqueid values and all values | ||||
; between these two regardless of order. | ||||
; Example: 2:4 and 4:2 are equivalent. | ||||
UTF8-2 = <Defined in Section 4 of RFC 3629> | uniqueid = nz-number | |||
; Strictly ascending | ||||
UTF8-3 = <Defined in Section 4 of RFC 3629> | unsubscribe = "UNSUBSCRIBE" SP mailbox | |||
UTF8-4 = <Defined in Section 4 of RFC 3629> | userid = astring | |||
vendor-token = "vendor." name-component | UTF8-CHAR = <Defined in Section 4 of RFC 3629> | |||
; Definition copied from RFC 2244. | ||||
; MUST be registered with IANA | ||||
zone = ("+" / "-") 4DIGIT | UTF8-2 = <Defined in Section 4 of RFC 3629> | |||
; Signed four-digit value of hhmm representing | ||||
; hours and minutes east of Greenwich (that is, | UTF8-3 = <Defined in Section 4 of RFC 3629> | |||
; the amount that the given time differs from | ||||
; Universal Time). Subtracting the timezone | UTF8-4 = <Defined in Section 4 of RFC 3629> | |||
; from the given time will give the UT form. | ||||
; The Universal Time zone is "+0000". | vendor-token = "vendor." name-component | |||
; Definition copied from RFC 2244. | ||||
; MUST be registered with IANA | ||||
zone = ("+" / "-") 4DIGIT | ||||
; Signed four-digit value of hhmm representing | ||||
; hours and minutes east of Greenwich (that is, | ||||
; the amount that the given time differs from | ||||
; Universal Time). Subtracting the timezone | ||||
; from the given time will give the UT form. | ||||
; The Universal Time zone is "+0000". | ||||
10. Author's Note | 10. Author's Note | |||
This document is a revision or rewrite of earlier documents, and | This document is a revision or rewrite of earlier documents and | |||
supercedes the protocol specification in those documents: RFC 3501, | supercedes the protocol specification in those documents: [RFC3501], | |||
RFC 2060, RFC 1730, unpublished IMAP2bis.TXT document, RFC 1176, and | [RFC2060], [RFC1730], unpublished IMAP2bis.TXT document, [IMAP2], and | |||
RFC 1064. | [RFC1064]. | |||
11. Security Considerations | 11. Security Considerations | |||
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 | sent in the clear over the network, exposing them to possible | |||
eavesdropping and manipulation unless protection is negotiated. This | eavesdropping and manipulation unless protection is negotiated. This | |||
can be accomplished either by the use of Implicit TLS port, STARTTLS | can be accomplished by use of the Implicit TLS port, the STARTTLS | |||
command, negotiated confidentiality protection in the AUTHENTICATE | command, negotiated confidentiality protection in the AUTHENTICATE | |||
command, or some other protection mechanism. | command, or some other protection mechanism. | |||
11.1. TLS related Security Considerations | 11.1. TLS-Related Security Considerations | |||
This section applies to both use of STARTTLS command and Implicit TLS | This section applies to use of both the STARTTLS command and the | |||
port. | Implicit TLS port. | |||
IMAP client and server implementations MUST comply with relevant TLS | IMAP client and server implementations MUST comply with relevant TLS | |||
recommendations from [RFC8314]. | recommendations from [RFC8314]. If recommendations/requirements in | |||
this document conflict with recommendations from [RFC8314], for | ||||
example in regards to TLS ciphersuites, recommendations from this | ||||
document take precedence. | ||||
Clients and servers MUST implement TLS 1.2 [TLS-1.2] or newer. Use | Clients and servers MUST implement TLS 1.2 [TLS-1.2] or newer. Use | |||
of TLS 1.3 [TLS-1.3] is RECOMMENDED. TLS 1.2 may be used only in | of TLS 1.3 [TLS-1.3] is RECOMMENDED. TLS 1.2 may be used only in | |||
cases where the other party has not yet implemented TLS 1.3. | cases where the other party has not yet implemented TLS 1.3. | |||
Additionally, when using TLS 1.2, IMAP implementations MUST implement | Additionally, when using TLS 1.2, IMAP implementations MUST implement | |||
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 cipher suite. This is | the TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 cipher suite. This is | |||
important as it assures that any two compliant implementations can be | important as it ensures that any two compliant implementations can be | |||
configured to interoperate. Other TLS cipher suites recommended in | configured to interoperate. Other TLS cipher suites recommended in | |||
RFC 7525 [RFC7525] are RECOMMENDED: | RFC 7525 [RFC7525] are RECOMMENDED: | |||
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, | TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, | |||
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 and | TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, and | |||
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384. All other cipher suites are | TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384. All other cipher suites are | |||
OPTIONAL. Note that this is a change from section 2.1 of [IMAP-TLS]. | OPTIONAL. Note that this is a change from Section 2.1 of [IMAP-TLS]. | |||
The list of mandatory-to-implement TLS 1.3 cipher suites is described | The list of mandatory-to-implement TLS 1.3 cipher suites is described | |||
in Section 9.1 of [TLS-1.3]. | in Section 9.1 of [TLS-1.3]. | |||
During the TLS negotiation [TLS-1.3][TLS-1.2], the client MUST check | During the TLS negotiation [TLS-1.3] [TLS-1.2], the client MUST check | |||
its understanding of the server hostname against the server's | its understanding of the server hostname against the server's | |||
identity as presented in the server Certificate message, in order to | identity as presented in the server Certificate message, in order to | |||
prevent on-path attackers attempting to masquerade as the server. | prevent on-path attackers attempting to masquerade as the server. | |||
This procedure is described in [RFC7817]. | This procedure is described in [RFC7817]. | |||
Both the client and server MUST check the result of the STARTTLS | Both the client and server MUST check the result of the STARTTLS | |||
command and subsequent TLS ([TLS-1.3][TLS-1.2]) negotiation to see | command and subsequent TLS [TLS-1.3] [TLS-1.2] negotiation to see | |||
whether acceptable authentication and/or privacy was achieved. | whether acceptable authentication and/or privacy was achieved. | |||
11.2. STARTTLS command versa use of Implicit TLS port | 11.2. STARTTLS Command versus Use of Implicit TLS Port | |||
For maximum backward compatibility the client MUST implement both TLS | For maximum backward compatibility, the client MUST implement both | |||
negotiation on implicit TLS port and TLS negotiation using STARTTLS | TLS negotiation on an Implicit TLS port and TLS negotiation using the | |||
command on cleartext port. | STARTTLS command on a cleartext port. | |||
The server MUST implement TLS negotiation on implicit TLS port. The | The server MUST implement TLS negotiation on an Implicit TLS port. | |||
server SHOULD also implement IMAP on cleartext port. If the server | The server SHOULD also implement IMAP on a cleartext port. If the | |||
listens on a cleartext port, it MUST allow STARTTLS command on it. | server listens on a cleartext port, it MUST allow the STARTTLS | |||
command on it. | ||||
Some site/firewall maintainers insist on TLS site-wide and prefer not | Some site/firewall maintainers insist on TLS site-wide and prefer not | |||
to rely on a configuration option in each higher-level protocol. For | to rely on a configuration option in each higher-level protocol. For | |||
this reason, IMAP4rev2 clients SHOULD try both ports 993 and 143 (and | this reason, IMAP4rev2 clients SHOULD try both ports 993 and 143 (and | |||
both IPv4 and IPv6) concurrently by default, unless overridden by | both IPv4 and IPv6) concurrently by default, unless overridden by | |||
either user configuration or DNS SRV records [RFC6186]. A good | either user configuration or DNS SRV records [RFC6186]. A good | |||
algorithm for implementing such concurrent connect is described in | algorithm for implementing such concurrent connect is described in | |||
[RFC8305]. | [RFC8305]. | |||
11.3. Client handling of unsolicited responses not suitable for the | 11.3. Client Handling of Unsolicited Responses Not Suitable for the | |||
current connection state | Current Connection State | |||
Cleartext mail transmission (whether caused by firewall configuration | Cleartext mail transmission (whether caused by firewall configuration | |||
errors that result in TLS stripping or weak security policies in | errors that result in TLS stripping or weak security policies in | |||
email clients that choose not to negotiate TLS in the first place) | email clients that choose not to negotiate TLS in the first place) | |||
can enable injection of responses that can confuse or even cause | can enable injection of responses that can confuse or even cause | |||
crashes in email clients. The following measures are recommended to | crashes in email clients. The following measures are recommended to | |||
minimize damage from them. | minimize damage from them. | |||
See Section 7.1.4 for special security considerations related to | * See Section 7.1.4 for special security considerations related to | |||
PREAUTH response. | the PREAUTH response. | |||
Many server responses and response codes are only meaningful in | * Many server responses and response codes are only meaningful in | |||
authenticated or even selected state. However, nothing prevents a | authenticated or even selected state. However, nothing prevents a | |||
server (or an on-path attacker) from sending such invalid | server (or an on-path attacker) from sending such invalid | |||
responses in cleartext before STARTTLS/AUTHENTICATE commands are | responses in cleartext before STARTTLS/AUTHENTICATE commands are | |||
issued. Before authentication clients SHOULD ignore any responses | issued. Before authentication, clients SHOULD ignore any | |||
other than CAPABILITY and server status responses (Section 7.1), | responses other than CAPABILITY and server status responses | |||
as well as any response codes other than CAPABILITY. (In | (Section 7.1), as well as any response codes other than | |||
particular, some email clients are known to incorrectly process | CAPABILITY. (In particular, some email clients are known to | |||
LIST responses received before authentication.) Clients SHOULD | incorrectly process LIST responses received before authentication, | |||
or FETCH responses when no mailbox is selected.) Clients SHOULD | ||||
ignore the ALERT response code until after TLS (whether using | ignore the ALERT response code until after TLS (whether using | |||
STARTTLS or TLS negotiation on implicit TLS port) or SASL security | STARTTLS or TLS negotiation on an Implicit TLS port) or a SASL | |||
layer with confidentiality protection has been successfully | security layer with confidentiality protection has been | |||
negotiated. Unless explicitly allowed by an IMAP extension, when | successfully negotiated. Unless explicitly allowed by an IMAP | |||
not in selected state clients MUST ignore responses/response codes | extension, when not in selected state, clients MUST ignore | |||
related to message and mailbox status such as FLAGS, EXIST, | responses / response codes related to message and mailbox status | |||
EXPUNGE and FETCH. | such as FLAGS, EXIST, EXPUNGE, and FETCH. | |||
11.4. COPYUID and APPENDUID response codes | 11.4. COPYUID and APPENDUID Response Codes | |||
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. | |||
Consequently, these response codes SHOULD NOT be issued if the client | Consequently, these response codes SHOULD NOT be issued if the client | |||
does not have access to SELECT or EXAMINE the mailbox. | does not have access to SELECT or EXAMINE the mailbox. | |||
11.5. LIST command and Other Users' namespace | 11.5. LIST Command and Other Users' Namespace | |||
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 MUST NOT list users that 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. | |||
11.6. Use of MD5 | 11.6. Use of MD5 | |||
The BODYSTRUCTURE FETCH Data item can contain a the MD5 digest of the | The BODYSTRUCTURE FETCH data item can contain 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 | While MD5 is no longer considered a secure cryptographic hash | |||
[RFC6151], this field is used solely to expose the value of the | [RFC6151], this field is used solely to expose the value of the | |||
Content-MD5 header field (if present in the original message), which | Content-MD5 header field (if present in the original message), which | |||
is just a message integrity check and is not used for cryptographic | is just a message integrity check and is not used for cryptographic | |||
purposes. Also note that other mechanisms that provide message | purposes. Also note that other mechanisms that provide message | |||
integrity checks were defined since RFC 1864 was published and are | integrity checks were defined since RFC 1864 [MD5] was published and | |||
now more commonly used than Content-MD5. Two such mechanisms are | are now more commonly used than Content-MD5. Two such mechanisms are | |||
DKIM-Signature [RFC6376] header field and S/MIME signing | the DKIM-Signature header field [RFC6376] and S/MIME signing | |||
[RFC8550][RFC8550]. | [RFC8550] [RFC8551]. | |||
11.7. Other Security Considerations | 11.7. Other Security Considerations | |||
A server error message for an AUTHENTICATE command which fails due to | A server error message for an AUTHENTICATE command that fails due to | |||
invalid credentials SHOULD NOT detail why the credentials are | invalid credentials SHOULD NOT detail why the credentials are | |||
invalid. | invalid. | |||
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 [SASL] mechanism | avoided by using the AUTHENTICATE command with a [SASL] 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. | |||
A server implementation MUST implement a configuration that, at the | A server implementation MUST implement a configuration that, at the | |||
time of authentication, requires: | time of authentication, requires: | |||
(1) The STARTTLS command has been negotiated or TLS negotiated on | ||||
implicit TLS port. | 1. The STARTTLS command has been negotiated or TLS negotiated on an | |||
OR | Implicit TLS port | |||
(2) Some other mechanism that protects the session from password | OR | |||
snooping has been provided. | 2. Some other mechanism that protects the session from password | |||
OR | snooping has been provided | |||
(3) The following measures are in place: | OR | |||
(a) The LOGINDISABLED capability is advertised, and [SASL] mechanisms | 3. The following measures are in place: | |||
(such as PLAIN) using plaintext passwords are NOT advertised in the | a) The LOGINDISABLED capability is advertised, and [SASL] | |||
CAPABILITY list. | mechanisms (such as PLAIN) using plaintext passwords are NOT | |||
AND | advertised in the CAPABILITY list. | |||
(b) The LOGIN command returns an error even if the password is | AND | |||
correct. | b) The LOGIN command returns an error even if the password is | |||
AND | correct | |||
(c) The AUTHENTICATE command returns an error with all [SASL] | AND | |||
mechanisms that use plaintext passwords, even if the password is | c) The AUTHENTICATE command returns an error with all [SASL] | |||
correct. | mechanisms that use plaintext passwords, even if the password | |||
is correct. | ||||
A server error message for a failing LOGIN command SHOULD NOT specify | A server error message for a failing LOGIN command SHOULD NOT specify | |||
that the user name, as opposed to the password, is invalid. | that the user name, as opposed to the password, is invalid. | |||
A server SHOULD have mechanisms in place to limit or delay failed | A server SHOULD have mechanisms in place to limit or delay failed | |||
AUTHENTICATE/LOGIN attempts. | AUTHENTICATE/LOGIN attempts. | |||
A server SHOULD report any authentication failure and analyze such | A server SHOULD report any authentication failure and analyze such | |||
authentication failure attempt with regard to a password brute force | authentication failure attempts with regard to a password brute-force | |||
attack as well as a password spraying attack. Accounts with | attack as well as a password spraying attack [NCSC]. Accounts with | |||
passwords that match well known passwords from spraying attacks MUST | passwords that match well-known passwords from spraying attacks MUST | |||
be blocked and users associated with such accounts must be requested | be blocked, and users associated with such accounts must be requested | |||
to change their passwords. Only password with significant strength | to change their passwords. Only a password with significant strength | |||
SHOULD be accepted. | SHOULD be accepted. | |||
Additional security considerations are discussed in the section | Additional security considerations are discussed in the sections that | |||
discussing the AUTHENTICATE (see Section 6.2.2) and LOGIN (see | define the AUTHENTICATE and LOGIN commands (see Sections 6.2.2 and | |||
Section 6.2.3) commands. | 6.2.3, respectively). | |||
12. IANA Considerations | 12. IANA Considerations | |||
IANA is requested to update "Service Names and Transport Protocol | IANA has updated the "Service Names and Transport Protocol Port | |||
Port Numbers" registry as follows: | Numbers" registry as follows: | |||
1. Registration for TCP port 143 and the corresponding "imap" | 1. Registration for TCP port 143 and the corresponding "imap" | |||
service name should be updated to point to this document and RFC | service name have been updated to point to this document and | |||
3501. | [RFC3501]. | |||
2. Registration for TCP port 993 and the corresponding "imaps" | 2. Registration for TCP port 993 and the corresponding "imaps" | |||
service name should be updated to point to this document, RFC | service name have been updated to point to this document, | |||
8314 and RFC 3501. | [RFC8314], and [RFC3501]. | |||
3. Both UDP port 143 and UDP port 993 should be marked as "Reserved" | 3. UDP ports 143 and 993 have both been marked as "Reserved" in the | |||
in the registry. | registry. | |||
Additional IANA actions are specified in subsection of this section. | Additional IANA actions are specified in the subsections that follow. | |||
12.1. Updates to IMAP4 Capabilities registry | 12.1. Updates to IMAP Capabilities Registry | |||
IMAP4 capabilities are registered by publishing a standards track or | IMAP4 capabilities are registered by publishing a Standards Track or | |||
IESG approved informational or experimental RFC. The registry is | IESG-approved Informational or Experimental RFC. The registry is | |||
currently located at: https://www.iana.org/assignments/ | currently located at: <https://www.iana.org/assignments/ | |||
imap4-capabilities | imap4-capabilities> | |||
As this specification revises the AUTH= prefix, STARTTLS and | As this specification revises the AUTH= prefix, STARTTLS, and | |||
LOGINDISABLED extensions, IANA is requested to update registry | LOGINDISABLED extensions, IANA has updated registry entries for these | |||
entries for these 3 extensions to point to this document and RFC | 3 extensions to point to this document and [RFC3501]. | |||
3501. | ||||
12.2. GSSAPI/SASL service name | 12.2. GSSAPI/SASL Service Name | |||
GSSAPI/Kerberos/SASL service names are registered by publishing a | GSSAPI/Kerberos/SASL service names are registered by publishing a | |||
standards track or IESG approved experimental RFC. The registry is | Standards Track or IESG-approved Experimental RFC. The registry is | |||
currently located at: https://www.iana.org/assignments/gssapi- | currently located at: <https://www.iana.org/assignments/gssapi- | |||
service-names | service-names> | |||
IANA is requested to update the "imap" service name previously | IANA has updated the "imap" service name previously registered in | |||
registered in RFC 3501, to point to both this document and RFC 3501. | [RFC3501] to point to both this document and [RFC3501]. | |||
12.3. LIST Selection Options, LIST Return Options, LIST extended data | 12.3. LIST Selection Options, LIST Return Options, and LIST Extended | |||
items | Data Items | |||
[RFC5258] specifies IANA registration procedures for LIST Selection | [RFC5258] specifies IANA registration procedures for LIST selection | |||
Options, LIST Return Options, LIST extended data items. This | options, LIST return options, and LIST extended data items. This | |||
document doesn't change these registration procedures. In particular | document doesn't change these registration procedures. In | |||
LIST selection options (Section 6.3.9.1) and LIST return options | particular, LIST selection options (Section 6.3.9.1) and LIST return | |||
(Section 6.3.9.2) are registered using the procedure specified in | options (Section 6.3.9.2) are registered using the procedure | |||
Section 9 of [RFC5258] (and using the registration template from | specified in Section 9 of [RFC5258] (and using the registration | |||
Section 9.3 of [RFC5258]). LIST Extended Data Items are registered | template from Section 9.3 of [RFC5258]). LIST extended data items | |||
using the registration template from Section 9.6 of [RFC5258]). | are registered using the registration template from Section 9.6 of | |||
[RFC5258]). | ||||
IANA is requested to add a reference to [RFCXXXX] for the "OLDNAME" | IANA has added a reference to RFC 9051 for the "OLDNAME" LIST- | |||
LIST-EXTENDED extended data item entry. This is in addition to the | EXTENDED extended data item entry. This is in addition to the | |||
existing reference to [RFC5465]. | existing reference to [RFC5465]. | |||
12.4. IMAP Mailbox Name Attributes and IMAP Response Codes | 12.4. IMAP Mailbox Name Attributes and IMAP Response Codes | |||
IANA is requested to update the "IMAP Mailbox Name Attributes" | IANA has updated the "IMAP Mailbox Name Attributes" registry to point | |||
registry to point to this document in addition to RFC 3501. | to this document in addition to [RFC3501]. | |||
IANA is requested to update the "IMAP Response Codes" registry to | IANA has updated the "IMAP Response Codes" registry to point to this | |||
point to this document in addition to RFC 3501. | document in addition to [RFC3501]. | |||
13. References | 13. References | |||
13.1. Normative References | ||||
[RFC4752] Melnikov, A., Ed., "The Kerberos V5 ("GSSAPI") Simple | 13.1. Normative References | |||
Authentication and Security Layer (SASL) Mechanism", | ||||
RFC 4752, DOI 10.17487/RFC4752, November 2006, | ||||
<https://www.rfc-editor.org/info/rfc4752>. | ||||
[RFC5258] Leiba, B. and A. Melnikov, "Internet Message Access | ||||
Protocol version 4 - LIST Command Extensions", RFC 5258, | ||||
DOI 10.17487/RFC5258, June 2008, | ||||
<https://www.rfc-editor.org/info/rfc5258>. | ||||
[RFC5788] Melnikov, A. and D. Cridland, "IMAP4 Keyword Registry", | ||||
RFC 5788, DOI 10.17487/RFC5788, March 2010, | ||||
<https://www.rfc-editor.org/info/rfc5788>. | ||||
[ABNF] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax | [ABNF] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax | |||
Specifications: ABNF", STD 68, RFC 5234, January 2008, | Specifications: ABNF", STD 68, RFC 5234, | |||
DOI 10.17487/RFC5234, January 2008, | ||||
<https://www.rfc-editor.org/info/rfc5234>. | <https://www.rfc-editor.org/info/rfc5234>. | |||
[CHARSET] Freed, N. and J. Postel, "IANA Charset Registration | [BCP178] Saint-Andre, P., Crocker, D., and M. Nottingham, | |||
Procedures", BCP 19, RFC 2978, October 2000, | "Deprecating the "X-" Prefix and Similar Constructs in | |||
<https://www.rfc-editor.org/info/rfc2978>. | Application Protocols", BCP 178, RFC 6648, June 2012. | |||
[SCRAM-SHA-256] | <https://www.rfc-editor.org/info/bcp178> | |||
Hansen, T., "SCRAM-SHA-256 and SCRAM-SHA-256-PLUS Simple | ||||
Authentication and Security Layer (SASL) Mechanisms", | [CHARSET] Freed, N. and J. Postel, "IANA Charset Registration | |||
RFC 7677, DOI 10.17487/RFC7677, November 2015, | Procedures", BCP 19, RFC 2978, DOI 10.17487/RFC2978, | |||
<https://www.rfc-editor.org/info/rfc7677>. | October 2000, <https://www.rfc-editor.org/info/rfc2978>. | |||
[DISPOSITION] | [DISPOSITION] | |||
Troost, R., Dorner, S., and K. Moore, Ed., "Communicating | Troost, R., Dorner, S., and K. Moore, Ed., "Communicating | |||
Presentation Information in Internet Messages: The | Presentation Information in Internet Messages: The | |||
Content-Disposition Header Field", RFC 2183, August 1997, | Content-Disposition Header Field", RFC 2183, | |||
DOI 10.17487/RFC2183, August 1997, | ||||
<https://www.rfc-editor.org/info/rfc2183>. | <https://www.rfc-editor.org/info/rfc2183>. | |||
[PLAIN] Zeilenga, K., Ed., "The PLAIN Simple Authentication and | [I18N-HDRS] | |||
Security Layer (SASL) Mechanism", RFC 4616, August 2006, | Yang, A., Steele, S., and N. Freed, "Internationalized | |||
<https://www.rfc-editor.org/info/rfc4616>. | Email Headers", RFC 6532, DOI 10.17487/RFC6532, February | |||
2012, <https://www.rfc-editor.org/info/rfc6532>. | ||||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [IMAP-IMPLEMENTATION] | |||
Requirement Levels", BCP 14, RFC 2119, | Leiba, B., "IMAP4 Implementation Recommendations", | |||
DOI 10.17487/RFC2119, March 1997, | RFC 2683, DOI 10.17487/RFC2683, September 1999, | |||
<https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2683>. | |||
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [IMAP-MULTIACCESS] | |||
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | Gahrns, M., "IMAP4 Multi-Accessed Mailbox Practice", | |||
May 2017, <https://www.rfc-editor.org/info/rfc8174>. | RFC 2180, DOI 10.17487/RFC2180, July 1997, | |||
<https://www.rfc-editor.org/info/rfc2180>. | ||||
[LANGUAGE-TAGS] | [LANGUAGE-TAGS] | |||
Alvestrand, H., "Content Language Headers", RFC 3282, May | Alvestrand, H., "Content Language Headers", RFC 3282, | |||
2002, <https://www.rfc-editor.org/info/rfc3282>. | DOI 10.17487/RFC3282, May 2002, | |||
<https://www.rfc-editor.org/info/rfc3282>. | ||||
[LOCATION] | [LOCATION] Palme, J., Hopmann, A., and N. Shelness, "MIME | |||
Palme, J., Hopmann, A., and N. Shelness, "MIME | ||||
Encapsulation of Aggregate Documents, such as HTML | Encapsulation of Aggregate Documents, such as HTML | |||
(MHTML)", RFC 2557, March 1999, | (MHTML)", RFC 2557, DOI 10.17487/RFC2557, March 1999, | |||
<https://www.rfc-editor.org/info/rfc2557>. | <https://www.rfc-editor.org/info/rfc2557>. | |||
[MD5] Myers, J. and M. Rose, "The Content-MD5 Header Field", | [MD5] Myers, J. and M. Rose, "The Content-MD5 Header Field", | |||
RFC 1864, October 1995, | RFC 1864, DOI 10.17487/RFC1864, October 1995, | |||
<https://www.rfc-editor.org/info/rfc1864>. | <https://www.rfc-editor.org/info/rfc1864>. | |||
[MIME-HDRS] | [MIME-HDRS] | |||
Moore, K., "MIME (Multipurpose Internet Mail Extensions) | Moore, K., "MIME (Multipurpose Internet Mail Extensions) | |||
Part Three: Message Header Extensions for Non-ASCII Text", | Part Three: Message Header Extensions for Non-ASCII Text", | |||
RFC 2047, November 1996, | RFC 2047, DOI 10.17487/RFC2047, November 1996, | |||
<https://www.rfc-editor.org/info/rfc2047>. | <https://www.rfc-editor.org/info/rfc2047>. | |||
[MIME-IMB] | [MIME-IMB] Freed, N. and N. Borenstein, "Multipurpose Internet Mail | |||
Freed, N. and N. Borenstein, "Multipurpose Internet Mail | ||||
Extensions (MIME) Part One: Format of Internet Message | Extensions (MIME) Part One: Format of Internet Message | |||
Bodies", RFC 2045, November 1996, | Bodies", RFC 2045, DOI 10.17487/RFC2045, November 1996, | |||
<https://www.rfc-editor.org/info/rfc2045>. | <https://www.rfc-editor.org/info/rfc2045>. | |||
[MIME-IMT] | [MIME-IMT] Freed, N. and N. Borenstein, "Multipurpose Internet Mail | |||
Freed, N. and N. Borenstein, "Multipurpose Internet Mail | ||||
Extensions (MIME) Part Two: Media Types", RFC 2046, | Extensions (MIME) Part Two: Media Types", RFC 2046, | |||
November 1996, <https://www.rfc-editor.org/info/rfc2046>. | DOI 10.17487/RFC2046, November 1996, | |||
<https://www.rfc-editor.org/info/rfc2046>. | ||||
[RFC2231] Freed, N. and K. Moore, "MIME Parameter Value and Encoded | ||||
Word Extensions: Character Sets, Languages, and | ||||
Continuations", RFC 2231, DOI 10.17487/RFC2231, November | ||||
1997, <https://www.rfc-editor.org/info/rfc2231>. | ||||
[RFC-5322] | ||||
Resnick, P., Ed., "Internet Message Format", RFC 5322, | ||||
October 2008, <https://www.rfc-editor.org/info/rfc5322>. | ||||
[SASL] Melnikov, A., Ed. and K. Zeilenga, Ed., "Simple | ||||
Authentication and Security Layer (SASL)", RFC 4422, June | ||||
2006, <https://www.rfc-editor.org/info/rfc4422>. | ||||
[TLS-1.2] Dierks, T. and E. Rescorla, "The Transport Layer Security | ||||
(TLS) Protocol Version 1.2", RFC 5246, August 2008, | ||||
<https://www.rfc-editor.org/info/rfc5246>. | ||||
[TLS-1.3] Rescorla, E., "The Transport Layer Security (TLS) Protocol | ||||
Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | ||||
<https://www.rfc-editor.org/info/rfc8446>. | ||||
[UTF-7] Goldsmith, D. and M. Davis, "UTF-7 A Mail-Safe | ||||
Transformation Format of Unicode", RFC 2152, May 1997, | ||||
<https://www.rfc-editor.org/info/rfc2152>. | ||||
[UTF-8] Yergeau, F., "UTF-8, a transformation format of ISO | ||||
10646", STD 63, RFC 3629, DOI 10.17487/RFC3629, November | ||||
2003, <https://www.rfc-editor.org/info/rfc3629>. | ||||
[MULTIAPPEND] | [MULTIAPPEND] | |||
Crispin, M., "Internet Message Access Protocol (IMAP) - | Crispin, M., "Internet Message Access Protocol (IMAP) - | |||
MULTIAPPEND Extension", RFC 3502, March 2003, | MULTIAPPEND Extension", RFC 3502, DOI 10.17487/RFC3502, | |||
<https://www.rfc-editor.org/info/rfc3502>. | March 2003, <https://www.rfc-editor.org/info/rfc3502>. | |||
[NET-UNICODE] | [NET-UNICODE] | |||
Klensin, J. and M. Padlipsky, "Unicode Format for Network | Klensin, J. and M. Padlipsky, "Unicode Format for Network | |||
Interchange", RFC 5198, DOI 10.17487/RFC5198, March 2008, | Interchange", RFC 5198, DOI 10.17487/RFC5198, March 2008, | |||
<https://www.rfc-editor.org/info/rfc5198>. | <https://www.rfc-editor.org/info/rfc5198>. | |||
[I18N-HDRS] | [PLAIN] Zeilenga, K., Ed., "The PLAIN Simple Authentication and | |||
Yang, A., Steele, S., and N. Freed, "Internationalized | Security Layer (SASL) Mechanism", RFC 4616, | |||
Email Headers", RFC 6532, DOI 10.17487/RFC6532, February | DOI 10.17487/RFC4616, August 2006, | |||
2012, <https://www.rfc-editor.org/info/rfc6532>. | <https://www.rfc-editor.org/info/rfc4616>. | |||
[RFC2077] Nelson, S., Parks, C., and , "The Model Primary Content | ||||
Type for Multipurpose Internet Mail Extensions", RFC 2077, | ||||
DOI 10.17487/RFC2077, January 1997, | ||||
<https://www.rfc-editor.org/info/rfc2077>. | ||||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | ||||
Requirement Levels", BCP 14, RFC 2119, | ||||
DOI 10.17487/RFC2119, March 1997, | ||||
<https://www.rfc-editor.org/info/rfc2119>. | ||||
[RFC2231] Freed, N. and K. Moore, "MIME Parameter Value and Encoded | ||||
Word Extensions: Character Sets, Languages, and | ||||
Continuations", RFC 2231, DOI 10.17487/RFC2231, November | ||||
1997, <https://www.rfc-editor.org/info/rfc2231>. | ||||
[RFC3503] Melnikov, A., "Message Disposition Notification (MDN) | [RFC3503] Melnikov, A., "Message Disposition Notification (MDN) | |||
profile for Internet Message Access Protocol (IMAP)", | profile for Internet Message Access Protocol (IMAP)", | |||
RFC 3503, DOI 10.17487/RFC3503, March 2003, | RFC 3503, DOI 10.17487/RFC3503, March 2003, | |||
<https://www.rfc-editor.org/info/rfc3503>. | <https://www.rfc-editor.org/info/rfc3503>. | |||
[RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | |||
Encodings", RFC 4648, DOI 10.17487/RFC4648, October 2006, | Encodings", RFC 4648, DOI 10.17487/RFC4648, October 2006, | |||
<https://www.rfc-editor.org/info/rfc4648>. | <https://www.rfc-editor.org/info/rfc4648>. | |||
[RFC4752] Melnikov, A., Ed., "The Kerberos V5 ("GSSAPI") Simple | ||||
Authentication and Security Layer (SASL) Mechanism", | ||||
RFC 4752, DOI 10.17487/RFC4752, November 2006, | ||||
<https://www.rfc-editor.org/info/rfc4752>. | ||||
[RFC5258] Leiba, B. and A. Melnikov, "Internet Message Access | ||||
Protocol version 4 - LIST Command Extensions", RFC 5258, | ||||
DOI 10.17487/RFC5258, June 2008, | ||||
<https://www.rfc-editor.org/info/rfc5258>. | ||||
[RFC5322] Resnick, P., Ed., "Internet Message Format", RFC 5322, | ||||
DOI 10.17487/RFC5322, October 2008, | ||||
<https://www.rfc-editor.org/info/rfc5322>. | ||||
[RFC5788] Melnikov, A. and D. Cridland, "IMAP4 Keyword Registry", | ||||
RFC 5788, DOI 10.17487/RFC5788, March 2010, | ||||
<https://www.rfc-editor.org/info/rfc5788>. | ||||
[RFC7525] Sheffer, Y., Holz, R., and P. Saint-Andre, | [RFC7525] Sheffer, Y., Holz, R., and P. Saint-Andre, | |||
"Recommendations for Secure Use of Transport Layer | "Recommendations for Secure Use of Transport Layer | |||
Security (TLS) and Datagram Transport Layer Security | Security (TLS) and Datagram Transport Layer Security | |||
(DTLS)", BCP 195, RFC 7525, DOI 10.17487/RFC7525, May | (DTLS)", BCP 195, RFC 7525, DOI 10.17487/RFC7525, May | |||
2015, <https://www.rfc-editor.org/info/rfc7525>. | 2015, <https://www.rfc-editor.org/info/rfc7525>. | |||
[RFC7817] Melnikov, A., "Updated Transport Layer Security (TLS) | [RFC7817] Melnikov, A., "Updated Transport Layer Security (TLS) | |||
Server Identity Check Procedure for Email-Related | Server Identity Check Procedure for Email-Related | |||
Protocols", RFC 7817, DOI 10.17487/RFC7817, March 2016, | Protocols", RFC 7817, DOI 10.17487/RFC7817, March 2016, | |||
<https://www.rfc-editor.org/info/rfc7817>. | <https://www.rfc-editor.org/info/rfc7817>. | |||
[RFC8081] Lilley, C., "The "font" Top-Level Media Type", RFC 8081, | ||||
DOI 10.17487/RFC8081, February 2017, | ||||
<https://www.rfc-editor.org/info/rfc8081>. | ||||
[RFC8098] Hansen, T., Ed. and A. Melnikov, Ed., "Message Disposition | [RFC8098] Hansen, T., Ed. and A. Melnikov, Ed., "Message Disposition | |||
Notification", STD 85, RFC 8098, DOI 10.17487/RFC8098, | Notification", STD 85, RFC 8098, DOI 10.17487/RFC8098, | |||
February 2017, <https://www.rfc-editor.org/info/rfc8098>. | February 2017, <https://www.rfc-editor.org/info/rfc8098>. | |||
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | ||||
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | ||||
May 2017, <https://www.rfc-editor.org/info/rfc8174>. | ||||
[RFC8314] Moore, K. and C. Newman, "Cleartext Considered Obsolete: | [RFC8314] Moore, K. and C. Newman, "Cleartext Considered Obsolete: | |||
Use of Transport Layer Security (TLS) for Email Submission | Use of Transport Layer Security (TLS) for Email Submission | |||
and Access", RFC 8314, DOI 10.17487/RFC8314, January 2018, | and Access", RFC 8314, DOI 10.17487/RFC8314, January 2018, | |||
<https://www.rfc-editor.org/info/rfc8314>. | <https://www.rfc-editor.org/info/rfc8314>. | |||
[IMAP-IMPLEMENTATION] | [SASL] Melnikov, A., Ed. and K. Zeilenga, Ed., "Simple | |||
Leiba, B., "IMAP4 Implementation Recommendations", | Authentication and Security Layer (SASL)", RFC 4422, | |||
RFC 2683, September 1999, | DOI 10.17487/RFC4422, June 2006, | |||
<https://www.rfc-editor.org/info/rfc2683>. | <https://www.rfc-editor.org/info/rfc4422>. | |||
[IMAP-MULTIACCESS] | ||||
Gahrns, M., "IMAP4 Multi-Accessed Mailbox Practice", | ||||
RFC 2180, July 1997, | ||||
<https://www.rfc-editor.org/info/rfc2180>. | ||||
13.2. Informative References (related protocols) | ||||
[CERT-555316] | [SCRAM-SHA-256] | |||
CERT, "Vulnerability Note VU#555316: STARTTLS plaintext | Hansen, T., "SCRAM-SHA-256 and SCRAM-SHA-256-PLUS Simple | |||
command injection vulnerability", September 2011, | Authentication and Security Layer (SASL) Mechanisms", | |||
<https://www.kb.cert.org/vuls/id/555316>. | RFC 7677, DOI 10.17487/RFC7677, November 2015, | |||
<https://www.rfc-editor.org/info/rfc7677>. | ||||
[RFC6151] Turner, S. and L. Chen, "Updated Security Considerations | [TLS-1.2] Dierks, T. and E. Rescorla, "The Transport Layer Security | |||
for the MD5 Message-Digest and the HMAC-MD5 Algorithms", | (TLS) Protocol Version 1.2", RFC 5246, | |||
RFC 6151, DOI 10.17487/RFC6151, March 2011, | DOI 10.17487/RFC5246, August 2008, | |||
<https://www.rfc-editor.org/info/rfc6151>. | <https://www.rfc-editor.org/info/rfc5246>. | |||
[RFC2193] Gahrns, M., "IMAP4 Mailbox Referrals", RFC 2193, | [TLS-1.3] Rescorla, E., "The Transport Layer Security (TLS) Protocol | |||
DOI 10.17487/RFC2193, September 1997, | Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | |||
<https://www.rfc-editor.org/info/rfc2193>. | <https://www.rfc-editor.org/info/rfc8446>. | |||
[RFC3348] Gahrns, M. and R. Cheng, "The Internet Message Action | [UTF-7] Goldsmith, D. and M. Davis, "UTF-7 A Mail-Safe | |||
Protocol (IMAP4) Child Mailbox Extension", RFC 3348, | Transformation Format of Unicode", RFC 2152, | |||
DOI 10.17487/RFC3348, July 2002, | DOI 10.17487/RFC2152, May 1997, | |||
<https://www.rfc-editor.org/info/rfc3348>. | <https://www.rfc-editor.org/info/rfc2152>. | |||
[RFC5256] Crispin, M. and K. Murchison, "Internet Message Access | [UTF-8] Yergeau, F., "UTF-8, a transformation format of ISO | |||
Protocol - SORT and THREAD Extensions", RFC 5256, | 10646", STD 63, RFC 3629, DOI 10.17487/RFC3629, November | |||
DOI 10.17487/RFC5256, June 2008, | 2003, <https://www.rfc-editor.org/info/rfc3629>. | |||
<https://www.rfc-editor.org/info/rfc5256>. | ||||
[RFC5465] Gulbrandsen, A., King, C., and A. Melnikov, "The IMAP | 13.2. Informative References | |||
NOTIFY Extension", RFC 5465, DOI 10.17487/RFC5465, | ||||
February 2009, <https://www.rfc-editor.org/info/rfc5465>. | ||||
[RFC6186] Daboo, C., "Use of SRV Records for Locating Email | 13.2.1. Related Protocols | |||
Submission/Access Services", RFC 6186, | ||||
DOI 10.17487/RFC6186, March 2011, | ||||
<https://www.rfc-editor.org/info/rfc6186>. | ||||
[RFC7162] Melnikov, A. and D. Cridland, "IMAP Extensions: Quick Flag | [ANONYMOUS] | |||
Changes Resynchronization (CONDSTORE) and Quick Mailbox | Zeilenga, K., "Anonymous Simple Authentication and | |||
Resynchronization (QRESYNC)", RFC 7162, | Security Layer (SASL) Mechanism", RFC 4505, | |||
DOI 10.17487/RFC7162, May 2014, | DOI 10.17487/RFC4505, June 2006, | |||
<https://www.rfc-editor.org/info/rfc7162>. | <https://www.rfc-editor.org/info/rfc4505>. | |||
[RFC7888] Melnikov, A., Ed., "IMAP4 Non-synchronizing Literals", | [CERT-555316] | |||
RFC 7888, DOI 10.17487/RFC7888, May 2016, | Carnegie Mellon University, "STARTTLS plaintext command | |||
<https://www.rfc-editor.org/info/rfc7888>. | injection vulnerability", Software Engineering Institute, | |||
CERT Coordination Center, Vulnerability Note VU#555316, | ||||
September 2011, <https://www.kb.cert.org/vuls/id/555316>. | ||||
[RFC8474] Gondwana, B., Ed., "IMAP Extension for Object | [CHARSET-REG] | |||
Identifiers", RFC 8474, DOI 10.17487/RFC8474, September | IANA, "Character Set Registrations", | |||
2018, <https://www.rfc-editor.org/info/rfc8474>. | <https://www.iana.org/assignments/charset-reg/>. | |||
[IMAP-DISC] | [IMAP-DISC] | |||
Melnikov, A., Ed., "Synchronization Operations for | Melnikov, A., Ed., "Synchronization Operations for | |||
Disconnected IMAP4 Clients", RFC 4549, June 2006, | Disconnected IMAP4 Clients", RFC 4549, | |||
DOI 10.17487/RFC4549, June 2006, | ||||
<https://www.rfc-editor.org/info/rfc4549>. | <https://www.rfc-editor.org/info/rfc4549>. | |||
[IMAP-I18N] | [IMAP-I18N] | |||
Newman, C., Gulbrandsen, A., and A. Melnikov, "Internet | Newman, C., Gulbrandsen, A., and A. Melnikov, "Internet | |||
Message Access Protocol Internationalization", RFC 5255, | Message Access Protocol Internationalization", RFC 5255, | |||
DOI 10.17487/RFC5255, June 2008, | DOI 10.17487/RFC5255, June 2008, | |||
<https://www.rfc-editor.org/info/rfc5255>. | <https://www.rfc-editor.org/info/rfc5255>. | |||
[IMAP-KEYWORDS-REG] | ||||
IANA, "IMAP and JMAP Keywords", | ||||
<https://www.iana.org/assignments/imap-jmap-keywords/>. | ||||
[IMAP-MAILBOX-NAME-ATTRS-REG] | ||||
IANA, "IMAP Mailbox Name Attributes", | ||||
<https://www.iana.org/assignments/imap-mailbox-name- | ||||
attributes/>. | ||||
[IMAP-MODEL] | [IMAP-MODEL] | |||
Crispin, M., "Distributed Electronic Mail Models in | Crispin, M., "Distributed Electronic Mail Models in | |||
IMAP4", RFC 1733, December 1994, | IMAP4", RFC 1733, DOI 10.17487/RFC1733, December 1994, | |||
<https://www.rfc-editor.org/info/rfc1733>. | <https://www.rfc-editor.org/info/rfc1733>. | |||
[IMAP-URL] Melnikov, A., Ed. and C. Newman, "IMAP URL Scheme", | ||||
RFC 5092, DOI 10.17487/RFC5092, November 2007, | ||||
<https://www.rfc-editor.org/info/rfc5092>. | ||||
[IMAP-UTF-8] | [IMAP-UTF-8] | |||
Resnick, P., Ed., Newman, C., Ed., and S. Shen, Ed., "IMAP | Resnick, P., Ed., Newman, C., Ed., and S. Shen, Ed., "IMAP | |||
Support for UTF-8", RFC 6855, DOI 10.17487/RFC6855, March | Support for UTF-8", RFC 6855, DOI 10.17487/RFC6855, March | |||
2013, <https://www.rfc-editor.org/info/rfc6855>. | 2013, <https://www.rfc-editor.org/info/rfc6855>. | |||
[ANONYMOUS] | [NCSC] NCSC, "Spray you, spray me: defending against password | |||
Zeilenga, K., "Anonymous Simple Authentication and | spraying attacks", May 2018, <https://www.ncsc.gov.uk/ | |||
Security Layer (SASL) Mechanism", RFC 4505, June 2006, | blog-post/spray-you-spray-me-defending-against-password- | |||
<https://www.rfc-editor.org/info/rfc4505>. | spraying-attacks>. | |||
[SMTP] Klensin, J., "Simple Mail Transfer Protocol", RFC 5321, | [RFC2087] Myers, J., "IMAP4 QUOTA extension", RFC 2087, | |||
October 2008, <https://www.rfc-editor.org/info/rfc5321>. | DOI 10.17487/RFC2087, January 1997, | |||
<https://www.rfc-editor.org/info/rfc2087>. | ||||
[RFC2177] Leiba, B., "IMAP4 IDLE command", RFC 2177, | ||||
DOI 10.17487/RFC2177, June 1997, | ||||
<https://www.rfc-editor.org/info/rfc2177>. | ||||
[RFC2193] Gahrns, M., "IMAP4 Mailbox Referrals", RFC 2193, | ||||
DOI 10.17487/RFC2193, September 1997, | ||||
<https://www.rfc-editor.org/info/rfc2193>. | ||||
[RFC2342] Gahrns, M. and C. Newman, "IMAP4 Namespace", RFC 2342, | ||||
DOI 10.17487/RFC2342, May 1998, | ||||
<https://www.rfc-editor.org/info/rfc2342>. | ||||
[RFC3348] Gahrns, M. and R. Cheng, "The Internet Message Action | ||||
Protocol (IMAP4) Child Mailbox Extension", RFC 3348, | ||||
DOI 10.17487/RFC3348, July 2002, | ||||
<https://www.rfc-editor.org/info/rfc3348>. | ||||
[RFC3516] Nerenberg, L., "IMAP4 Binary Content Extension", RFC 3516, | [RFC3516] Nerenberg, L., "IMAP4 Binary Content Extension", RFC 3516, | |||
DOI 10.17487/RFC3516, April 2003, | DOI 10.17487/RFC3516, April 2003, | |||
<https://www.rfc-editor.org/info/rfc3516>. | <https://www.rfc-editor.org/info/rfc3516>. | |||
[RFC3691] Melnikov, A., "Internet Message Access Protocol (IMAP) | ||||
UNSELECT command", RFC 3691, DOI 10.17487/RFC3691, | ||||
February 2004, <https://www.rfc-editor.org/info/rfc3691>. | ||||
[RFC4314] Melnikov, A., "IMAP4 Access Control List (ACL) Extension", | [RFC4314] Melnikov, A., "IMAP4 Access Control List (ACL) Extension", | |||
RFC 4314, December 2005, | RFC 4314, DOI 10.17487/RFC4314, December 2005, | |||
<https://www.rfc-editor.org/info/rfc4314>. | <https://www.rfc-editor.org/info/rfc4314>. | |||
[RFC2087] Myers, J., "IMAP4 QUOTA extension", RFC 2087, January | [RFC4315] Crispin, M., "Internet Message Access Protocol (IMAP) - | |||
1997, <https://www.rfc-editor.org/info/rfc2087>. | UIDPLUS extension", RFC 4315, DOI 10.17487/RFC4315, | |||
December 2005, <https://www.rfc-editor.org/info/rfc4315>. | ||||
[IMAP-URL] | [RFC4466] Melnikov, A. and C. Daboo, "Collected Extensions to IMAP4 | |||
Melnikov, A., Ed. and C. Newman, "IMAP URL Scheme", | ABNF", RFC 4466, DOI 10.17487/RFC4466, April 2006, | |||
RFC 5092, DOI 10.17487/RFC5092, November 2007, | <https://www.rfc-editor.org/info/rfc4466>. | |||
<https://www.rfc-editor.org/info/rfc5092>. | ||||
[RFC8305] Schinazi, D. and T. Pauly, "Happy Eyeballs Version 2: | [RFC4731] Melnikov, A. and D. Cridland, "IMAP4 Extension to SEARCH | |||
Better Connectivity Using Concurrency", RFC 8305, | Command for Controlling What Kind of Information Is | |||
DOI 10.17487/RFC8305, December 2017, | Returned", RFC 4731, DOI 10.17487/RFC4731, November 2006, | |||
<https://www.rfc-editor.org/info/rfc8305>. | <https://www.rfc-editor.org/info/rfc4731>. | |||
[RFC4959] Siemborski, R. and A. Gulbrandsen, "IMAP Extension for | ||||
Simple Authentication and Security Layer (SASL) Initial | ||||
Client Response", RFC 4959, DOI 10.17487/RFC4959, | ||||
September 2007, <https://www.rfc-editor.org/info/rfc4959>. | ||||
[RFC5161] Gulbrandsen, A., Ed. and A. Melnikov, Ed., "The IMAP | ||||
ENABLE Extension", RFC 5161, DOI 10.17487/RFC5161, March | ||||
2008, <https://www.rfc-editor.org/info/rfc5161>. | ||||
[RFC5182] Melnikov, A., "IMAP Extension for Referencing the Last | ||||
SEARCH Result", RFC 5182, DOI 10.17487/RFC5182, March | ||||
2008, <https://www.rfc-editor.org/info/rfc5182>. | ||||
[RFC5256] Crispin, M. and K. Murchison, "Internet Message Access | ||||
Protocol - SORT and THREAD Extensions", RFC 5256, | ||||
DOI 10.17487/RFC5256, June 2008, | ||||
<https://www.rfc-editor.org/info/rfc5256>. | ||||
[RFC5465] Gulbrandsen, A., King, C., and A. Melnikov, "The IMAP | ||||
NOTIFY Extension", RFC 5465, DOI 10.17487/RFC5465, | ||||
February 2009, <https://www.rfc-editor.org/info/rfc5465>. | ||||
[RFC5530] Gulbrandsen, A., "IMAP Response Codes", RFC 5530, | ||||
DOI 10.17487/RFC5530, May 2009, | ||||
<https://www.rfc-editor.org/info/rfc5530>. | ||||
[RFC5819] Melnikov, A. and T. Sirainen, "IMAP4 Extension for | ||||
Returning STATUS Information in Extended LIST", RFC 5819, | ||||
DOI 10.17487/RFC5819, March 2010, | ||||
<https://www.rfc-editor.org/info/rfc5819>. | ||||
[RFC6151] Turner, S. and L. Chen, "Updated Security Considerations | ||||
for the MD5 Message-Digest and the HMAC-MD5 Algorithms", | ||||
RFC 6151, DOI 10.17487/RFC6151, March 2011, | ||||
<https://www.rfc-editor.org/info/rfc6151>. | ||||
[RFC6154] Leiba, B. and J. Nicolson, "IMAP LIST Extension for | ||||
Special-Use Mailboxes", RFC 6154, DOI 10.17487/RFC6154, | ||||
March 2011, <https://www.rfc-editor.org/info/rfc6154>. | ||||
[RFC6186] Daboo, C., "Use of SRV Records for Locating Email | ||||
Submission/Access Services", RFC 6186, | ||||
DOI 10.17487/RFC6186, March 2011, | ||||
<https://www.rfc-editor.org/info/rfc6186>. | ||||
[RFC6376] Crocker, D., Ed., Hansen, T., Ed., and M. Kucherawy, Ed., | [RFC6376] Crocker, D., Ed., Hansen, T., Ed., and M. Kucherawy, Ed., | |||
"DomainKeys Identified Mail (DKIM) Signatures", STD 76, | "DomainKeys Identified Mail (DKIM) Signatures", STD 76, | |||
RFC 6376, DOI 10.17487/RFC6376, September 2011, | RFC 6376, DOI 10.17487/RFC6376, September 2011, | |||
<https://www.rfc-editor.org/info/rfc6376>. | <https://www.rfc-editor.org/info/rfc6376>. | |||
[RFC6409] Gellens, R. and J. Klensin, "Message Submission for Mail", | ||||
STD 72, RFC 6409, DOI 10.17487/RFC6409, November 2011, | ||||
<https://www.rfc-editor.org/info/rfc6409>. | ||||
[RFC6851] Gulbrandsen, A. and N. Freed, Ed., "Internet Message | ||||
Access Protocol (IMAP) - MOVE Extension", RFC 6851, | ||||
DOI 10.17487/RFC6851, January 2013, | ||||
<https://www.rfc-editor.org/info/rfc6851>. | ||||
[RFC7162] Melnikov, A. and D. Cridland, "IMAP Extensions: Quick Flag | ||||
Changes Resynchronization (CONDSTORE) and Quick Mailbox | ||||
Resynchronization (QRESYNC)", RFC 7162, | ||||
DOI 10.17487/RFC7162, May 2014, | ||||
<https://www.rfc-editor.org/info/rfc7162>. | ||||
[RFC7888] Melnikov, A., Ed., "IMAP4 Non-synchronizing Literals", | ||||
RFC 7888, DOI 10.17487/RFC7888, May 2016, | ||||
<https://www.rfc-editor.org/info/rfc7888>. | ||||
[RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | ||||
Writing an IANA Considerations Section in RFCs", BCP 26, | ||||
RFC 8126, DOI 10.17487/RFC8126, June 2017, | ||||
<https://www.rfc-editor.org/info/rfc8126>. | ||||
[RFC8305] Schinazi, D. and T. Pauly, "Happy Eyeballs Version 2: | ||||
Better Connectivity Using Concurrency", RFC 8305, | ||||
DOI 10.17487/RFC8305, December 2017, | ||||
<https://www.rfc-editor.org/info/rfc8305>. | ||||
[RFC8438] Bosch, S., "IMAP Extension for STATUS=SIZE", RFC 8438, | ||||
DOI 10.17487/RFC8438, August 2018, | ||||
<https://www.rfc-editor.org/info/rfc8438>. | ||||
[RFC8474] Gondwana, B., Ed., "IMAP Extension for Object | ||||
Identifiers", RFC 8474, DOI 10.17487/RFC8474, September | ||||
2018, <https://www.rfc-editor.org/info/rfc8474>. | ||||
[RFC8550] Schaad, J., Ramsdell, B., and S. Turner, "Secure/ | [RFC8550] Schaad, J., Ramsdell, B., and S. Turner, "Secure/ | |||
Multipurpose Internet Mail Extensions (S/MIME) Version 4.0 | Multipurpose Internet Mail Extensions (S/MIME) Version 4.0 | |||
Certificate Handling", RFC 8550, DOI 10.17487/RFC8550, | Certificate Handling", RFC 8550, DOI 10.17487/RFC8550, | |||
April 2019, <https://www.rfc-editor.org/info/rfc8550>. | April 2019, <https://www.rfc-editor.org/info/rfc8550>. | |||
[RFC8551] Schaad, J., Ramsdell, B., and S. Turner, "Secure/ | [RFC8551] Schaad, J., Ramsdell, B., and S. Turner, "Secure/ | |||
Multipurpose Internet Mail Extensions (S/MIME) Version 4.0 | Multipurpose Internet Mail Extensions (S/MIME) Version 4.0 | |||
Message Specification", RFC 8551, DOI 10.17487/RFC8551, | Message Specification", RFC 8551, DOI 10.17487/RFC8551, | |||
April 2019, <https://www.rfc-editor.org/info/rfc8551>. | April 2019, <https://www.rfc-editor.org/info/rfc8551>. | |||
[IMAP-KEYWORDS-REG] | [SMTP] Klensin, J., "Simple Mail Transfer Protocol", RFC 5321, | |||
IANA, "IMAP and JMAP Keywords", December 2009, | DOI 10.17487/RFC5321, October 2008, | |||
<https://www.iana.org/assignments/imap-jmap-keywords/imap- | <https://www.rfc-editor.org/info/rfc5321>. | |||
jmap-keywords.xhtml>. | ||||
[IMAP-MAILBOX-NAME-ATTRS-REG] | ||||
IANA, "IMAP Mailbox Name Attributes", June 2018, | ||||
<https://www.iana.org/assignments/imap-mailbox-name- | ||||
attributes/imap-mailbox-name-attributes.xhtml>. | ||||
[CHARSET-REG] | ||||
IANA, "Character Set Registrations", May 2015, | ||||
<https://www.iana.org/assignments/charset-reg/charset- | ||||
reg.xhtml>. | ||||
13.3. Informative References (historical aspects of IMAP and related | ||||
protocols) | ||||
[RFC3501] Crispin, M., "INTERNET MESSAGE ACCESS PROTOCOL - VERSION | 13.2.2. Historical Aspects of IMAP and Related Protocols | |||
4rev1", RFC 3501, DOI 10.17487/RFC3501, March 2003, | ||||
<https://www.rfc-editor.org/info/rfc3501>. | ||||
[IMAP-COMPAT] | [IMAP-COMPAT] | |||
Crispin, M., "IMAP4 Compatibility with IMAP2bis", | Crispin, M., "IMAP4 Compatibility with IMAP2bis", | |||
RFC 2061, December 1996, | RFC 2061, DOI 10.17487/RFC2061, December 1996, | |||
<https://www.rfc-editor.org/info/rfc2061>. | <https://www.rfc-editor.org/info/rfc2061>. | |||
[IMAP-HISTORICAL] | [IMAP-HISTORICAL] | |||
Crispin, M., "IMAP4 Compatibility with IMAP2 and | Crispin, M., "IMAP4 Compatibility with IMAP2 and | |||
IMAP2bis", RFC 1732, December 1994, | IMAP2bis", RFC 1732, DOI 10.17487/RFC1732, December 1994, | |||
<https://www.rfc-editor.org/info/rfc1732>. | <https://www.rfc-editor.org/info/rfc1732>. | |||
[IMAP2BIS] | ||||
Crispin, M., "INTERACTIVE MAIL ACCESS PROTOCOL - VERSION | ||||
2bis", draft-ietf-imap-imap2bis-02 (work in progress), | ||||
October 1993, <https://www.ietf.org/archive/id/draft-ietf- | ||||
imap-imap2bis-02.txt>. | ||||
[IMAP-OBSOLETE] | [IMAP-OBSOLETE] | |||
Crispin, M., "Internet Message Access Protocol - Obsolete | Crispin, M., "Internet Message Access Protocol - Obsolete | |||
Syntax", RFC 2062, December 1996, | Syntax", RFC 2062, DOI 10.17487/RFC2062, December 1996, | |||
<https://www.rfc-editor.org/info/rfc2062>. | <https://www.rfc-editor.org/info/rfc2062>. | |||
[IMAP-TLS] Newman, C., "Using TLS with IMAP, POP3 and ACAP", | ||||
RFC 2595, DOI 10.17487/RFC2595, June 1999, | ||||
<https://www.rfc-editor.org/info/rfc2595>. | ||||
[IMAP2] Crispin, M., "Interactive Mail Access Protocol: Version | [IMAP2] Crispin, M., "Interactive Mail Access Protocol: Version | |||
2", RFC 1176, August 1990, | 2", RFC 1176, DOI 10.17487/RFC1176, August 1990, | |||
<https://www.rfc-editor.org/info/rfc1176>. | <https://www.rfc-editor.org/info/rfc1176>. | |||
[RFC-822] Crocker, D., "STANDARD FOR THE FORMAT OF ARPA INTERNET | [IMAP2BIS] Crispin, M., "INTERACTIVE MAIL ACCESS PROTOCOL - VERSION | |||
TEXT MESSAGES", STD 11, RFC 822, August 1982, | 2bis", Work in Progress, Internet-Draft, draft-ietf-imap- | |||
<https://www.rfc-editor.org/info/rfc822>. | imap2bis-02, 29 October 1993, | |||
<https://datatracker.ietf.org/doc/html/draft-ietf-imap- | ||||
imap2bis-02>. | ||||
[IMAP-TLS] | [RFC1064] Crispin, M., "Interactive Mail Access Protocol: Version | |||
Newman, C., "Using TLS with IMAP, POP3 and ACAP", | 2", RFC 1064, DOI 10.17487/RFC1064, July 1988, | |||
RFC 2595, June 1999, | <https://www.rfc-editor.org/info/rfc1064>. | |||
<https://www.rfc-editor.org/info/rfc2595>. | ||||
Appendix A. Backward compatibility with IMAP4rev1 | [RFC1730] Crispin, M., "Internet Message Access Protocol - Version | |||
4", RFC 1730, DOI 10.17487/RFC1730, December 1994, | ||||
<https://www.rfc-editor.org/info/rfc1730>. | ||||
[RFC2060] Crispin, M., "Internet Message Access Protocol - Version | ||||
4rev1", RFC 2060, DOI 10.17487/RFC2060, December 1996, | ||||
<https://www.rfc-editor.org/info/rfc2060>. | ||||
[RFC3501] Crispin, M., "INTERNET MESSAGE ACCESS PROTOCOL - VERSION | ||||
4rev1", RFC 3501, DOI 10.17487/RFC3501, March 2003, | ||||
<https://www.rfc-editor.org/info/rfc3501>. | ||||
[RFC822] Crocker, D., "STANDARD FOR THE FORMAT OF ARPA INTERNET | ||||
TEXT MESSAGES", STD 11, RFC 822, DOI 10.17487/RFC0822, | ||||
August 1982, <https://www.rfc-editor.org/info/rfc822>. | ||||
Appendix A. Backward Compatibility with IMAP4rev1 | ||||
An implementation that wants to remain compatible with IMAP4rev1 can | An implementation that wants to remain compatible with IMAP4rev1 can | |||
advertise both IMAP4rev1 and IMAP4rev2 in its CAPABILITY response/ | advertise both IMAP4rev1 and IMAP4rev2 in its CAPABILITY response / | |||
response code. (Such server implementation is likely to also want to | response code. (Such server implementation is likely to also want to | |||
advertise other IMAP4rev1 extensions that were folded into IMAP4rev2. | advertise other IMAP4rev1 extensions that were folded into IMAP4rev2; | |||
See Appendix E.) While some IMAP4rev1 responses were removed in | see Appendix E.) While some IMAP4rev1 responses were removed in | |||
IMAP4rev2, their presence will not break IMAP4rev2-only clients. | IMAP4rev2, their presence will not break IMAP4rev2-only clients. | |||
If both IMAP4rev1 and IMAP4rev2 are advertised, an IMAP client that | If both IMAP4rev1 and IMAP4rev2 are advertised, an IMAP client that | |||
wants to use IMAP4rev2 MUST issue an "ENABLE IMAP4rev2" command. | wants to use IMAP4rev2 MUST issue an "ENABLE IMAP4rev2" command. | |||
When compared to IMAP4rev1, some request data items, corresponding | ||||
response data items, and responses were removed in IMAP4rev2. See | ||||
Appendix E for more details. 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. | ||||
Servers advertising both IMAP4rev1 and IMAP4rev2 MUST NOT generate | Servers advertising both IMAP4rev1 and IMAP4rev2 MUST NOT generate | |||
UTF-8 quoted strings unless the client has issued "ENABLE IMAP4rev2". | UTF-8-quoted strings unless the client has issued "ENABLE IMAP4rev2". | |||
Consider implementation of mechanisms described or referenced in | Consider implementation of mechanisms described or referenced in | |||
[IMAP-UTF-8] to achieve this goal. | [IMAP-UTF-8] to achieve this goal. | |||
Servers advertising both IMAP4rev1 and IMAP4rev2, and clients | Servers advertising both IMAP4rev1 and IMAP4rev2, and clients | |||
intending to be compatible with IMAP4rev1 servers MUST be compatible | intending to be compatible with IMAP4rev1 servers, MUST be compatible | |||
with the international mailbox naming convention described in | with the Mailbox International Naming Convention described in | |||
Appendix A.1. | Appendix A.1. | |||
Also see Appendix D for special considerations for servers that | Also see Appendix D for special considerations for servers that | |||
support 63 bit body part/message sizes and want to advertise support | support 63-bit body part / message sizes and want to advertise | |||
for both IMAP4rev1 and IMAP4rev2. | support for both IMAP4rev1 and IMAP4rev2. | |||
A.1. Mailbox International Naming Convention for compatibility with | A.1. Mailbox International Naming Convention for Compatibility with | |||
IMAP4rev1 | IMAP4rev1 | |||
Support for the Mailbox International Naming Convention described in | Support for the Mailbox International Naming Convention described in | |||
this section is not required for IMAP4rev2-only clients and servers. | this section is not required for IMAP4rev2-only clients and servers. | |||
It is only used for backward compatibility with IMAP4rev1 | It is only used for backward compatibility with IMAP4rev1 | |||
implementations. | implementations. | |||
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 [UTF-7]. | using a modified version of the UTF-7 encoding described in [UTF-7]. | |||
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. | |||
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 two- | and 0x27-0x7e. The character "&" (0x26) is represented by the | |||
octet sequence "&-". | 2-octet sequence "&-". | |||
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 | |||
[UTF-7] that "," is used instead of "/". Modified BASE64 MUST NOT be | [UTF-7] that "," is used instead of "/". Modified base64 MUST NOT be | |||
used to represent any printing US-ASCII character which can represent | used to represent any printing of a US-ASCII character that can | |||
itself. Only characters inside the modified BASE64 alphabet are | represent itself. Only characters inside the modified base64 | |||
permitted in modified BASE64 text. | alphabet are permitted in modified base64 text. | |||
"&" is used to shift to modified BASE64 and "-" to shift back to US- | "&" 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 null | ASCII. There is no implicit shift from base64 to US-ASCII, and null | |||
shifts ("-&" while in BASE64; note that "&-" while in US-ASCII means | shifts ("-&" while in base64; note that "&-" while in US-ASCII means | |||
"&") are not permitted. However, all names start in US-ASCII, and | "&") are not permitted. However, all names start in US-ASCII and | |||
MUST end in US-ASCII; that is, a name that ends with a non-ASCII | MUST end in US-ASCII; that is, a name that ends with a non-ASCII | |||
ISO-10646 character MUST end with a "-"). | ISO-10646 character MUST end with a "-". | |||
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: | |||
1. UTF-7 uses the "+" character for shifting; this conflicts with | 1. 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. | |||
2. UTF-7's encoding is BASE64 which uses the "/" character; this | 2. 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. | |||
3. UTF-7 prohibits the unencoded usage of "\"; this conflicts with | 3. 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. | |||
4. UTF-7 prohibits the unencoded usage of "~"; this conflicts with | 4. 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. | |||
5. UTF-7 permits multiple alternate forms to represent the same | 5. 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. | |||
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 embedded | requirements on the server handling of any mailbox name with an | |||
"&" character. In particular, server implementations MUST preserve | embedded "&" character. In particular, server implementations MUST | |||
the exact form of the modified BASE64 portion of a modified UTF-7 | preserve the exact form of the modified base64 portion of a modified | |||
name and treat that text as case-sensitive, even if names are | UTF-7 name and treat that text as case sensitive, even if names are | |||
otherwise case-insensitive or case-folded. | otherwise case insensitive or case folded. | |||
Server implementations SHOULD verify that any mailbox name with an | Server implementations SHOULD 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 has | correctly modified UTF-7 syntax; has no superfluous shifts; and has | |||
no encoding in modified BASE64 of any printing US-ASCII character | no encoding in modified base64 of any printing US-ASCII character | |||
which can represent itself. However, client implementations MUST NOT | that can represent itself. However, client implementations MUST NOT | |||
depend upon the server doing this, and SHOULD NOT attempt to create a | depend upon the server doing this and SHOULD NOT attempt to create a | |||
mailbox name with an embedded "&" character unless it complies with | mailbox name with an embedded "&" character unless it complies with | |||
the modified UTF-7 syntax. | the modified UTF-7 syntax. | |||
Server implementations which export a mail store that does not follow | Server implementations that export a mail store that does not follow | |||
the modified UTF-7 convention MUST convert to modified UTF-7 any | the modified UTF-7 convention MUST convert any mailbox name that | |||
mailbox name that contains either non-ASCII characters or the "&" | contains either non-ASCII characters or the "&" character to modified | |||
character. | UTF-7. | |||
For example, here is a mailbox name which mixes English, Chinese, | For example, here is a mailbox name that mixes English, Chinese, | |||
and Japanese text: ~peter/mail/&U,BTFw-/&ZeVnLIqe- | and Japanese text: ~peter/mail/&U,BTFw-/&ZeVnLIqe- | |||
For example, the string "&Jjo!" is not a valid mailbox name | For example, the string "&Jjo!" is not a valid mailbox name | |||
because it does not contain a shift to US-ASCII before the "!". | because it does not contain a shift to US-ASCII before the "!". | |||
The correct form is "&Jjo-!". The string "&U,BTFw-&ZeVnLIqe-" is | The correct form is "&Jjo-!". The string "&U,BTFw-&ZeVnLIqe-" is | |||
not permitted because it contains a superfluous shift. The | not permitted because it contains a superfluous shift. The | |||
correct form is "&U,BTF2XlZyyKng-". | correct form is "&U,BTF2XlZyyKng-". | |||
Appendix B. Backward compatibility with BINARY extension | Appendix B. Backward Compatibility with BINARY Extension | |||
IMAP4rev2 incorporates subset of functionality provided by the BINARY | IMAP4rev2 incorporates a subset of functionality provided by the | |||
extension [RFC3516], in particular it includes additional FETCH items | BINARY extension [RFC3516]; in particular, it includes additional | |||
(BINARY, BINARY.PEEK and BINARY.SIZE), but not extensions to the | FETCH items (BINARY, BINARY.PEEK, and BINARY.SIZE) but not extensions | |||
APPEND command. IMAP4rev2 implementations that supports full RFC | to the APPEND command. IMAP4rev2 implementations that support full | |||
3516 functionality need to also advertise the BINARY capability in | [RFC3516] functionality need to also advertise the BINARY capability | |||
the CAPABILITY response/response code. | in the CAPABILITY response / response code. | |||
Appendix C. Backward compatibility with LIST-EXTENDED extension | Appendix C. Backward Compatibility with LIST-EXTENDED Extension | |||
IMAP4rev2 incorporates most of functionality provided by the LIST- | IMAP4rev2 incorporates most of the functionality provided by the | |||
EXTENDED extension [RFC5258]. In particular, multiple mailbox | LIST-EXTENDED extension [RFC5258]. In particular, the syntax for | |||
patterns syntax is not supported in IMAP4rev2, unless LIST-EXTENDED | multiple mailbox patterns is not supported in IMAP4rev2, unless LIST- | |||
capability is also advertised in the CAPABILITY response/response | EXTENDED capability is also advertised in the CAPABILITY response / | |||
code. | response code. | |||
Appendix D. 63 bit body part and message sizes | Appendix D. 63-Bit Body Part and Message Sizes | |||
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. Server implementations don't have to | can support from 32 to 63 bits. Server implementations don't have to | |||
support 63 bit long body parts/message sizes, however client | support 63-bit-long body parts/message sizes; however, client | |||
implementations have to expect them. | implementations have to expect them. | |||
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 servers | there is an interoperability issue exposed by 63-bit-capable servers/ | |||
that are accessible by both IMAP4rev1 and IMAP4rev2 email clients. | mailboxes that are accessible by both IMAP4rev1 and IMAP4rev2 email | |||
As IMAP4rev1 would be unable to retrieve full content of messages | clients. As IMAP4rev1 would be unable to retrieve the full content | |||
bigger than 4Gb, such servers either need to replace messages bigger | of messages bigger than 4 Gb, such servers either need to replace | |||
that 4Gb with messages under 4Gb or hide them from IMAP4rev1 clients. | messages bigger that 4 Gb with messages under 4 Gb or hide them from | |||
This document doesn't prescribe any implementation strategy to | IMAP4rev1 clients. This document doesn't prescribe any | |||
address this issue. | implementation strategy to address this issue. | |||
Appendix E. Changes from RFC 3501 / IMAP4rev1 | Appendix E. Changes from RFC 3501 / IMAP4rev1 | |||
Below is the summary of changes since RFC 3501: | Below is the summary of changes since RFC 3501: | |||
1. Support for 64bit message and body part sizes. | 1. Support for 64-bit message and body part sizes. | |||
2. Folded in IMAP NAMESPACE (RFC 2342), UNSELECT (RFC 3691), | 2. Folded in IMAP NAMESPACE [RFC2342], UNSELECT [RFC3691], UIDPLUS | |||
UIDPLUS (RFC 4315), ESEARCH (RFC 4731), SEARCHRES (RFC 5182), | [RFC4315], ESEARCH [RFC4731], SEARCHRES [RFC5182], ENABLE | |||
ENABLE (RFC 5161), IDLE (RFC 2177), SASL-IR (RFC 4959), LIST- | [RFC5161], IDLE [RFC2177], SASL-IR [RFC4959], LIST-EXTENDED | |||
EXTENDED (RFC 5258), LIST-STATUS (RFC 5819), MOVE (RFC 6851) and | [RFC5258], LIST-STATUS [RFC5819], MOVE [RFC6851], and LITERAL- | |||
LITERAL- (RFC 7888) extensions. Also folded RFC 4466 (IMAP ABNF | extensions [RFC7888]. Also folded in IMAP ABNF extensions | |||
extensions), RFC 5530 (response codes), the FETCH side of the | [RFC4466], response codes [RFC5530], the FETCH side of the | |||
BINARY extension (RFC 3516) and the list of new mailbox | BINARY extension [RFC3516], and the list of new mailbox | |||
attributes from SPECIAL-USE (RFC 6154). | attributes from SPECIAL-USE [RFC6154]. | |||
3. Added STATUS SIZE (RFC 8438) and STATUS DELETED. | 3. Added STATUS SIZE [RFC8438] and STATUS DELETED. | |||
4. SEARCH command now requires to return ESEARCH response (SEARCH | 4. SEARCH command now requires to return the ESEARCH response | |||
response is now deprecated). | (SEARCH response is now deprecated). | |||
5. Clarified which SEARCH keys have to use substring match and | 5. Clarified which SEARCH keys have to use substring match and | |||
which don't. | which don't. | |||
6. Clarified that server should decode parameter value | 6. Clarified that the server should decode parameter value | |||
continuations as described in [RFC2231]. This requirement was | continuations as described in [RFC2231]. This requirement was | |||
hidden in RFC 2231 itself. | hidden in [RFC2231] itself. | |||
7. Clarified that COPYUID response code is returned for both MOVE | 7. Clarified that the COPYUID response code is returned for both | |||
and UID MOVE. | MOVE and UID MOVE. | |||
8. Tighen requirements about COPY/MOVE commands not creating target | 8. Tightened requirements about COPY/MOVE commands not creating a | |||
mailbox. Also require them to return TRYCREATE response code, | target mailbox. Also required them to return the TRYCREATE | |||
if the target mailbox doesn't exist and can be created. | response code, if the target mailbox doesn't exist and can be | |||
created. | ||||
9. Added CLOSED response code from RFC 7162. SELECT/EXAMINE when a | 9. Added the CLOSED response code from [RFC7162]. SELECT/EXAMINE | |||
mailbox is already selected now requires a CLOSED response code | when a mailbox is already selected now requires a CLOSED | |||
to be returned. | response code to be returned. | |||
10. SELECT/EXAMINE are now required to return untagged LIST | 10. SELECT/EXAMINE are now required to return an untagged LIST | |||
response. | response. | |||
11. UNSEEN response code on SELECT/EXAMINE is now deprecated. | 11. UNSEEN response code on SELECT/EXAMINE is now deprecated. | |||
12. RECENT response on SELECT/EXAMINE, \Recent flag, RECENT STATUS, | 12. RECENT response on SELECT/EXAMINE, \Recent flag, RECENT STATUS, | |||
SEARCH NEW items are now deprecated. | and SEARCH NEW items are now deprecated. | |||
13. Clarified that the server doesn't need to send a new | 13. Clarified that the server doesn't need to send a new | |||
PERMANENTFLAGS response code when a new keyword was successfully | PERMANENTFLAGS response code when a new keyword was successfully | |||
added and the server advertised \* earlier for the same mailbox. | added and the server advertised \* earlier for the same mailbox. | |||
14. For future extensibility extended ABNF for tagged-ext-simple to | 14. For future extensibility, extended ABNF for tagged-ext-simple to | |||
allow for bare number64. | allow for bare number64. | |||
15. Added SHOULD level requirement on IMAP servers to support | 15. Added SHOULD level requirement on IMAP servers to support | |||
$MDNSent, $Forwarded, $Junk, $NonJunk and $Phishing keywords. | $MDNSent, $Forwarded, $Junk, $NonJunk, and $Phishing keywords. | |||
16. Mailbox names and message headers now allow for UTF-8. Support | 16. Mailbox names and message headers now allow for UTF-8. Support | |||
for Modified UTF-7 in mailbox names is not required, unless | for modified UTF-7 in mailbox names is not required, unless | |||
compatibility with IMAP4rev1 is desired. | compatibility with IMAP4rev1 is desired. | |||
17. Removed the CHECK command. Clients should use NOOP instead. | 17. Removed the CHECK command. Clients should use NOOP instead. | |||
18. RFC822, RFC822.HEADER and RFC822.TEXT FETCH data items were | 18. RFC822, RFC822.HEADER, and RFC822.TEXT FETCH data items were | |||
deprecated. Clients should use the corresponding BODY[] | deprecated. Clients should use the corresponding BODY[] | |||
variants instead. | variants instead. | |||
19. LSUB command was deprecated. Clients should use LIST | 19. LSUB command was deprecated. Clients should use LIST | |||
(SUBSCRIBED) instead. | (SUBSCRIBED) instead. | |||
20. IDLE command can now return updates not related to the currently | 20. IDLE command can now return updates not related to the currently | |||
selected mailbox state. | selected mailbox state. | |||
21. All unsolicited FETCH updates are required to include UID. | 21. All unsolicited FETCH updates are required to include UID. | |||
22. Clarified that client implementations MUST ignore response codes | 22. Clarified that client implementations MUST ignore response codes | |||
that they do not recognize. (Change from a SHOULD to a MUST.) | that they do not recognize. (Changed from a SHOULD to a MUST.) | |||
23. resp-text ABNF non terminal was updated to allow for empty text. | 23. resp-text ABNF non-terminal was updated to allow for empty text. | |||
24. After ENABLE IMAP4rev2 human readable response text can include | 24. After ENABLE, IMAP4rev2 human-readable response text can include | |||
non ASCII encoded in UTF-8. | non-ASCII encoded in UTF-8. | |||
25. Updated to use modern TLS-related recommendations as per RFC | 25. Updated to use modern TLS-related recommendations as per | |||
8314, RFC 7817, RFC 7525. | [RFC7525], [RFC7817], and [RFC8314]. | |||
26. Added warnings about use of ALERT response codes and PREAUTH | 26. Added warnings about use of ALERT response codes and PREAUTH | |||
response. | response. | |||
27. Replaced DIGEST-MD5 SASL mechanism with SCRAM-SHA-256. DIGEST- | 27. Replaced DIGEST-MD5 SASL mechanism with SCRAM-SHA-256. DIGEST- | |||
MD5 was deprecated. | MD5 was deprecated. | |||
28. Clarified that any command received from the client resets | 28. Clarified that any command received from the client resets | |||
server autologout timer. | server autologout timer. | |||
29. Revised IANA registration procedure for IMAP extensions and | 29. Revised IANA registration procedure for IMAP extensions and | |||
removed "X" convention in accordance with BCP 178. | removed "X" convention in accordance with [BCP178]. | |||
30. Loosened requirements on servers when closing connections to be | 30. Loosened requirements on servers when closing connections to be | |||
more aligned with existing practices. | more aligned with existing practices. | |||
Appendix F. Other Recommended IMAP Extensions | Appendix F. Other Recommended IMAP Extensions | |||
Support for the following extensions is recommended for all IMAP | Support for the following extensions is recommended for all IMAP | |||
client and servers. While they significantly reduce bandwidth and/or | clients and servers. While they significantly reduce bandwidth and/ | |||
number of round trips used by IMAP in certain situations, the EXTRA | or number of round trips used by IMAP in certain situations, the | |||
WG decided that requiring them as a part of IMAP4rev2 would push the | EXTRA WG decided that requiring them as a part of IMAP4rev2 would | |||
bar to implement too high for new implementations. Also note that | push the bar to implement too high for new implementations. Also | |||
absence of any IMAP extension from this list doesn't make it somehow | note that the absence of any IMAP extension from this list doesn't | |||
deficient or not recommended for use with IMAP4rev2. | make it somehow deficient or not recommended for use with IMAP4rev2. | |||
1. QRESYNC and CONDSTORE extensions [RFC7162]. They make | 1. Quick Mailbox Resynchronization (QRESYNC) and CONDSTORE | |||
discovering changes to IMAP mailboxes more efficient, at the | extensions [RFC7162]. They make discovering changes to IMAP | |||
expense of storing a bit more state. | mailboxes more efficient, at the expense of storing a bit more | |||
state. | ||||
2. OBJECTID extension [RFC8474] helps with preserving IMAP client | 2. OBJECTID extension [RFC8474] helps with preserving the IMAP | |||
cache when messages moved/copied or mailboxes are renamed. | client cache when messages are moved/copied or mailboxes are | |||
renamed. | ||||
Appendix G. Acknowledgement | Acknowledgements | |||
Earlier versions of this document were edited by Mark Crispin. | Earlier draft versions of this document were edited by Mark Crispin. | |||
Sadly, he is no longer available to help with this work. Editors of | Sadly, he is no longer available to help with this work. Editors of | |||
this revisions are hoping that Mark would have approved. | this revision are hoping that Mark would have approved. | |||
Chris Newman has contributed text on I18N and use of UTF-8 in | Chris Newman has contributed text on I18N and use of UTF-8 in | |||
messages and mailbox names. | messages and mailbox names. | |||
Thank you to Tony Hansen for helping with the index generation. | Thank you to Tony Hansen for helping with the index generation. | |||
Thank you to Murray Kucherawy, Timo Sirainen, Bron Gondwana, Stephan | Thank you to Murray Kucherawy, Timo Sirainen, Bron Gondwana, Stephan | |||
Bosch, Robert Sparks, Arnt Gulbrandsen, Benjamin Kaduk, Daniel | Bosch, Robert Sparks, Arnt Gulbrandsen, Benjamin Kaduk, Daniel | |||
Migault, Roman Danyliw and Eric Vyncke for extensive feedback. | Migaul, Roman Danyliw, and Éric Vyncke for extensive feedback. | |||
This document incorporates text from RFC 4315 (by Mark Crispin), RFC | This document incorporates text from [RFC2342] (by Mike Gahrns and | |||
4466 (by Cyrus Daboo), RFC 4731 (by Dave Cridland), RFC 5161 (by Arnt | Chris Newman), [RFC3516] (by Lyndon Nerenberg), [RFC4315] (by Mark | |||
Gulbrandsen), RFC 5465 (by Arnt Gulbrandsen and Curtis King), RFC | Crispin), [RFC4466] (by Cyrus Daboo), [RFC4731] (by Dave Cridland), | |||
5530 (by Arnt Gulbrandsen), RFC 5819 (by Timo Sirainen), RFC 6154 (by | [RFC4959] (by Rob Siemborski and Arnt Gulbrandsen), [RFC5161] (by | |||
Jamie Nicolson), RFC 8438 (by Stephan Bosch) so work done by authors/ | Arnt Gulbrandsen), [RFC5465] (by Arnt Gulbrandsen and Curtis King), | |||
[RFC5530] (by Arnt Gulbrandsen), [RFC5819] (by Timo Sirainen), | ||||
[RFC6154] (by Jamie Nicolson), [RFC6851] (by Arnt Gulbrandsen and Ned | ||||
Freed), and [RFC8438] (by Stephan Bosch), so work done by authors/ | ||||
editors of these documents is appreciated. Note that editors of this | editors of these documents is appreciated. Note that editors of this | |||
document were redacted from the above list. | document were redacted from the above list. | |||
The CHILDREN return option was originally proposed by Mike Gahrns and | The CHILDREN return option was originally proposed by Mike Gahrns and | |||
Raymond Cheng in [RFC3348]. Most of the information in | Raymond Cheng in [RFC3348]. Most of the information in | |||
Section 6.3.9.5 is taken directly from their original specification | Section 6.3.9.5 is taken directly from their original specification | |||
[RFC3348]. | [RFC3348]. | |||
Thank you to Damian Poddebniak, Fabian Ising, Hanno Boeck and | Thank you to Damian Poddebniak, Fabian Ising, Hanno Boeck, and | |||
Sebastian Schinzel for pointing out that the ENABLE command should be | Sebastian Schinzel for pointing out that the ENABLE command should be | |||
a member of "command-auth" and not "command-any" ABNF production, as | a member of "command-auth" and not "command-any" ABNF production, as | |||
well as pointing out security issues associated with ALERT, PREAUTH | well as pointing out security issues associated with ALERT, PREAUTH, | |||
and other responses received before authentication. | and other responses received before authentication. | |||
Index | Index | |||
$ | $ + - \ A B C D E F H I K L M N O P R S T U | |||
$Forwarded (predefined flag) 13 | ||||
$Junk (predefined flag) 13 | ||||
$MDNSent (predefined flag) 13 | ||||
$NotJunk (predefined flag) 13 | ||||
$Phishing (predefined flag) 13 | ||||
+ | $ | |||
+FLAGS <flag list> 97 | ||||
+FLAGS.SILENT <flag list> 97 | ||||
- | $Forwarded (predefined flag) | |||
-FLAGS <flag list> 97 | Section 2.3.2 | |||
-FLAGS.SILENT <flag list> 97 | $Junk (predefined flag) | |||
Section 2.3.2 | ||||
$MDNSent (predefined flag) | ||||
Section 2.3.2 | ||||
$NotJunk (predefined flag) | ||||
Section 2.3.2 | ||||
$Phishing (predefined flag) | ||||
Section 2.3.2, Paragraph 6.10.1 | ||||
A | + | |||
ALERT (response code) 105 | ||||
ALL (fetch item) 93 | ||||
ALL (search key) 82 | ||||
ALL (search result option) 80 | ||||
ALL (search return item name) 122 | ||||
ALREADYEXISTS (response code) 105 | ||||
ANSWERED (search key) 82 | ||||
APPEND (command) 73 | ||||
APPENDUID (response code) 105 | ||||
AUTHENTICATE (command) 31 | ||||
AUTHENTICATIONFAILED (response code) 106 | ||||
AUTHORIZATIONFAILED (response code) 106 | ||||
B | +FLAGS <flag list> | |||
BAD (response) 113 | Section 6.4.6 | |||
BADCHARSET (response code) 106 | +FLAGS.SILENT <flag list> | |||
BCC <string> (search key) 82 | Section 6.4.6 | |||
BEFORE <date> (search key) 82 | ||||
BINARY.PEEK[<section-binary>]<<partial>> (fetch item) 93 | ||||
BINARY.SIZE[<section-binary>] (fetch item) 94 | ||||
BINARY.SIZE[<section-binary>] (fetch result) 125 | ||||
BINARY[<section-binary>]<<number>> (fetch result) 124 | ||||
BINARY[<section-binary>]<<partial>> (fetch item) 93 | ||||
BODY (fetch item) 94 | ||||
BODY (fetch result) 125 | ||||
BODY <string> (search key) 82 | ||||
BODY.PEEK[<section>]<<partial>> (fetch item) 94 | ||||
BODYSTRUCTURE (fetch item) 95 | ||||
BODYSTRUCTURE (fetch result) 126 | ||||
BODY[<section>]<<origin octet>> (fetch result) 125 | ||||
BODY[<section>]<<partial>> (fetch item) 94 | ||||
BYE (response) 114 | ||||
Body Structure (message attribute) 14 | ||||
C | - | |||
CANNOT (response code) 106 | ||||
CAPABILITY (command) 27 | ||||
CAPABILITY (response code) 107 | ||||
CAPABILITY (response) 115 | ||||
CC <string> (search key) 82 | ||||
CLIENTBUG (response code) 107 | ||||
CLOSE (command) 78 | ||||
CLOSED (response code) 107 | ||||
CONTACTADMIN (response code) 107 | ||||
COPY (command) 98 | ||||
COPYUID (response code) 108 | ||||
CORRUPTION (response code) 108 | ||||
COUNT (search result option) 81 | ||||
COUNT (search return item name) 122 | ||||
CREATE (command) 41 | ||||
D | -FLAGS <flag list> | |||
DELETE (command) 42 | Section 6.4.6 | |||
DELETED (search key) 83 | -FLAGS.SILENT <flag list> | |||
DELETED (status item) 73 | Section 6.4.6 | |||
DRAFT (search key) 83 | ||||
E | \ | |||
ENABLE (command) 36 | ||||
ENVELOPE (fetch item) 95 | ||||
ENVELOPE (fetch result) 129 | ||||
ESEARCH (response) 121 | ||||
EXAMINE (command) 40 | ||||
EXPIRED (response code) 108 | ||||
EXPUNGE (command) 79 | ||||
EXPUNGE (response) 123 | ||||
EXPUNGEISSUED (response code) 108 | ||||
Envelope Structure (message attribute) 14 | ||||
F | \All (mailbox name attribute) | |||
FAST (fetch item) 93 | Section 7.3.1 | |||
FETCH (command) 92 | \Answered (system flag) | |||
FETCH (response) 124 | Section 2.3.2 | |||
FLAGGED (search key) 83 | \Archive (mailbox name attribute) | |||
FLAGS (fetch item) 95 | Section 7.3.1 | |||
FLAGS (fetch result) 130 | \Deleted (system flag) | |||
FLAGS (response) 123 | Section 2.3.2 | |||
FLAGS <flag list> (store command data item) 97 | \Draft (system flag) | |||
FLAGS.SILENT <flag list> (store command data item) 97 | Section 2.3.2 | |||
FROM <string> (search key) 83 | \Drafts (mailbox name attribute) | |||
FULL (fetch item) 93 | Section 7.3.1 | |||
Flags (message attribute) 12 | \Flagged (mailbox name attribute) | |||
Section 7.3.1 | ||||
\Flagged (system flag) | ||||
Section 2.3.2 | ||||
\HasChildren (mailbox name attribute) | ||||
Section 7.3.1 | ||||
\HasNoChildren (mailbox name attribute) | ||||
Section 7.3.1 | ||||
\Junk (mailbox name attribute) | ||||
Section 7.3.1 | ||||
\Marked (mailbox name attribute) | ||||
Section 7.3.1 | ||||
\Noinferiors (mailbox name attribute) | ||||
Section 7.3.1 | ||||
\NonExistent (mailbox name attribute) | ||||
Section 7.3.1, Paragraph 4.2.1 | ||||
\Noselect (mailbox name attribute) | ||||
Section 7.3.1 | ||||
\Recent (system flag) | ||||
Section 2.3.2 | ||||
\Remote (mailbox name attribute) | ||||
Section 7.3.1 | ||||
\Seen (system flag) | ||||
Section 2.3.2 | ||||
\Sent (mailbox name attribute) | ||||
Section 7.3.1 | ||||
\Subscribed (mailbox name attribute) | ||||
Section 7.3.1 | ||||
\Trash (mailbox name attribute) | ||||
Section 7.3.1 | ||||
\Unmarked (mailbox name attribute) | ||||
Section 7.3.1 | ||||
H | A | |||
HASCHILDREN (response code) 109 | ||||
HEADER (part specifier) 95 | ||||
HEADER <field-name> <string> (search key) 83 | ||||
HEADER.FIELDS (part specifier) 95 | ||||
HEADER.FIELDS.NOT (part specifier) 95 | ||||
I | ALERT (response code) | |||
IDLE (command) 76 | Section 7.1 | |||
INTERNALDATE (fetch item) 95 | ALL (fetch item) | |||
INTERNALDATE (fetch result) 130 | Section 6.4.5 | |||
INUSE (response code) 109 | ALL (search key) | |||
Internal Date (message attribute) 14 | Section 6.4.4 | |||
ALL (search result option) | ||||
Section 6.4.4, Paragraph 6.6.1 | ||||
ALL (search return item name) | ||||
Section 7.3.4, Paragraph 7.6.1 | ||||
ALREADYEXISTS (response code) | ||||
Section 7.1, Paragraph 4.4.1 | ||||
ANSWERED (search key) | ||||
Section 6.4.4 | ||||
APPEND (command) | ||||
Section 6.3.12 | ||||
APPENDUID (response code) | ||||
Section 7.1, Paragraph 4.6.1 | ||||
AUTHENTICATE (command) | ||||
Section 6.2.2 | ||||
AUTHENTICATIONFAILED (response code) | ||||
Section 7.1, Paragraph 4.8.1 | ||||
AUTHORIZATIONFAILED (response code) | ||||
Section 7.1, Paragraph 4.10.1 | ||||
K | B | |||
KEYWORD <flag> (search key) 83 | ||||
Keyword (type of flag) 12 | ||||
L | BAD (response) | |||
LARGER <n> (search key) 83 | Section 7.1.3 | |||
LIMIT (response code) 109 | BADCHARSET (response code) | |||
LIST (command) 48 | Section 7.1 | |||
LIST (response) 117 | BCC <string> (search key) | |||
LOGOUT (command) 28 | Section 6.4.4 | |||
BEFORE <date> (search key) | ||||
Section 6.4.4 | ||||
BINARY.PEEK[<section-binary>]<<partial>> (fetch item) | ||||
Section 6.4.5 | ||||
BINARY.SIZE[<section-binary>] (fetch item) | ||||
Section 6.4.5, Paragraph 9.6.1 | ||||
BINARY.SIZE[<section-binary>] (fetch result) | ||||
Section 7.5.2, Paragraph 4.4.1 | ||||
BINARY[<section-binary>]<<number>> (fetch result) | ||||
Section 7.5.2, Paragraph 4.2.1 | ||||
BINARY[<section-binary>]<<partial>> (fetch item) | ||||
Section 6.4.5, Paragraph 9.2.1 | ||||
BODY (fetch item) | ||||
Section 6.4.5 | ||||
BODY (fetch result) | ||||
Section 7.5.2 | ||||
BODY <string> (search key) | ||||
Section 6.4.4 | ||||
BODY.PEEK[<section>]<<partial>> (fetch item) | ||||
Section 6.4.5 | ||||
BODYSTRUCTURE (fetch item) | ||||
Section 6.4.5 | ||||
BODYSTRUCTURE (fetch result) | ||||
Section 7.5.2, Paragraph 4.10.1 | ||||
BODY[<section>]<<origin octet>> (fetch result) | ||||
Section 7.5.2, Paragraph 4.8.1 | ||||
BODY[<section>]<<partial>> (fetch item) | ||||
Section 6.4.5, Paragraph 9.10.1 | ||||
BYE (response) | ||||
Section 7.1.5 | ||||
Body Structure (message attribute) | ||||
Section 2.3.6 | ||||
M | C | |||
MAX (search result option) 80 | ||||
MAX (search return item name) 122 | ||||
MAY (specification requirement term) 5 | ||||
MESSAGES (status item) 72 | ||||
MIME (part specifier) 96 | ||||
MIN (search result option) 80 | ||||
MIN (search return item name) 122 | ||||
MOVE (command) 99 | ||||
MUST (specification requirement term) 5 | ||||
MUST NOT (specification requirement term) 5 | ||||
Message Sequence Number (message attribute) 11 | ||||
N | CANNOT (response code) | |||
NAMESPACE (command) 66 | Section 7.1, Paragraph 4.14.1 | |||
NAMESPACE (response) 121 | CAPABILITY (command) | |||
NO (response) 113 | Section 6.1.1 | |||
NONEXISTENT (response code) 109 | CAPABILITY (response code) | |||
NOOP (command) 28 | Section 7.1 | |||
NOPERM (response code) 110 | CAPABILITY (response) | |||
NOT <search-key> (search key) 83 | Section 7.2.2 | |||
NOT RECOMMENDED (specification requirement term) 5 | CC <string> (search key) | |||
Section 6.4.4 | ||||
CLIENTBUG (response code) | ||||
Section 7.1, Paragraph 4.18.1 | ||||
CLOSE (command) | ||||
Section 6.4.1 | ||||
CLOSED (response code) | ||||
Section 7.1, Paragraph 4.20.1 | ||||
CONTACTADMIN (response code) | ||||
Section 7.1, Paragraph 4.22.1 | ||||
COPY (command) | ||||
Section 6.4.7 | ||||
COPYUID (response code) | ||||
Section 7.1, Paragraph 4.24.1 | ||||
CORRUPTION (response code) | ||||
Section 7.1, Paragraph 4.26.1 | ||||
COUNT (search result option) | ||||
Section 6.4.4 | ||||
COUNT (search return item name) | ||||
Section 7.3.4 | ||||
CREATE (command) | ||||
Section 6.3.4 | ||||
O | D | |||
OK (response) 113 | ||||
ON <date> (search key) 83 | ||||
OPTIONAL (specification requirement term) 5 | ||||
OR <search-key1> <search-key2> (search key) 83 | ||||
OVERQUOTA (response code) 110 | ||||
P | DELETE (command) | |||
PARSE (response code) 110 | Section 6.3.5 | |||
PERMANENTFLAGS (response code) 110 | DELETED (search key) | |||
PREAUTH (response) 114 | Section 6.4.4 | |||
PRIVACYREQUIRED (response code) 111 | DELETED (status item) | |||
Permanent Flag (class of flag) 14 | Section 6.3.11 | |||
Predefined keywords 13 | DRAFT (search key) | |||
Section 6.4.4 | ||||
R | E | |||
READ-ONLY (response code) 111 | ||||
READ-WRITE (response code) 111 | ||||
RECOMMENDED (specification requirement term) 5 | ||||
RENAME (command) 44 | ||||
REQUIRED (specification requirement term) 5 | ||||
RFC822.SIZE (fetch item) 95 | ||||
RFC822.SIZE (fetch result) 130 | ||||
S | ENABLE (command) | |||
SAVE (search result option) 81 | Section 6.3.1 | |||
SEARCH (command) 79 | ENVELOPE (fetch item) | |||
SEEN (search key) 83 | Section 6.4.5 | |||
SELECT (command) 38 | ENVELOPE (fetch result) | |||
SENTBEFORE <date> (search key) 83 | Section 7.5.2, Paragraph 4.42.1 | |||
SENTON <date> (search key) 83 | ESEARCH (response) | |||
SENTSINCE <date> (search key) 83 | Section 7.3.4 | |||
SERVERBUG (response code) 111 | EXAMINE (command) | |||
SHOULD (specification requirement term) 5 | Section 6.3.3 | |||
SHOULD NOT (specification requirement term) 5 | EXPIRED (response code) | |||
SINCE <date> (search key) 84 | Section 7.1, Paragraph 4.28.1 | |||
SIZE (status item) 73 | EXPUNGE (command) | |||
SMALLER <n> (search key) 84 | Section 6.4.3 | |||
STARTTLS (command) 29 | EXPUNGE (response) | |||
STATUS (command) 71 | Section 7.5.1 | |||
STATUS (response) 121 | EXPUNGEISSUED (response code) | |||
STORE (command) 97 | Section 7.1, Paragraph 4.30.1 | |||
SUBJECT <string> (search key) 84 | Envelope Structure (message attribute) | |||
SUBSCRIBE (command) 47 | Section 2.3.5 | |||
Session Flag (class of flag) 14 | ||||
System Flag (type of flag) 12 | ||||
T | F | |||
TEXT (part specifier) 95 | ||||
TEXT <string> (search key) 84 | ||||
TO <string> (search key) 84 | ||||
TRYCREATE (response code) 111 | ||||
U | FAST (fetch item) | |||
UID (command) 101 | Section 6.4.5 | |||
UID (fetch item) 95 | FETCH (command) | |||
UID (fetch result) 130 | Section 6.4.5 | |||
UID <sequence set> (search key) 84 | FETCH (response) | |||
UIDNEXT (response code) 111 | Section 7.5.2 | |||
UIDNEXT (status item) 72 | FLAGGED (search key) | |||
UIDNOTSTICKY (response code) 112 | Section 6.4.4 | |||
UIDVALIDITY (response code) 112 | FLAGS (fetch item) | |||
UIDVALIDITY (status item) 72 | Section 6.4.5 | |||
UNANSWERED (search key) 84 | FLAGS (fetch result) | |||
UNAVAILABLE (response code) 112 | Section 7.5.2 | |||
UNDELETED (search key) 84 | FLAGS (response) | |||
UNDRAFT (search key) 84 | Section 7.3.5 | |||
UNFLAGGED (search key) 84 | FLAGS <flag list> (store command data item) | |||
UNKEYWORD <flag> (search key) 84 | Section 6.4.6 | |||
UNKNOWN-CTE (response code) 112 | FLAGS.SILENT <flag list> (store command data item) | |||
UNSEEN (search key) 84 | Section 6.4.6 | |||
UNSEEN (status item) 73 | FROM <string> (search key) | |||
UNSELECT (command) 78 | Section 6.4.4 | |||
UNSUBSCRIBE (command) 47 | FULL (fetch item) | |||
Unique Identifier (UID) (message attribute) 10 | Section 6.4.5 | |||
Flags (message attribute) | ||||
Section 2.3.2 | ||||
[ | H | |||
[RFC-5322] Size (message attribute) 14 | ||||
\ | HASCHILDREN (response code) | |||
\All (mailbox name attribute) 119 | Section 7.1, Paragraph 4.32.1 | |||
\Answered (system flag) 12 | HEADER (part specifier) | |||
\Archive (mailbox name attribute) 119 | Section 6.4.5.1, Paragraph 5 | |||
\Deleted (system flag) 12 | HEADER <field-name> <string> (search key) | |||
\Draft (system flag) 12 | Section 6.4.4 | |||
\Drafts (mailbox name attribute) 119 | HEADER.FIELDS (part specifier) | |||
\Flagged (mailbox name attribute) 119 | Section 6.4.5.1, Paragraph 5 | |||
\Flagged (system flag) 12 | HEADER.FIELDS.NOT (part specifier) | |||
\HasChildren (mailbox name attribute) 118 | Section 6.4.5.1, Paragraph 5 | |||
\HasNoChildren (mailbox name attribute) 118 | ||||
\Junk (mailbox name attribute) 119 | I | |||
\Marked (mailbox name attribute) 118 | ||||
\Noinferiors (mailbox name attribute) 117 | IDLE (command) | |||
\NonExistent (mailbox name attribute) 117 | Section 6.3.13 | |||
\Noselect (mailbox name attribute) 118 | INTERNALDATE ( fetch item) | |||
\Recent (system flag) 12 | Section 6.4.5 | |||
\Remote (mailbox name attribute) 118 | INTERNALDATE (fetch result) | |||
\Seen (system flag) 12 | Section 7.5.2 | |||
\Sent (mailbox name attribute) 119 | INUSE (response code) | |||
\Subscribed (mailbox name attribute) 118 | Section 7.1, Paragraph 4.34.1 | |||
\Trash (mailbox name attribute) 119 | Internal Date (message attribute) | |||
\Unmarked (mailbox name attribute) 118 | Section 2.3.3 | |||
K | ||||
KEYWORD <flag> (search key) | ||||
Section 6.4.4 | ||||
Keyword (type of flag) | ||||
Section 2.3.2, Paragraph 4 | ||||
L | ||||
LARGER <n> (search key) | ||||
Section 6.4.4 | ||||
LIMIT (response code) | ||||
Section 7.1, Paragraph 4.36.1 | ||||
LIST (command) | ||||
Section 6.3.9 | ||||
LIST (response) | ||||
Section 7.3.1 | ||||
LOGOUT (command) | ||||
Section 6.1.3 | ||||
M | ||||
MAX (search result option) | ||||
Section 6.4.4, Paragraph 6.4.1 | ||||
MAX (search return item name) | ||||
Section 7.3.4, Paragraph 7.4.1 | ||||
MAY (specification requirement term) | ||||
Section 1.2 | ||||
MESSAGES (status item) | ||||
Section 6.3.11 | ||||
MIME (part specifier) | ||||
Section 6.4.5.1, Paragraph 7 | ||||
MIN (search result option) | ||||
Section 6.4.4, Paragraph 6.2.1 | ||||
MIN (search return item name) | ||||
Section 7.3.4, Paragraph 7.2.1 | ||||
MOVE (command) | ||||
Section 6.4.8 | ||||
MUST (specification requirement term) | ||||
Section 1.2 | ||||
MUST NOT (specification requirement term) | ||||
Section 1.2 | ||||
Message Sequence Number (message attribute) | ||||
Section 2.3.1.2 | ||||
N | ||||
NAMESPACE (command) | ||||
Section 6.3.10 | ||||
NAMESPACE (response) | ||||
Section 7.3.2 | ||||
NO (response) | ||||
Section 7.1.2 | ||||
NONEXISTENT (response code) | ||||
Section 7.1, Paragraph 4.38.1 | ||||
NOOP (command) | ||||
Section 6.1.2 | ||||
NOPERM (response code) | ||||
Section 7.1, Paragraph 4.40.1 | ||||
NOT <search-key> (search key) | ||||
Section 6.4.4 | ||||
NOT RECOMMENDED (specification requirement term) | ||||
Section 1.2 | ||||
O | ||||
OK (response) | ||||
Section 7.1.1 | ||||
ON <date> (search key) | ||||
Section 6.4.4 | ||||
OPTIONAL (specification requirement term) | ||||
Section 1.2; Section 1.2 | ||||
OR <search-key1> <search-key2> (search key) | ||||
Section 6.4.4 | ||||
OVERQUOTA (response code) | ||||
Section 7.1, Paragraph 4.42.1 | ||||
P | ||||
PARSE (response code) | ||||
Section 7.1 | ||||
PERMANENTFLAGS (response code) | ||||
Section 7.1, Paragraph 4.46.1 | ||||
PREAUTH (response) | ||||
Section 7.1.4 | ||||
PRIVACYREQUIRED (response code) | ||||
Section 7.1, Paragraph 4.48.1 | ||||
Permanent Flag (class of flag) | ||||
Section 2.3.2, Paragraph 9 | ||||
Predefined keywords | ||||
Section 2.3.2, Paragraph 5 | ||||
R | ||||
READ-ONLY (response code) | ||||
Section 7.1 | ||||
READ-WRITE (response code) | ||||
Section 7.1 | ||||
RECOMMENDED (specification requirement term) | ||||
Section 1.2 | ||||
RENAME (command) | ||||
Section 6.3.6 | ||||
REQUIRED (specification requirement term) | ||||
Section 1.2 | ||||
RFC822.SIZE (fetch item) | ||||
Section 6.4.5 | ||||
RFC822.SIZE (fetch result) | ||||
Section 7.5.2 | ||||
RFC822.SIZE (message attribute) | ||||
Section 2.3.4 | ||||
S | ||||
SAVE (search result option) | ||||
Section 6.4.4, Paragraph 6.10.1 | ||||
SEARCH (command) | ||||
Section 6.4.4 | ||||
SEEN (search key) | ||||
Section 6.4.4 | ||||
SELECT (command) | ||||
Section 6.3.2 | ||||
SENTBEFORE <date> (search key) | ||||
Section 6.4.4 | ||||
SENTON <date> (search key) | ||||
Section 6.4.4 | ||||
SENTSINCE <date> (search key) | ||||
Section 6.4.4 | ||||
SERVERBUG (response code) | ||||
Section 7.1, Paragraph 4.54.1 | ||||
SHOULD (specification requirement term) | ||||
Section 1.2 | ||||
SHOULD NOT (specification requirement term) | ||||
Section 1.2 | ||||
SINCE <date> (search key) | ||||
Section 6.4.4 | ||||
SIZE (status item) | ||||
Section 6.3.11 | ||||
SMALLER <n> (search key) | ||||
Section 6.4.4 | ||||
STARTTLS (command) | ||||
Section 6.2.1 | ||||
STATUS (command) | ||||
Section 6.3.11 | ||||
STATUS (response) | ||||
Section 7.3.3 | ||||
STORE (command) | ||||
Section 6.4.6 | ||||
SUBJECT <string> (search key) | ||||
Section 6.4.4 | ||||
SUBSCRIBE (command) | ||||
Section 6.3.7 | ||||
Session Flag (class of flag) | ||||
Section 2.3.2, Paragraph 9 | ||||
System Flag (type of flag) | ||||
Section 2.3.2, Paragraph 2 | ||||
T | ||||
TEXT (part specifier) | ||||
Section 6.4.5.1, Paragraph 5 | ||||
TEXT <string> (search key) | ||||
Section 6.4.4 | ||||
TO <string> (search key) | ||||
Section 6.4.4 | ||||
TRYCREATE (response code) | ||||
Section 7.1 | ||||
U | ||||
UID (command) | ||||
Section 6.4.9 | ||||
UID (fetch item) | ||||
Section 6.4.5 | ||||
UID (fetch result) | ||||
Section 7.5.2 | ||||
UID <sequence set> (search key) | ||||
Section 6.4.4 | ||||
UIDNEXT (response code) | ||||
Section 7.1 | ||||
UIDNEXT (status item) | ||||
Section 6.3.11 | ||||
UIDNOTSTICKY (response code) | ||||
Section 7.1, Paragraph 4.60.1 | ||||
UIDVALIDITY (response code) | ||||
Section 7.1 | ||||
UIDVALIDITY (status item) | ||||
Section 6.3.11 | ||||
UNANSWERED (search key) | ||||
Section 6.4.4 | ||||
UNAVAILABLE (response code) | ||||
Section 7.1, Paragraph 4.64.1 | ||||
UNDELETED (search key) | ||||
Section 6.4.4 | ||||
UNDRAFT (search key) | ||||
Section 6.4.4 | ||||
UNFLAGGED (search key) | ||||
Section 6.4.4 | ||||
UNKEYWORD <flag> (search key) | ||||
Section 6.4.4 | ||||
UNKNOWN-CTE (response code) | ||||
Section 7.1 | ||||
UNSEEN (search key) | ||||
Section 6.4.4 | ||||
UNSEEN (status item) | ||||
Section 6.3.11 | ||||
UNSELECT (command) | ||||
Section 6.4.2 | ||||
UNSUBSCRIBE (command) | ||||
Section 6.3.8 | ||||
Unique Identifier (UID) (message attribute) | ||||
Section 2.3.1.1 | ||||
Authors' Addresses | Authors' Addresses | |||
Alexey Melnikov (editor) | Alexey Melnikov (editor) | |||
Isode Ltd | Isode Ltd | |||
14 Castle Mews | 14 Castle Mews | |||
Hampton, Middlesex TW12 2NP | Hampton, Middlesex | |||
UK | TW12 2NP | |||
United Kingdom | ||||
Email: Alexey.Melnikov@isode.com | Email: Alexey.Melnikov@isode.com | |||
Barry Leiba (editor) | Barry Leiba (editor) | |||
Futurewei Technologies | Futurewei Technologies | |||
Phone: +1 646 827 0648 | ||||
Email: barryleiba@computer.org | Email: barryleiba@computer.org | |||
URI: http://internetmessagingtechnology.org/ | URI: http://internetmessagingtechnology.org/ | |||
End of changes. 1265 change blocks. | ||||
4165 lines changed or deleted | 4792 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/ |