| rfc9394xml2.original.xml | rfc9394.xml | |||
|---|---|---|---|---|
| <?xml version="1.0"?> | <?xml version="1.0" encoding="UTF-8"?> | |||
| <!DOCTYPE rfc SYSTEM "rfc2629.dtd" [ | ||||
| <!ENTITY rfc2119 PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml/referenc | ||||
| e.RFC.2119.xml'> | ||||
| <!ENTITY rfc3501 PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml/referenc | ||||
| e.RFC.3501.xml'> | ||||
| <!ENTITY rfc4731 PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml/referenc | ||||
| e.RFC.4731.xml'> | ||||
| <!ENTITY rfc5267 PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml/referenc | ||||
| e.RFC.5267.xml'> | ||||
| <!ENTITY rfc8174 PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml/referenc | ||||
| e.RFC.8174.xml'> | ||||
| <!ENTITY rfc9051 PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml/referenc | ||||
| e.RFC.9051.xml'> | ||||
| <!-- [CS] updated by Chris 01/23/23 --> | ||||
| <!DOCTYPE rfc [ | ||||
| <!ENTITY nbsp " "> | ||||
| <!ENTITY zwsp "​"> | ||||
| <!ENTITY nbhy "‑"> | ||||
| <!ENTITY wj "⁠"> | ||||
| ]> | ]> | |||
| <?xml-stylesheet type="text/xsl" href="rfc2629.xslt"?> | ||||
| <rfc category="std" ipr="pre5378Trust200902" updates="5267, 4731" docName="draft | ||||
| -ietf-extra-imap-partial-04"> | ||||
| <?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?> | ||||
| <?rfc toc="yes" ?> | ||||
| <?rfc symrefs="yes" ?> | ||||
| <?rfc sortrefs="yes"?> | ||||
| <?rfc iprnotified="no" ?> | ||||
| <?rfc strict="yes" ?> | ||||
| <?rfc comments="yes" ?> | ||||
| <?rfc inline="yes" ?> | ||||
| <?rfc compact="yes"?> | ||||
| <?rfc subcompact="no"?> | ||||
| <front> | ||||
| <title abbrev="IMAP PARTIAL"> | ||||
| IMAP Paged SEARCH & FETCH Extension | ||||
| </title> | ||||
| <author initials="A." surname="Melnikov" fullname="Alexey Melniko | ||||
| v"> | ||||
| <organization abbrev="Isode"> | ||||
| Isode Limited | ||||
| </organization> | ||||
| <address> | ||||
| <email>alexey.melnikov@isode.com</email> | ||||
| <uri>https://www.isode.com</uri> | ||||
| </address> | ||||
| </author> | ||||
| <rfc xmlns:xi="http://www.w3.org/2001/XInclude" submissionType="IETF" category=" | ||||
| std" consensus="true" docName="draft-ietf-extra-imap-partial-04" number="9394" i | ||||
| pr="pre5378Trust200902" updates="4731, 5267" obsoletes="" xml:lang="en" tocInclu | ||||
| de="true" symRefs="true" sortRefs="true" version="3"> | ||||
| <!-- xml2rfc v2v3 conversion 3.15.3 --> | ||||
| <front> | ||||
| <title abbrev="IMAP PARTIAL Extension"> | ||||
| IMAP PARTIAL Extension for Paged SEARCH and FETCH | ||||
| </title> | ||||
| <seriesInfo name="RFC" value="9394"/> | ||||
| <author initials="A." surname="Melnikov" fullname="Alexey Melnikov"> | ||||
| <organization abbrev="Isode">Isode Limited</organization> | ||||
| <address> | ||||
| <email>alexey.melnikov@isode.com</email> | ||||
| <uri>https://www.isode.com</uri> | ||||
| </address> | ||||
| </author> | ||||
| <author initials="A. P." surname="Achuthan" fullname="Arun Prakash Achuthan" > | <author initials="A. P." surname="Achuthan" fullname="Arun Prakash Achuthan" > | |||
| <organization abbrev="Yahoo!"> | <organization abbrev="Yahoo!">Yahoo!</organization> | |||
| Yahoo! | ||||
| </organization> | ||||
| <address> | <address> | |||
| <email>arunprakash@myyahoo.com</email> | <email>arunprakash@myyahoo.com</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <author initials="V." surname="Nagulakonda" fullname="Vikram Nagulakonda"> | <author initials="V." surname="Nagulakonda" fullname="Vikram Nagulakonda"> | |||
| <organization abbrev="Yahoo!"> | <organization abbrev="Yahoo!">Yahoo!</organization> | |||
| Yahoo! | ||||
| </organization> | ||||
| <address> | <address> | |||
| <email>nvikram_imap@yahoo.com</email> | <email>nvikram_imap@yahoo.com</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <author initials="L." surname="Alves" fullname="Luis Alves"> | <author initials="L." surname="Alves" fullname="Luis Alves"> | |||
| <address> | <address> | |||
| <email>luis.alves@lafaspot.com</email> | <email>luis.alves@lafaspot.com</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <date year="2023" month="June" /> | ||||
| <date year="2022"/> | <area>art</area> | |||
| <abstract> | <workgroup>extra</workgroup> | |||
| <t>The PARTIAL extension of the Internet Message Access P | <abstract> | |||
| rotocol (RFC 3501/RFC 9051) | <t>The PARTIAL extension of the Internet Message Access Protocol (see RFCs | |||
| allows clients to limit the number of search results retu | 3501 and 9051) | |||
| rned, as well as to perform incremental (paged) searches. | allows clients to limit the number of SEARCH results ret | |||
| urned, as well as to perform incremental (paged) searches. | ||||
| This also helps servers to optimize resource usage when performing searche s. | This also helps servers to optimize resource usage when performing searche s. | |||
| </t> | </t> | |||
| <t>This document extends the PARTIAL SEARCH return option originally speci | ||||
| fied in RFC 5267. | ||||
| It also clarifies some interactions between RFC 5267 and RFCs 4731 and 905 | ||||
| 1.</t> | ||||
| <t>This document extends PARTIAL SEARCH return option originally specified | <t>This document updates RFCs 4731 and 5267.</t> | |||
| in RFC 5267. | ||||
| It also clarifies some interactions between RFC 5267 and RFC 4731/RFC 9051 | ||||
| .</t> | ||||
| </abstract> | </abstract> | |||
| </front> | </front> | |||
| <middle> | <middle> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Introduction and Overview"> | <name>Introduction and Overview</name> | |||
| <t>This document defines an extension to the Internet Message Access Proto | ||||
| <t>This document defines an extension to the Internet Message Access Proto | col <xref target="RFC3501" format="default"/> <xref target="RFC9051" format="def | |||
| col <xref target="RFC3501"/> | ault"/> | |||
| for performing incremental searches and fetches. | for performing incremental searches and fetches. | |||
| This extension is compatible with both IMAP4rev1 <xref target="RFC3501"/> | This extension is compatible with both IMAP4rev1 <xref target="RFC3501" fo | |||
| and IMAP4rev2 <xref target="RFC9051"/>.</t> | rmat="default"/> and IMAP4rev2 <xref target="RFC9051" format="default"/>. | |||
| This extension uses IMAP extensibility rules defined in <xref target="RFC4 | ||||
| 466"/>.</t> | ||||
| <t> | <t> | |||
| The PARTIAL extension of the Internet Message Access Protocol (RFC 3501/RF | The PARTIAL extension of the Internet Message Access Protocol | |||
| C 9051) | allows clients to limit the number of SEARCH results returned, as well as | |||
| allows clients to limit the number of search results returned, as well as | to perform incremental (paged) searches. | |||
| to perform incremental (paged) searches. | ||||
| This also helps servers to optimize resource usage when performing searche s. | This also helps servers to optimize resource usage when performing searche s. | |||
| </t> | </t> | |||
| <t>This document extends the PARTIAL SEARCH return option originally speci | ||||
| <t>This document extends PARTIAL SEARCH return option originally specified | fied in RFC 5267. | |||
| in RFC 5267. | It also clarifies some interactions between RFC 5267 and RFCs 4731 and 905 | |||
| It also clarifies some interactions between RFC 5267 and RFC 4731/RFC 9051 | 1.</t> | |||
| .</t> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| </section> | <name>Document Conventions</name> | |||
| <t>In protocol examples, this document uses a prefix of "C: " to denote li | ||||
| <section title="Document Conventions"> | nes sent by the client to the server and | |||
| <t>In protocol examples, this document uses a prefix of " | "S: " for lines sent by the server to the client. Lines | |||
| C: " to denote lines sent by the client to the server, and | prefixed with "// " are comments explaining the previous protocol line. | |||
| "S: " for lines sent by the server to the client. Lines p | These prefixes and comments are not part of the protocol | |||
| refixed with "// " are comments explaining the previous protocol line. | . Lines without any of these prefixes are continuations of the previous line, | |||
| These prefixes and comments are not part of the protocol. | and no line breaks are present in the protocol unless sp | |||
| Lines without any of these prefixes are continuations of the previous line, | ecifically mentioned.</t> | |||
| and no line break is present in the protocol unless speci | <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | |||
| fically mentioned.</t> | "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", | |||
| "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>", | ||||
| <t> | "<bcp14>SHOULD NOT</bcp14>", | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document | |||
| "OPTIONAL" in this document are to be interpreted as described in BC | are to be interpreted as described in BCP 14 | |||
| P | <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only | |||
| 14 <xref target="RFC2119"/> <xref target="RFC8174"/> | when, they appear in all capitals, as shown here.</t> | |||
| when, and only when, they appear in all capitals, as shown here. | <t>Other capitalized words are IMAP key words <xref target="RFC3501" | |||
| </t> | format="default"/> <xref target="RFC9051" format="default"/> | |||
| or key words from this document.</t> | ||||
| <!--///Confusion: IMAP keyword is something else. Use "Protocol elements" | </section> | |||
| instead?--> | <section anchor="imap-partial" numbered="true" toc="default"> | |||
| <t>Other capitalised words are IMAP keywords <xref target="RFC3501"/ | <name>The PARTIAL Extension</name> | |||
| ><xref target="RFC9051"/> | <t>An IMAP server advertises support for the PARTIAL extension | |||
| or keywords from this document.</t> | by including the "PARTIAL" capability in the CAPABILITY response / respo | |||
| nse code.</t> | ||||
| </section> | <section anchor="partial-def" numbered="true" toc="default"> | |||
| <name>Incremental SEARCH and Partial Results</name> | ||||
| <section title="The PARTIAL extension" anchor="imap-partial"> | <t> | |||
| <t>An IMAP server advertises support for the PARTIAL extension | ||||
| by including the "PARTIAL" capability in the CAPABILITY response/respons | ||||
| e code.</t> | ||||
| <section title="Incremental SEARCH and partial results" anchor="partial-de | ||||
| f"> | ||||
| <t> | ||||
| The PARTIAL SEARCH return option causes the server to provide in an | The PARTIAL SEARCH return option causes the server to provide in an | |||
| ESEARCH <xref target="RFC4731"/><xref target="RFC9051"/> response a subset of the results denoted by the sequence | ESEARCH response <xref target="RFC4731" format="default"/> <xref target="R FC9051" format="default"/> a subset of the results denoted by the sequence | |||
| range given as the mandatory argument. | range given as the mandatory argument. | |||
| The first result (message with the lowest matching UID) is 1; | The first result (message with the lowest matching Unique | |||
| Identifier (UID)) is 1; | ||||
| thus, the first 500 results would be obtained by a return option of | thus, the first 500 results would be obtained by a return option of | |||
| "PARTIAL 1:500", and the second 500 by "PARTIAL 501:1000". This | "PARTIAL 1:500" and the second 500 by "PARTIAL 501:1000". This | |||
| intentionally mirrors message sequence numbers. | intentionally mirrors message sequence numbers. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | It is also possible to direct the server to start the SEARCH from the late | |||
| It is also possible to direct the server to start SEARCH from the latest | st | |||
| matching (with the highest UID) message. This can be done by prepending "- " | matching (with the highest UID) message. This can be done by prepending "- " | |||
| to the index. For example -1 is the last message, -2 is next to the last a nd so on. | to the index. For example, -1 is the last message, -2 is next to the last, and so on. | |||
| Using this syntax helps server implementations to optimize their SEARCHes. | Using this syntax helps server implementations to optimize their SEARCHes. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | A single command <bcp14>MUST NOT</bcp14> contain more than one PARTIAL or | |||
| A single command MUST NOT contain more than one PARTIAL or ALL search | ALL search | |||
| return option -- that is, either one PARTIAL, one ALL, or neither | return option; that is, either one PARTIAL, one ALL, or neither | |||
| PARTIAL nor ALL is allowed. | PARTIAL nor ALL is allowed. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | For SEARCH results, the entire list of results <bcp14>MUST</bcp14> be orde | |||
| For SEARCH results, the entire result list MUST be ordered in mailbox | red in mailbox | |||
| order, that is, in UID or message sequence number order. | order -- that is, in UID or message sequence number order. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | In cases where a PARTIAL SEARCH return option references results that do n | |||
| Where a PARTIAL SEARCH return option references results that do not | ot | |||
| exist, by using a range which starts or ends higher (or lower<!--In case " | exist by using a range that starts or ends higher (or lower) than the curr | |||
| -N" syntax is used-->) than the current | ent | |||
| number of results, then the server returns the results that are in | number of results, the server returns the results that are in | |||
| the set. This yields a PARTIAL return data item that has, as | the set. This yields a PARTIAL return data item that has, as | |||
| payload, the original range and a potentially missing set of results | payload, the original range and a potentially missing set of results | |||
| that may be shorter than the extent of the range. | that may be shorter than the extent of the range. | |||
| If the whole range references results that do not exist, | If the whole range references results that do not exist, | |||
| a special value "NIL" is returned by the server instead of the sequence se t. | a special value "NIL" is returned by the server instead of the sequence se t. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| Clients need not request PARTIAL results in any particular order. | Clients need not request PARTIAL results in any particular order. | |||
| Because mailboxes may change, clients might wish to use PARTIAL | Because mailboxes may change, clients might wish to use PARTIAL | |||
| in combination with UPDATE (see <xref target="RFC5267"/>) if the server | in combination with UPDATE (see <xref target="RFC5267" format="default"/>) | |||
| also advertises CONTEXT=SEARCH capability, especially if the intent is to | if the server | |||
| walk a | also advertises the "CONTEXT=SEARCH" capability, especially if the intent | |||
| is to walk a | ||||
| large set of results; however, these return options do not interact | large set of results; however, these return options do not interact | |||
| -- the UPDATE will provide notifications for all matching results. | -- the UPDATE will provide notifications for all matching results. | |||
| </t> | </t> | |||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| <figure><artwork><![CDATA[ | ||||
| // Let's assume that the A01 SEARCH without PARTIAL would return | // Let's assume that the A01 SEARCH without PARTIAL would return | |||
| // 23764 results. | // 23764 results. | |||
| C: A01 UID SEARCH RETURN (PARTIAL -1:-100) UNDELETED | C: A01 UID SEARCH RETURN (PARTIAL -1:-100) UNDELETED | |||
| UNKEYWORD $Junk | UNKEYWORD $Junk | |||
| S: * ESEARCH (TAG "A01") UID PARTIAL (-1:-100 ...) | S: * ESEARCH (TAG "A01") UID PARTIAL (-1:-100 ...) | |||
| // 100 most recent results in set syntax elided. | // 100 most recent results in set syntax elided. | |||
| S: A01 OK Completed. | S: A01 OK Completed. | |||
| ]]></artwork></figure> | ]]></artwork> | |||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| <figure><artwork><![CDATA[ | ||||
| // Let's assume that the A02 SEARCH without PARTIAL would return | // Let's assume that the A02 SEARCH without PARTIAL would return | |||
| // 23764 results. | // 23764 results. | |||
| C: A02 UID SEARCH RETURN (PARTIAL 23500:24000) UNDELETED | C: A02 UID SEARCH RETURN (PARTIAL 23500:24000) UNDELETED | |||
| UNKEYWORD $Junk | UNKEYWORD $Junk | |||
| C: A03 UID SEARCH RETURN (PARTIAL 1:500) UNDELETED | C: A03 UID SEARCH RETURN (PARTIAL 1:500) UNDELETED | |||
| UNKEYWORD $Junk | UNKEYWORD $Junk | |||
| C: A04 UID SEARCH RETURN (PARTIAL 24000:24500) UNDELETED | C: A04 UID SEARCH RETURN (PARTIAL 24000:24500) UNDELETED | |||
| UNKEYWORD $Junk | UNKEYWORD $Junk | |||
| S: * ESEARCH (TAG "A02") UID PARTIAL (23500:24000 ...) | S: * ESEARCH (TAG "A02") UID PARTIAL (23500:24000 ...) | |||
| // 264 results in set syntax elided, | // 264 results in set syntax elided; | |||
| // this spans the end of the results. | // this spans the end of the results. | |||
| S: A02 OK Completed. | S: A02 OK Completed. | |||
| S: * ESEARCH (TAG "A03") UID PARTIAL (1:500 ...) | S: * ESEARCH (TAG "A03") UID PARTIAL (1:500 ...) | |||
| // 500 results in set syntax elided. | // 500 results in set syntax elided. | |||
| S: A03 OK Completed. | S: A03 OK Completed. | |||
| S: * ESEARCH (TAG "A04") UID PARTIAL (24000:24500 NIL) | S: * ESEARCH (TAG "A04") UID PARTIAL (24000:24500 NIL) | |||
| // No results are present, this is beyond the end of the results. | // No results are present; this is beyond the end of the results. | |||
| S: A04 OK Completed. | S: A04 OK Completed. | |||
| ]]></artwork></figure> | ]]></artwork> | |||
| </section> | ||||
| </section> | <section numbered="true" toc="default"> | |||
| <name>Interaction between PARTIAL, MIN, MAX, and SAVE SEARCH Return Opti | ||||
| <section title="Interaction between PARTIAL, MIN, MAX and SAVE SEARCH re | ons</name> | |||
| turn options"> | <t>This section only applies if the server advertises the "PARTIAL" IMAP | |||
| capability or "CONTEXT=SEARCH" <xref target="RFC5267" format="default"/>, | ||||
| <t>This section only applies if the server advertises PARTIAL IMAP capabil | together with "ESEARCH" <xref target="RFC4731" format="default"/> and/or I | |||
| ity or CONTEXT=SEARCH <xref target="RFC5267"/>, | MAP4rev2 <xref target="RFC9051" format="default"/>.</t> | |||
| together with ESEARCH <xref target="RFC4731"/> and/or IMAP4rev2 <xref targ | <t> | |||
| et="RFC9051"/>.</t> | ||||
| <t> | ||||
| The SAVE result option doesn't change whether the server would return | The SAVE result option doesn't change whether the server would return | |||
| items corresponding to PARTIAL SEARCH result options. | items corresponding to PARTIAL SEARCH result options. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | As specified in <xref target="partial-def" format="default"/>, it is an er | |||
| As specified in <xref target="partial-def"/>, it is an error to specify bo | ror to specify both the | |||
| th | ||||
| PARTIAL and ALL result options in the same SEARCH command. | PARTIAL and ALL result options in the same SEARCH command. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| When the SAVE result option is combined with the PARTIAL | When the SAVE result option is combined with the PARTIAL | |||
| result option, and none of MIN/MAX/COUNT result options is | result option and none of the MIN/MAX/COUNT result options are | |||
| present, the corresponding PARTIAL is returned, | present, the corresponding PARTIAL is returned, | |||
| and the "$" marker would contain <!--references to-->all | and the "$" marker would contain references to all | |||
| messages returned by the PARTIAL result option. | messages returned by the PARTIAL result option. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | When the SAVE and PARTIAL result options are combined with the MIN or MAX | |||
| When the SAVE and PARTIAL result options are combined with the MIN or the | result option and the COUNT result option is | |||
| MAX | absent, the corresponding PARTIAL result and MIN/MAX are returned (if the | |||
| result option, and the COUNT result option is | SEARCH result | |||
| absent, the corresponding PARTIAL result and MIN/MAX is returned (if the s | is not empty), and the "$" marker would contain references to all | |||
| earch result | ||||
| is not empty), and the "$" marker would contain <!--references to-->all | ||||
| messages returned by the PARTIAL result option together with the correspon ding MIN/MAX message. | messages returned by the PARTIAL result option together with the correspon ding MIN/MAX message. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | If the SAVE and PARTIAL result options are combined with both the MIN and | |||
| If the SAVE and PARTIAL result options are combined with both MIN and MAX | MAX result | |||
| result | options and the COUNT result option is absent, | |||
| options, and the COUNT result options is absent, | the PARTIAL, MIN, and MAX result options are returned (if the SEARCH resul | |||
| the PARTIAL, MIN and MAX are returned (if the search result is not empty), | t is not empty), | |||
| and the "$" marker would contain <!--references to-->all | and the "$" marker would contain references to all | |||
| messages returned by the PARTIAL result option together with the MIN and t | messages returned by the PARTIAL result option together with the MIN and M | |||
| he MAX messages. | AX messages. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | ||||
| If the SAVE and PARTIAL result options are combined with the COUNT | If the SAVE and PARTIAL result options are combined with the COUNT | |||
| result option, the PARTIAL and COUNT are returned, | result option, the PARTIAL and COUNT result options are returned, | |||
| and the "$" marker would always contain all messages | and the "$" marker would always contain references to all messages | |||
| found by the SEARCH or UID SEARCH command. | found by the SEARCH or UID SEARCH command. | |||
| </t> | </t> | |||
| <t keepWithNext="true"> | ||||
| <texttable> | <xref target="tab1"/> summarizes additional requirements for ESEARCH | |||
| <preamble> | ||||
| The following table summarizes the additional requirement on ESEARCH | ||||
| server implementations described in this section. | server implementations described in this section. | |||
| </preamble> | </t> | |||
| <t> | ||||
| <ttcol align='center'>Combination of Result option</ttcol> | Note regarding <xref target="tab1"/>: "[m]" means optional "MIN" and/o | |||
| <ttcol align='center'>"$" marker value</ttcol> | r "MAX". | |||
| </t> | ||||
| <c>SAVE PARTIAL</c> | ||||
| <c>PARTIAL</c> | ||||
| <c>SAVE PARTIAL MIN</c> | ||||
| <c>PARTIAL & MIN</c> | ||||
| <c>SAVE PARTIAL MAX</c> | ||||
| <c>PARTIAL & MAX</c> | ||||
| <c>SAVE PARTIAL MIN MAX</c> | ||||
| <c>PARTIAL & MIN & MAX</c> | ||||
| <c>SAVE PARTIAL COUNT [m]</c> | ||||
| <c>all found messages</c> | ||||
| <postamble> | ||||
| Note for the table: '[m]' means optional "MIN" and/or "MAX" | ||||
| </postamble> | ||||
| </texttable> | ||||
| </section> | ||||
| <section title="Extension to UID FETCH"> | ||||
| <t>The PARTIAL extension also extends the UID FETCH command with a PARTIAL | <table anchor="tab1" align="center"> | |||
| FETCH modifier. | <thead> | |||
| <tr> | ||||
| <th align="center">Combination of Result Options</th> | ||||
| <th align="center">"$" Marker Value</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td align="center">SAVE PARTIAL</td> | ||||
| <td align="center">PARTIAL</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">SAVE PARTIAL MIN</td> | ||||
| <td align="center">PARTIAL & MIN</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">SAVE PARTIAL MAX</td> | ||||
| <td align="center">PARTIAL & MAX</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">SAVE PARTIAL MIN MAX</td> | ||||
| <td align="center">PARTIAL & MIN & MAX</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">SAVE PARTIAL COUNT [m]</td> | ||||
| <td align="center">all found messages</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| </section> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>Extension to UID FETCH</name> | ||||
| <t>The PARTIAL extension also extends the UID FETCH command with a PARTI | ||||
| AL FETCH modifier. | ||||
| The PARTIAL FETCH modifier has the same syntax as the PARTIAL SEARCH resul t option. | The PARTIAL FETCH modifier has the same syntax as the PARTIAL SEARCH resul t option. | |||
| Presence of the PARTIAL FETCH modifier instructs the server to only return | The presence of the PARTIAL FETCH modifier instructs the server to only re | |||
| FETCH results | turn FETCH results | |||
| for messages in the specified range. It is useful when the sequence-set (f | for messages in the specified range. It is useful when the sequence-set (f | |||
| irst) parameter to | irst) parameter in | |||
| the UID FETCH command includes unknown number of messages.</t> | the UID FETCH command includes an unknown number of messages.</t> | |||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| <figure><artwork><![CDATA[ | ||||
| // Returning information for the last 3 messages in the UID range | // Returning information for the last 3 messages in the UID range | |||
| C: 10 UID FETCH 25900:26600 (UID FLAGS) (PARTIAL -1:-3) | C: 10 UID FETCH 25900:26600 (UID FLAGS) (PARTIAL -1:-3) | |||
| S: * 12888 FETCH (FLAGS (\Seen) UID 25996) | S: * 12888 FETCH (FLAGS (\Seen) UID 25996) | |||
| S: * 12889 FETCH (FLAGS (\Flagged \Answered) UID 25997) | S: * 12889 FETCH (FLAGS (\Flagged \Answered) UID 25997) | |||
| S: * 12890 FETCH (FLAGS () UID 26600) | S: * 12890 FETCH (FLAGS () UID 26600) | |||
| S: 10 OK FETCH completed | S: 10 OK FETCH completed | |||
| ]]></artwork></figure> | ]]></artwork> | |||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| <figure><artwork><![CDATA[ | ||||
| // Returning information for the first 5 messages in the UID range | // Returning information for the first 5 messages in the UID range | |||
| C: 11 UID FETCH 25900:26600 (UID FLAGS) (PARTIAL 1:5) | C: 11 UID FETCH 25900:26600 (UID FLAGS) (PARTIAL 1:5) | |||
| S: * 12591 FETCH (FLAGS (\Seen) UID 25900) | S: * 12591 FETCH (FLAGS (\Seen) UID 25900) | |||
| S: * 12592 FETCH (FLAGS (\Flagged) UID 25902) | S: * 12592 FETCH (FLAGS (\Flagged) UID 25902) | |||
| S: * 12593 FETCH (FLAGS (\Answered) UID 26310) | S: * 12593 FETCH (FLAGS (\Answered) UID 26310) | |||
| S: * 12594 FETCH (FLAGS () UID 26311) | S: * 12594 FETCH (FLAGS () UID 26311) | |||
| S: * 12595 FETCH (FLAGS (\Answered) UID 26498) | S: * 12595 FETCH (FLAGS (\Answered) UID 26498) | |||
| S: 11 OK FETCH completed | S: 11 OK FETCH completed | |||
| ]]></artwork></figure> | ]]></artwork> | |||
| </section> | ||||
| </section> | <section numbered="true" toc="default"> | |||
| <name>Use of "PARTIAL" and "CONDSTORE" IMAP Extensio | ||||
| <section title="Use of PARTIAL and CONDSTORE IMAP extensions together"> | ns Together</name> | |||
| <t>This section is informative.</t> | ||||
| <t>This section is informative.</t> | <t>The PARTIAL FETCH modifier can be combined with the CHANGEDSINCE FETC | |||
| H modifier <xref target="RFC7162"/>.</t> | ||||
| <t>The PARTIAL FETCH modifier can be combined with the CHANGEDSINCE | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
| FETCH modifier.</t> | ||||
| <figure><artwork><![CDATA[ | ||||
| // Returning information for the last 30 messages in the UID range | // Returning information for the last 30 messages in the UID range | |||
| // that have any flag/keyword modified since modseq 98305 | // that have any flags/keywords modified since MODSEQ 98305 | |||
| C: 101 UID FETCH 25900:26600 (UID FLAGS) (PARTIAL -1:-30 CHANGEDSINCE 98305) | C: 101 UID FETCH 25900:26600 (UID FLAGS | |||
| S: * 12888 FETCH (FLAGS (\Flagged \Answered) MODSEQ (98306) UID 25997) | ) (PARTIAL -1:-30 CHANGEDSINCE 98305) | |||
| S: * 12888 FETCH (FLAGS (\Flagged \Answered | ||||
| ) MODSEQ (98306) UID 25997) | ||||
| S: * 12890 FETCH (FLAGS () MODSEQ (98312) UID 26600) | S: * 12890 FETCH (FLAGS () MODSEQ (98312) UID 26600) | |||
| S: 101 OK FETCH completed | S: 101 OK FETCH completed | |||
| ]]></artwork></figure> | ]]></artwork> | |||
| <t>The above example causes the server to first select the last 30 m | <t>The above example causes the server to first select the last 30 messa | |||
| essages | ges | |||
| and then only return flag changes for subset of these messages which | and then only return flag changes for a subset of those messages tha | |||
| t | ||||
| have MODSEQ higher than 98305.</t> | have MODSEQ higher than 98305.</t> | |||
| <t>Note that the order of PARTIAL and CHANGEDSINCE FETCH modifiers in th | ||||
| <t>Note that the order of PARTIAL and CHANGEDSINCE FETCH modifiers i | e UID FETCH command | |||
| n the UID FETCH command | is not important, i.e., the above example can also use the | |||
| is not important, i.e. the above example can also use | ||||
| "UID FETCH 25900:26600 (UID FLAGS) (CHANGEDSINCE 98305 PARTIAL -1:-3 0)" | "UID FETCH 25900:26600 (UID FLAGS) (CHANGEDSINCE 98305 PARTIAL -1:-3 0)" | |||
| command and it would result in the same responses.</t> | command and it would result in the same responses.</t> | |||
| </section> | ||||
| </section> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <name>Formal Syntax</name> | ||||
| <t>The following syntax specification uses the Augmented Backus-Naur Form | ||||
| (ABNF) notation as specified in <xref target="RFC5234" format="default"/>.</t> | ||||
| <t>Non-terminals referenced but not defined below are as defined by <xref | ||||
| target="RFC3501" format="default">IMAP4rev1</xref> or <xref target="RFC9051" for | ||||
| mat="default">IMAP4rev2</xref>.</t> | ||||
| <t>Except as noted otherwise, all alphabetic characters are case insensiti | ||||
| ve. | ||||
| The use of uppercase or lowercase characters to define token strings is fo | ||||
| r editorial clarity only. | ||||
| Implementations <bcp14>MUST</bcp14> accept these strings in a case-insensi | ||||
| tive fashion.</t> | ||||
| <section title="Formal syntax"> | <sourcecode type="abnf"><![CDATA[ | |||
| <t>The following syntax specification uses the Augmented | ||||
| Backus-Naur Form (ABNF) notation as specified in <xref target="ABNF"/>.</t> | ||||
| <t>Non-terminals referenced but not defined below are as | ||||
| defined by <xref target="RFC3501">IMAP4rev1</xref> or <xref target="RFC9051">IMA | ||||
| P4rev2</xref>.</t> | ||||
| <t>Except as noted otherwise, all alphabetic characters a | ||||
| re case-insensitive. | ||||
| The use of upper or lower case characters to define token strings is for e | ||||
| ditorial clarity only. | ||||
| Implementations MUST accept these strings in a case-insensitive fashion.</ | ||||
| t> | ||||
| <figure><artwork> | ||||
| <![CDATA[ | ||||
| SP = <Defined in RFC 5234> | SP = <Defined in RFC 5234> | |||
| MINUS = "-" | MINUS = "-" | |||
| capability =/ "PARTIAL" | capability =/ "PARTIAL" | |||
| ;; <capability> from [RFC3501] | ;; <capability> from [RFC3501]. | |||
| modifier-partial = "PARTIAL" SP partial-range | modifier-partial = "PARTIAL" SP partial-range | |||
| partial-range-first = nz-number ":" nz-number | partial-range-first = nz-number ":" nz-number | |||
| ;; Request to search from oldest (lowest UIDs) to | ;; Request to search from oldest (lowest UIDs) to | |||
| ;; more recent messages. | ;; more recent messages. | |||
| ;; A range 500:400 is the same as 400:500. | ;; A range 500:400 is the same as 400:500. | |||
| ;; This is similar to <seq-range> from [RFC3501], | ;; This is similar to <seq-range> from [RFC3501] | |||
| ;; but cannot contain "*". | ;; but cannot contain "*". | |||
| partial-range-last = MINUS nz-number ":" MINUS nz-number | partial-range-last = MINUS nz-number ":" MINUS nz-number | |||
| ;; Request to search from newest (highest UIDs) to | ;; Request to search from newest (highest UIDs) to | |||
| ;; oldest messages. | ;; oldest messages. | |||
| ;; A range -500:-400 is the same as -400:-500. | ;; A range -500:-400 is the same as -400:-500. | |||
| partial-range = partial-range-first / partial-range-last | partial-range = partial-range-first / partial-range-last | |||
| search-return-opt =/ modifier-partial | search-return-opt =/ modifier-partial | |||
| ;; All conform to <search-return-opt>, from [IMAP-ABNF]/[RFC9051] | ;; All conform to <search-return-opt> from | |||
| ;; [RFC4466] and [RFC9051]. | ||||
| search-return-data =/ ret-data-partial | search-return-data =/ ret-data-partial | |||
| ret-data-partial = "PARTIAL" | ret-data-partial = "PARTIAL" | |||
| SP "(" partial-range SP partial-results ")" | SP "(" partial-range SP partial-results ")" | |||
| ;; <partial-range> is the requested range. | ;; <partial-range> is the requested range. | |||
| partial-results = sequence-set / "NIL" | partial-results = sequence-set / "NIL" | |||
| ;; <sequence-set> from [RFC3501]. | ;; <sequence-set> from [RFC3501]. | |||
| ;; NIL indicates no results correspond to the requested range. | ;; NIL indicates that no results correspond to | |||
| ;; the requested range. | ||||
| tagged-ext-simple =/ partial-range-last | tagged-ext-simple =/ partial-range-last | |||
| fetch-modifier =/ modifier-partial | fetch-modifier =/ modifier-partial | |||
| ]]></artwork></figure> | ;; <fetch-modifier> from [RFC4466]. | |||
| ]]></sourcecode> | ||||
| </section> | ||||
| <section title="Security Considerations"> | ||||
| </section> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>Security Considerations</name> | ||||
| <t> | <t> | |||
| This document defines an additional IMAP4 capability. As such, it | This document defines an additional IMAP4 capability. As such, it | |||
| does not change the underlying security considerations of <xref target="RF | does not change the underlying security considerations of IMAP4rev1 | |||
| C3501"/> and IMAP4rev2 <xref target="RFC9051"/>. | <xref target="RFC3501" format="default"/> and IMAP4rev2 <xref target="RFC9051" f | |||
| ormat="default"/>. | ||||
| The authors and reviewers believe that no new security issues are | The authors and reviewers believe that no new security issues are | |||
| introduced with these additional IMAP4 capabilities. | introduced with these additional IMAP4 capabilities. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| This document defines an optimization that can both reduce the amount of w | This document defines an optimization that can reduce both the amount of w | |||
| ork | ork | |||
| performed by the server, as well at the amount of data returned to the cli | performed by the server and the amount of data returned to the client. | |||
| ent. | ||||
| Use of this extension is likely to cause the server and the client to use less memory | Use of this extension is likely to cause the server and the client to use less memory | |||
| than when the extension is not used. However, as this is going | than when the extension is not used. However, as this is going | |||
| to be new code in both the client and the server, rigorous testing of such code | to be new code in both the client and the server, rigorous testing of such code | |||
| is required in order to avoid introducing of new implementation bugs. | is required in order to avoid introducing new implementation bugs. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="IANA Considerations"> | <name>IANA Considerations</name> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Changes/additions to the IMAP4 capabilities registry"> | <name>Changes/Additions to the IMAP Capabilities Registry</name> | |||
| <t> | ||||
| <t> | IMAP4 capabilities are registered by publishing | |||
| IMAP4 capabilities are registered by publishing a | a Standards Track or | |||
| standards track or | IESG-approved Informational or Experimental RFC. | |||
| IESG approved Informational or Experimental RFC. | The registry is currently located at | |||
| The registry is currently located at: | <eref target="https://www.iana.org/assignments/imap-capabilities" brackets="a | |||
| </t> | ngle"/>. | |||
| </t> | ||||
| <figure><artwork><![CDATA[ | <t>IANA has added the PARTIAL extension to the "IMAP Capabilities" regis | |||
| https://www.iana.org/assignments/imap4-capabilities | try | |||
| ]]></artwork></figure> | with RFC 9394 as the reference. | |||
| </t> | ||||
| <t>IANA is requested to add definition of the PARTIAL ext | ||||
| ension | ||||
| with RFC XXXX as the reference. | ||||
| </t> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| </middle> | ||||
| <back> | ||||
| <section title="Acknowledgments"> | <displayreference target="RFC5234" to="ABNF"/> | |||
| <t>This document was motivated by Yahoo! team and their questions | ||||
| about best client practices for dealing with large mailboxes.</t> | ||||
| <t> | ||||
| Editor of this document would like to thank the following | ||||
| people | ||||
| who provided useful comments or participated in discussio | ||||
| ns of | ||||
| this document: Timo Sirainen and Barry Leiba. | ||||
| </t> | ||||
| <t>This document uses lots of text from RFC 5267. Thus work of | ||||
| the RFC 5267 authors Dave Cridland and Curtis King is appreciated. | ||||
| </t> | ||||
| </section> | ||||
| </middle> | ||||
| <back> | ||||
| <references title="Normative References"> | ||||
| &rfc2119; | ||||
| &rfc8174; | ||||
| &rfc3501; | ||||
| &rfc4731; | ||||
| &rfc5267; | ||||
| <reference anchor="ABNF"> | ||||
| <front> | ||||
| <title>Augmented BNF for Syntax Specifica | ||||
| tions: ABNF</title> | ||||
| <author initials="D" surname="Crocker" fu | ||||
| llname="Dave Crocker" role="editor"> | ||||
| <organization /> | ||||
| </author> | ||||
| <author initials="P" surname="Overell" fu | ||||
| llname="Paul Overell" role="editor"> | ||||
| <organization /> | ||||
| </author> | ||||
| <date year="2008" month="January"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="5234" /> | ||||
| <format type="TXT" target="https://www.rfc-editor | ||||
| .org/info/rfc5234" /> | ||||
| </reference> | ||||
| &rfc9051; | <references> | |||
| <name>References</name> | ||||
| <references> | ||||
| <name>Normative References</name> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.211 | ||||
| 9.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.817 | ||||
| 4.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.350 | ||||
| 1.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.446 | ||||
| 6.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.473 | ||||
| 1.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.526 | ||||
| 7.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.523 | ||||
| 4.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.905 | ||||
| 1.xml"/> | ||||
| </references> | </references> | |||
| <references> | ||||
| <!-- | <name>Informative References</name> | |||
| <references title="Informative References"> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.716 | |||
| 2.xml"/> | ||||
| </references> | </references> | |||
| --> | </references> | |||
| </back> | <section numbered="false" toc="default"> | |||
| <name>Acknowledgments</name> | ||||
| <t>This document was motivated by the Yahoo! team and their questions | ||||
| about best client practices for dealing with large mailboxes.</t> | ||||
| <t> | ||||
| The authors of this document would like to thank the fol | ||||
| lowing people, | ||||
| who provided useful comments or participated in discussi | ||||
| ons of | ||||
| this document: <contact fullname="Timo Sirainen"/> and <contact fullname=" | ||||
| Barry Leiba"/>. | ||||
| </t> | ||||
| <t>This document uses a lot of text from RFC 5267. Thus, the work of | ||||
| the RFC 5267 authors -- <contact fullname="Dave Cridland"/> and <contact f | ||||
| ullname="Curtis King"/> -- is appreciated. | ||||
| </t> | ||||
| </section> | ||||
| </back> | ||||
| </rfc> | </rfc> | |||
| End of changes. 73 change blocks. | ||||
| 388 lines changed or deleted | 342 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. | ||||