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