123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731 |
- Network Working Group A. Melnikov
- Request for Comments: 5182 Isode Ltd.
- Updates: 3501 March 2008
- Category: Standards Track
- IMAP Extension for Referencing the Last SEARCH Result
- Status of This Memo
- This document specifies an Internet standards track protocol for the
- Internet community, and requests discussion and suggestions for
- improvements. Please refer to the current edition of the "Internet
- Official Protocol Standards" (STD 1) for the standardization state
- and status of this protocol. Distribution of this memo is unlimited.
- Abstract
- Many IMAP clients use the result of a SEARCH command as the input to
- perform another operation, for example, fetching the found messages,
- deleting them, or copying them to another mailbox.
- This can be achieved using standard IMAP operations described in RFC
- 3501; however, this would be suboptimal. The server will send the
- list of found messages to the client; after that, the client will
- have to parse the list, reformat it, and send it back to the server.
- The client can't pipeline the SEARCH command with the subsequent
- command, and, as a result, the server might not be able to perform
- some optimizations.
- This document proposes an IMAP extension that allows a client to tell
- a server to use the result of a SEARCH (or Unique Identifier (UID)
- SEARCH) command as an input to any subsequent command.
- 1. Introduction
- Many IMAP clients use the result of a SEARCH command as the input to
- perform another operation, for example, fetching the found messages,
- deleting them, or copying them to another mailbox.
- This document proposes an IMAP extension that allows a client to tell
- a server to use the result of a SEARCH (or UID SEARCH) command as an
- input to any subsequent command.
- The SEARCH result reference extension defines a new SEARCH result
- option [IMAPABNF] "SAVE" that 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 [SORT]) and store it in an internal
- Melnikov Standards Track [Page 1]
- RFC 5182 Last SEARCH Result Reference March 2008
- 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. The
- search result marker has several advantages:
- * it avoids wasted bandwidth and associated delay;
- * it allows the client to pipeline a SEARCH [IMAP4] command with a
- subsequent FETCH/STORE/COPY/SEARCH [IMAP4] or UID EXPUNGE
- [UIDPLUS] command;
- * the client doesn't need to spend time reformatting the result of
- a SEARCH command into a message set used in the subsequent
- command;
- * it allows the server to perform optimizations. For example, if
- the server can execute several pipelined commands in parallel
- (or out of order), presence of the search result marker can
- allow the server to decide which commands may or may not be
- executed out of order.
- In absence of any other SEARCH result option, the SAVE result option
- also suppresses any SEARCH response that would have been otherwise
- returned by the SEARCH command.
- 1.1. Conventions Used in This Document
- In examples, "C:" indicates lines sent by a client that is connected
- to a server. "S:" indicates lines sent by the server to the client.
- The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
- "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
- document are to be interpreted as described in [KEYWORDS].
- Explanatory comments in examples start with // and are not part of
- the protocol.
- Melnikov Standards Track [Page 2]
- RFC 5182 Last SEARCH Result Reference March 2008
- 2. Overview
- 2.1. Normative Description of the SEARCHRES Extension
- The SEARCH result reference extension described in this document is
- present in any IMAP4 server implementation that returns "SEARCHRES"
- as one of the supported capabilities in the CAPABILITY command
- response. Any such server MUST also implement the [ESEARCH]
- extension.
- Upon successful completion of a SELECT or an EXAMINE command (after
- the tagged OK response), the current search result variable is reset
- to the empty sequence.
- A successful SEARCH command with the SAVE result option sets the
- value of the search result variable to the list of messages found in
- the SEARCH command. For example, if no messages were found, the
- search result variable will contain the empty list.
- Any of the following SEARCH commands MUST NOT change the search
- result variable:
- o a SEARCH command that caused the server to return the BAD tagged
- response,
- o a SEARCH command with no SAVE result option that caused the
- server to return NO tagged response,
- o a successful SEARCH command with no SAVE result option.
- 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
- variable to the empty sequence.
- When a message listed in the search result variable is EXPUNGEd, it
- is automatically removed from the list. Implementors are reminded
- that if the server stores the list as a list of message numbers, it
- MUST automatically adjust them when notifying the client about
- expunged messages, as described in Section 7.4.1 of [IMAP4].
- If the server decides to send a new UIDVALIDITY value while the
- mailbox is opened, this causes resetting of the search variable to
- the empty list.
- Melnikov Standards Track [Page 3]
- RFC 5182 Last SEARCH Result Reference March 2008
- Note that even if the "$" marker contains the empty list of messages,
- it must be treated by all commands accepting message sets as
- parameters as a valid, but non-matching list of messages. For
- example, the "FETCH $" command would return a tagged OK response and
- no FETCH responses. See also the Example 5 below.
- Note that even if the "$" marker contains the empty list of messages,
- it must be treated as a valid but non-matching list of messages, by
- all commands that accept message sets as parameters.
- Implementation note: server implementors should note that "$" can
- reference IMAP message sequences or UID sequences, depending on the
- 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
- 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)
- command and used as a parameter to a FETCH command (which accepts a
- message sequence, not a UID sequence).
- 2.2. Examples
- 1) The following example demonstrates how the client can use the
- result of a SEARCH command to FETCH headers of interesting
- messages:
- 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 RFC822.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:
- Example 2:
- C: A282 SEARCH RETURN (SAVE) FLAGGED SINCE 1-Feb-1994
- NOT FROM "Smith"
- C: A283 FETCH $ (UID INTERNALDATE FLAGS RFC822.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
- Melnikov Standards Track [Page 4]
- RFC 5182 Last SEARCH Result Reference March 2008
- 2) The following example demonstrates that the result of one SEARCH
- command can be used as input to another SEARCH command:
- Example 3:
- C: A300 SEARCH RETURN (SAVE) SINCE 1-Jan-2004
- NOT FROM "Smith"
- S: A300 OK SEARCH completed
- C: A301 UID SEARCH UID $ SMALLER 4096
- S: * SEARCH 17 900 901
- S: A301 OK completed
- Note that the second command in Example 3 can be replaced with:
- C: A301 UID SEARCH $ SMALLER 4096
- and the result of the command would be the same.
- 3) The following example shows that the "$"
- marker can be combined with other message numbers using the OR
- SEARCH criterion.
- Example 4:
- C: P282 SEARCH RETURN (SAVE) SINCE 1-Feb-1994
- NOT FROM "Smith"
- S: P282 OK SEARCH completed
- C: P283 SEARCH CHARSET UTF-8 (OR $ 1,3000:3021) TEXT {8}
- C: YYYYYYYY
- S: * SEARCH 882 1102 3003 3005 3006
- S: P283 OK completed
- Note: Since this document format is restricted to 7-bit ASCII text,
- 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.
- Melnikov Standards Track [Page 5]
- RFC 5182 Last SEARCH Result Reference March 2008
- 4) The following example demonstrates that a failed SEARCH sets the
- search result variable to the empty list.
- Example 5:
- C: B282 SEARCH RETURN (SAVE) SINCE 1-Feb-1994
- NOT FROM "Smith"
- S: B282 OK SEARCH completed
- C: B283 SEARCH 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.
- //A better approach might be to always use CHARSET UTF-8
- //instead.
- Note: Since this document format is restricted to 7-bit ASCII text,
- it is not possible to show actual KOI8-R data. The "XXXX" is a
- 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
- the "$" marker when it contains no messages.
- Example 6:
- C: E282 SEARCH RETURN (SAVE) SINCE 28-Oct-2006
- NOT FROM "Eric"
- C: E283 COPY $ "Other Messages"
- //The "$" contains no messages
- S: E282 OK SEARCH completed
- S: E283 OK COPY completed, nothing copied
- 2.3. Multiple Commands in Progress
- Use of a SEARCH RETURN (SAVE) command followed by a command using the
- "$" marker creates direct dependency between the two commands. As
- directed by Section 5.5 of [IMAP4], a server MUST execute the two
- commands in the order they were received. (A server capable of
- out-of-order execution can in some cases execute the two commands in
- parallel, for example, if a SEARCH RETURN (SAVE) is followed by
- "SEARCH $", the search criteria from the first command can be
- directly substituted into the second command.)
- Melnikov Standards Track [Page 6]
- RFC 5182 Last SEARCH Result Reference March 2008
- A client supporting this extension MAY pipeline a SEARCH RETURN
- (SAVE) command with one or more command using the "$" marker, as long
- as this doesn't create an ambiguity, as described in Section 5.5 of
- [IMAP4].
- Example 7:
- C: F282 SEARCH RETURN (SAVE) KEYWORD $Junk
- C: F283 COPY $ "Junk"
- C: F284 STORE $ +FLAGS.Silent (\Deleted)
- S: F282 OK SEARCH completed
- S: F283 OK COPY completed
- S: F284 OK STORE completed
- Example 8:
- 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.
- //Note that the second command is making use of
- //the [ESEARCH] extension.
- 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 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
- 2.4. Interaction with ESEARCH Extension
- Servers that implement the extension defined in this document MUST
- implement [ESEARCH] and conform to additional requirements listed in
- this section.
- The SAVE result option doesn't change whether the server would return
- items corresponding to MIN, MAX, ALL, or COUNT [ESEARCH] result
- options.
- Melnikov Standards Track [Page 7]
- RFC 5182 Last SEARCH Result Reference March 2008
- When the SAVE result option is combined with the MIN or MAX [ESEARCH]
- result option, and none of the other ESEARCH result options are
- present, the corresponding MIN/MAX is returned (if the search result
- is not empty), but the "$" marker would contain a single message as
- returned in the MIN/MAX return item.
- If the SAVE result option is combined with both MIN and MAX result
- options, and none of the other ESEARCH result options are present,
- the "$" marker would contain one or two messages as returned in the
- MIN/MAX return items.
- If the SAVE result option is combined with the ALL and/or COUNT
- result option(s), the "$" marker would always contain all messages
- found by the SEARCH or UID SEARCH command. (Note that the last rule
- might affect ESEARCH implementations that optimize how the COUNT
- result is constructed.)
- The following table summarizes the additional requirement on ESEARCH
- server implementations described in this section.
- +----------------+-------------------+
- | Combination of | "$" marker value |
- | Result option | |
- +----------------+-------------------+
- | SAVE MIN | MIN |
- +----------------+-------------------+
- | SAVE MAX | MAX |
- +----------------+-------------------+
- | SAVE MIN MAX | MIN & MAX |
- +----------------+-------------------+
- | SAVE * [m] | all found messages|
- +----------------+-------------------+
- where '*' means "ALL" and/or "COUNT"
- '[m]' means optional "MIN" and/or "MAX"
- Melnikov Standards Track [Page 8]
- RFC 5182 Last SEARCH Result Reference March 2008
- The following example demonstrates behavioral difference for
- different combinations of ESEARCH result options. Explanatory
- comments start with // and are not part of the protocol:
- 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
- Melnikov Standards Track [Page 9]
- RFC 5182 Last SEARCH Result Reference March 2008
- 2.5. Refusing to Save Search Results
- 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
- reached.
- In this case, the server MUST return a tagged NO response containing
- the NOTSAVED response code and set the search result variable to the
- empty sequence, as described in Section 2.1.
- 3. Formal Syntax
- The following syntax specification uses the Augmented Backus-Naur
- Form (ABNF) notation as specified in [ABNF]. Non-terminals
- referenced but not defined below are as defined in [IMAP4] or
- [IMAPABNF].
- Except as noted otherwise, all alphabetic characters are
- case-insensitive. The use of upper- or lower-case characters to
- define token strings is for editorial clarity only. Implementations
- MUST accept these strings in a case-insensitive fashion.
- capability =/ "SEARCHRES"
- ;; capability is defined in [IMAP4]
- sequence-set =/ seq-last-command
- ;; extends sequence-set to allow for
- ;; "result of the last command" indicator.
- seq-last-command = "$"
- search-return-opt = "SAVE"
- ;; conforms to generic search-return-opt
- ;; syntax defined in [IMAPABNF]
- resp-text-code =/ "NOTSAVED"
- ;; <resp-text-code> from [IMAP4]
- Melnikov Standards Track [Page 10]
- RFC 5182 Last SEARCH Result Reference March 2008
- 4. Security Considerations
- This extension requires the server to keep additional state, that may
- be used to simplify Denial of Service attacks. In order to minimize
- damage from such attacks, server implementations MAY limit the number
- of saved searches they allow across all connections at any given time
- and return the tagged NO response containing the NOTSAVED response
- code (see Section 2.5) to a SEARCH RETURN (SAVE) command when this
- limit is exceeded.
- Apart from that, it is believed that this extension doesn't raise any
- additional security concerns not already discussed in [IMAP4].
- 5. IANA Considerations
- This document defines the "SEARCHRES" IMAP capability. IANA has
- added it to the IMAP4 Capabilities Registry, which is currently
- located at:
- http://www.iana.org/assignments/imap4-capabilities
- 6. Acknowledgments
- The author would like to thank Mark Crispin, Cyrus Daboo, and Curtis
- King for remembering that this document had to be written, as well as
- for comments and corrections received.
- The author would also like to thank Dave Cridland, Mark Crispin,
- Chris Newman, Dan Karp, and Spencer Dawkins for comments and
- corrections received.
- Valuable comments, both in agreement and in dissent, were received
- from Arnt Gulbrandsen.
- Melnikov Standards Track [Page 11]
- RFC 5182 Last SEARCH Result Reference March 2008
- 7. References
- 7.1. Normative References
- [KEYWORDS] Bradner, S., "Key words for use in RFCs to Indicate
- Requirement Levels", BCP 14, RFC 2119, March 1997.
- [ABNF] Crocker, D., Ed., and P. Overell, "Augmented BNF for
- Syntax Specifications: ABNF", STD 68, RFC 5234, January
- 2008.
- [IMAP4] Crispin, M., "INTERNET MESSAGE ACCESS PROTOCOL - VERSION
- 4rev1", RFC 3501, March 2003.
- [IMAPABNF] Melnikov, A. and C. Daboo, "Collected Extensions to IMAP4
- ABNF", RFC 4466, April 2006.
- [ESEARCH] Melnikov, A. and D. Cridland, "IMAP4 Extension to SEARCH
- Command for Controlling What Kind of Information Is
- Returned", RFC 4731, November 2006.
- 7.2. Informative References
- [UIDPLUS] Crispin, M., "Internet Message Access Protocol (IMAP) -
- UIDPLUS extension", RFC 4315, December 2005.
- [SORT] Crispin, M. and K. Murchison, "INTERNET MESSAGE ACCESS
- PROTOCOL - SORT AND THREAD EXTENSIONS", Work in Progress,
- Septemeber 2007.
- Author's Address
- Alexey Melnikov
- Isode Ltd.
- 5 Castle Business Village,
- 36 Station Road,
- Hampton, Middlesex,
- TW12 2BX, United Kingdom
- EMail: Alexey.Melnikov@isode.com
- Melnikov Standards Track [Page 12]
- RFC 5182 Last SEARCH Result Reference March 2008
- Full Copyright Statement
- Copyright (C) The IETF Trust (2008).
- This document is subject to the rights, licenses and restrictions
- contained in BCP 78, and except as set forth therein, the authors
- retain all their rights.
- This document and the information contained herein are provided on an
- "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
- OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND
- THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS
- OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF
- THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
- WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- Intellectual Property
- The IETF takes no position regarding the validity or scope of any
- Intellectual Property Rights or other rights that might be claimed to
- pertain to the implementation or use of the technology described in
- this document or the extent to which any license under such rights
- might or might not be available; nor does it represent that it has
- made any independent effort to identify any such rights. Information
- on the procedures with respect to rights in RFC documents can be
- found in BCP 78 and BCP 79.
- Copies of IPR disclosures made to the IETF Secretariat and any
- assurances of licenses to be made available, or the result of an
- attempt made to obtain a general license or permission for the use of
- such proprietary rights by implementers or users of this
- specification can be obtained from the IETF on-line IPR repository at
- http://www.ietf.org/ipr.
- The IETF invites any interested party to bring to its attention any
- copyrights, patents or patent applications, or other proprietary
- rights that may cover technology that may be required to implement
- this standard. Please address the information to the IETF at
- ietf-ipr@ietf.org.
- Melnikov Standards Track [Page 13]
|