<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-gougeon-imap-webpush-03" category="info" submissionType="independent" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.1 -->
  <front>
    <title>The IMAP WEBPUSH extension</title>
    <seriesInfo name="Internet-Draft" value="draft-gougeon-imap-webpush-03"/>
    <author fullname="Simon Gougeon">
      <organization/>
      <address>
        <email>ietf@sgougeon.fr</email>
      </address>
    </author>
    <date year="2025" month="August" day="29"/>
    <abstract>
      <?line 56?>

<t>This document defines a WEBPUSH extension of the Internet Message Access Protocol (IMAP) that permits IMAP servers to send WebPush notifications.</t>
    </abstract>
  </front>
  <middle>
    <?line 60?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>WebPush (defined by <xref target="RFC8030"/>, <xref target="RFC8291"/> and <xref target="RFC8292"/>) defines a way for applications to deliver real-time events in a timely fashion, with push notifications. Push notifications allows consolidating all real-time events into a single session which ensures more efficient use of network and radio resources. They are particularly used in mobile environments. Push notifications may also be used for other use cases, for example during the migration to a new server, the new server may subscribe to the old server to be notified when an event is recorded.</t>
      <t>Many use cases have led to a need for real-time events with email. IMAP support for real-time events has been added with the IDLE command (<xref target="RFC2177"/>, <xref target="RFC9051"/>) and the NOTIFY extension (<xref target="RFC5465"/>). These commands require using a persistent connection per account and contribute to unnecessary use of the device radio.</t>
      <t>JMAP (<xref target="RFC8620"/>) has responded to this need by supporting WebPush from the beginning.</t>
      <t>Therefore, this extension permits IMAP servers to send WebPush notifications.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>In examples, "C:" and "S:" indicate lines sent by the client and server, respectively. Lines ending in "\" are interrupted for presentation reasons, they would actually be joined to the next line. Note that each other line includes the terminating CRLF.</t>
      <t>User agent, is defined in <xref target="RFC8030"/> as a device and software that is the recipient of push messages. It describes here the mail client.</t>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="overview">
      <name>Overview</name>
      <t>This extension adds 5 commands: GETVAPID, WEBPUSH, ACKWEBPUSH, LWEBPUSH and SILWEBPUSH. GETVAPID allows to get the server VAPID public key, WEBPUSH to subscribe a new push subscription, ACKWEBPUSH to confirm the subscription information is correct, LWEBPUSH to list current subscriptions and SILWEBPUSH to silence a subscription for a given time.</t>
      <t>Each time the IMAP server records a subscribed event, it sends a push message to the registered push endpoints. The notification overflow event enables IMAP servers to implement a generic push notification.</t>
    </section>
    <section anchor="capability-identification">
      <name>CAPABILITY Identification</name>
      <t>IMAP servers that support this extension <bcp14>MUST</bcp14> include "WEBPUSHdraft1" in the CAPABILITY command response. This will be "WEBPUSH" once the extension is officially published.</t>
    </section>
    <section anchor="client-commands">
      <name>Client Commands</name>
      <section anchor="getvapid-command">
        <name>GETVAPID Command</name>
        <t>This command is only available in authenticated or selected state.</t>
        <dl>
          <dt>Arguments:</dt>
          <dd>
            <t>none</t>
          </dd>
          <dt>Responses:</dt>
          <dd>
            <dl>
              <dt><bcp14>REQUIRED</bcp14> untagged response:</dt>
              <dd>
                <t>VAPID</t>
              </dd>
            </dl>
          </dd>
          <dt>Result:</dt>
          <dd>
            <dl>
              <dt>OK -</dt>
              <dd>
                <t>capability completed</t>
              </dd>
            </dl>
          </dd>
          <dt/>
          <dd>
            <dl>
              <dt>BAD -</dt>
              <dd>
                <t>arguments invalid</t>
              </dd>
            </dl>
          </dd>
        </dl>
        <t>The GETVAPID command requests the VAPID public key (<xref target="RFC8292"/>) of the server. the server <bcp14>MUST</bcp14> send a single untagged VAPID response before the tagged OK response. This is used by clients to request a push endpoint on their push server restricted to this mail server.</t>
        <t>Example:</t>
        <artwork><![CDATA[
C: a1 GETVAPID
S: * VAPID \
    BOniQ9xHBPNY9gnQW4o-16vHqOb40pEIMifyUdFsxAgy\
    zVkFMguxw0QrdbZcq8hRjN2zpeInRvKVPlkzABvuTnI
S: a1 OK GETVAPID completed
]]></artwork>
      </section>
      <section anchor="webpush-command">
        <name>WEBPUSH Command</name>
        <t>This command is only available in authenticated or selected state.</t>
        <dl>
          <dt>Arguments (create/update):</dt>
          <dd>
            <t>subscription ID</t>
          </dd>
          <dt/>
          <dd>
            <t>subscription name</t>
          </dd>
          <dt/>
          <dd>
            <t>push endpoint</t>
          </dd>
          <dt/>
          <dd>
            <t>ECDH public key</t>
          </dd>
          <dt/>
          <dd>
            <t>authentication secret</t>
          </dd>
          <dt/>
          <dd>
            <t>filter</t>
          </dd>
          <dt>Arguments (delete):</dt>
          <dd>
            <t>subscription ID</t>
          </dd>
          <dt/>
          <dd>
            <t>NIL</t>
          </dd>
          <dt>Responses (inactive subscription):</dt>
          <dd>
            <dl>
              <dt>untagged response:</dt>
              <dd>
                <t>WEBPUSH</t>
              </dd>
              <dt/>
              <dd>
                <t>VAPID</t>
              </dd>
            </dl>
          </dd>
          <dt>Responses (active subscription):</dt>
          <dd>
            <dl>
              <dt><bcp14>OPTIONAL</bcp14> untagged response:</dt>
              <dd>
                <t>WEBPUSH</t>
              </dd>
              <dt/>
              <dd>
                <t>VAPID</t>
              </dd>
            </dl>
          </dd>
          <dt>Result:</dt>
          <dd>
            <dl>
              <dt>OK -</dt>
              <dd>
                <t>creation or deletion completed</t>
              </dd>
            </dl>
          </dd>
          <dt/>
          <dd>
            <dl>
              <dt>NO -</dt>
              <dd>
                <t>creation failure: can't create webpush subscription with these arguments</t>
              </dd>
            </dl>
          </dd>
          <dt/>
          <dd>
            <dl>
              <dt>BAD -</dt>
              <dd>
                <t>command unknown or arguments invalid</t>
              </dd>
            </dl>
          </dd>
        </dl>
        <t>The WEBPUSH command creates, updates or delete a push subscription for the account. New subscriptions and updated subscriptions (with a new endpoint, a new public key or a new authentication secret) aren't active until the subscription is confirmed with the ACKWEBPUSH command.</t>
        <t>The subscription ID is unique per account and identifies the push subscription. Sending a WEBPUSH command with an existing subscription ID updates the current subscription. Sending a WEBPUSH command with an existing subscription ID following by NIL deletes the subscription.</t>
        <t>The subscription name is not unique per account, it may be used to know to which client a subscription belong.</t>
        <t>If the client tries to delete a subscription with an unknown subscription ID, the server returns a tagged OK response.</t>
        <t>If the subscription is inactive or is deactivated by the command, the server <bcp14>MUST</bcp14> return a single untagged WEBPUSH response before the tagged OK response and <bcp14>MUST</bcp14> return a single untagged VAPID response before the tagged OK response. The VAPID response can be used by the client to check if the server has rotated its VAPID keys.</t>
        <t>If the subscription is still active after the command, the server <bcp14>MAY</bcp14> return a single untagged WEBPUSH response and <bcp14>MAY</bcp14> return a single untagged VAPID response before the tagged OK response.</t>
        <t>If the subscription was activated (i.e. created and then confirmed/acknowledged) with a VAPID key that is not the current VAPID key (due to a key rotation), then subscription <bcp14>MUST</bcp14> be deactivated by this command, and a confirm/acknowledgement is required to activate the subscription again.</t>
        <t>If the updated or created subscription is inactive after the command (this is a new subscription, at least one field is different or the VAPID key has been rotated), the server <bcp14>MUST</bcp14> send a push notification with a AckSubscription event, encrypted with the new public key, to the new endpoint. The client will have to send a ACKWEBPUSH command to (re-)activate the subscription. The client knows if the subscription is deactivated thanks to the untagged WEBPUSH response.</t>
        <t>The push endpoint <bcp14>MUST</bcp14> be the URI that the mail server sends push messages to. This is defined as the URI for push resource in <xref target="RFC8030"/>. This URI <bcp14>MUST</bcp14> use the "https" scheme.</t>
        <t>The ECDH public key is the user agent public key on the P-256 curve. It <bcp14>MUST</bcp14> be encoded in the uncompressed form <xref target="SEC_1"/> (section 2.3.3, replicated from X9.62), and base64url encoded as described in <xref target="RFC7515"/>. This is used to encrypt push notifications following <xref target="RFC8291"/>.</t>
        <t>The authentication secret is 16 random bytes. It <bcp14>MUST</bcp14> be base64url encoded as described in <xref target="RFC7515"/>. This is used to encrypt push notifications following <xref target="RFC8291"/>.</t>
        <t>The filter follows the syntax defined in <xref target="RFC5465"/>. It contains the mailboxes to be watched and the events about which to notify the client. Supported events are listed in the dedicated section (<xref target="supported-events"/>). SELECTED and SELECTED-DELAYED mailbox specifier can be used indifferently, they both refer to the selected mailbox without any difference. Supported attributes for new messages may be specified as follow the NOTIFY, SEARCH and SORT commands.</t>
        <t>The client <bcp14>SHOULD</bcp14> reregister their push subscription from time to time, like every time the client starts, in order to restore subscriptions, in case the endpoint was removed. Subscription may be removed if the push server has been in an inconsistent state, or if the mail server has been restored from a backup.</t>
        <t>The capabilities that were enabled using the ENABLE command at the time of the WEBPUSH command are associated with the subscription. When sending push messages, the untagged messages are formatted according to those capabilities. For example, enabling IMAP4rev2 or UTF8=ACCEPT cause mailboxes to be in UTF-8, and enabling CONDSTORE causes MODSEQ to be added to some events.</t>
        <t>SEARCH and SORTS command sent after a WEBPUSH request do not modify any push subscription.</t>
        <t>Example:</t>
        <artwork><![CDATA[
C: a1 LWEBPUSH *
S: a1 OK LWEBPUSH completed
C: a2 WEBPUSH a8282bf9-6102-4e1b-bb61-d26d0e532e65 \
    my-mobile-client \
    https://push.example.net/push/random1 \
    BCVxsr7N_eNgVRqvHtD0zTZsEc6-VV-JvLexhqUzORcxaOzi6-AYWXvTBHm4bj\
    yPjs7Vd8pZGH6SRpkNtoIAiw4 \
    BTBZMqHH6r4Tts7J_aSIgg \
    (personal (Messagenew messageExpunge))
S: * VAPID BOniQ9xHBPNY9gnQW4o-16vHqOb40pEIMifyUdFsxAgy\
    zVkFMguxw0QrdbZcq8hRjN2zpeInRvKVPlkzABvuTnI
S: * WEBPUSH a8282bf9-6102-4e1b-bb61-d26d0e532e65 \
    my-mobile-client NIL
S: a2 OK WEBPUSH completed
C: a3 WEBPUSH a8282bf9-6102-4e1b-bb61-d26d0e532e65 \
    my-mobile-client \
    https://push.example.net/push/JzLQ3raZJfFBR0aqvOMsLrt54w4rJUsV \
    BCVxsr7N_eNgVRqvHtD0zTZsEc6-VV-JvLexhqUzORcxaOzi6-AYWXvTBHm4bj\
    yPjs7Vd8pZGH6SRpkNtoIAiw4 \
    BTBZMqHH6r4Tts7J_aSIgg \
    (personal (Messagenew messageExpunge))
S: * VAPID BOniQ9xHBPNY9gnQW4o-16vHqOb40pEIMifyUdFsxAgy\
    zVkFMguxw0QrdbZcq8hRjN2zpeInRvKVPlkzABvuTnI
S: * WEBPUSH a8282bf9-6102-4e1b-bb61-d26d0e532e65 \
    my-mobile-client NIL
S: a3 OK WEBPUSH completed
C: a4 LWEBPUSH *
S: * WEBPUSH a8282bf9-6102-4e1b-bb61-d26d0e532e65 \
    my-mobile-client NIL
S: a4 OK LWEBPUSH completed
C: a5 WEBPUSH a8282bf9-6102-4e1b-bb61-d26d0e532e65 NIL
S: a5 OK WEBPUSH completed
C: a6 LWEBPUSH *
S: a6 OK LWEBPUSH completed
]]></artwork>
      </section>
      <section anchor="ackwebpush-command">
        <name>ACKWEBPUSH Command</name>
        <t>This command is only available in authenticated or selected state.</t>
        <dl>
          <dt>Arguments:</dt>
          <dd>
            <t>acknowledgement token, sendi by the server with a push message containing an AckSubscription event</t>
          </dd>
          <dt>Responses:</dt>
          <dd>
            <dl>
              <dt>untagged response:</dt>
              <dd>
                <t>WEBPUSH</t>
              </dd>
            </dl>
          </dd>
          <dt>Result:</dt>
          <dd>
            <dl>
              <dt>OK -</dt>
              <dd>
                <t>The subscription is activated</t>
              </dd>
            </dl>
          </dd>
          <dt/>
          <dd>
            <dl>
              <dt>NO -</dt>
              <dd>
                <t>The token doesn't exist or is expired</t>
              </dd>
            </dl>
          </dd>
          <dt/>
          <dd>
            <dl>
              <dt>BAD -</dt>
              <dd>
                <t>arguments invalid</t>
              </dd>
            </dl>
          </dd>
        </dl>
        <t>Example to activate a subscription with a valid token:</t>
        <artwork><![CDATA[
C: a1 LWEBPUSH *
S: * WEBPUSH a8282bf9-6102-4e1b-bb61-d26d0e532e65 \
    my-mobile-client NIL
S: a1 OK LWEBPUSH completed
C: a2 ACKWEBPUSH 585078c5-fb8b-4ed0-8e77-474ab08f0a30
S: * WEBPUSH a8282bf9-6102-4e1b-bb61-d26d0e532e65 \
    my-mobile-client 0
S: a2 OK ACKWEBPUSH completed
]]></artwork>
        <t>Example with an unknown or expired token:</t>
        <artwork><![CDATA[
C: a1 ACKWEBPUSH 5aa04cf0-f156-406e-84af-3cee534b23b8
S: a1 NO ACKWEBPUSH completed
]]></artwork>
      </section>
      <section anchor="lwebpush-command">
        <name>LWEBPUSH Command</name>
        <t>This command is only available in authenticated or selected state.</t>
        <dl>
          <dt>Arguments:</dt>
          <dd>
            <t>subscription ID with possible wildcards</t>
          </dd>
          <dt>Responses:</dt>
          <dd>
            <dl>
              <dt>untagged response:</dt>
              <dd>
                <t>WEBPUSH</t>
              </dd>
            </dl>
          </dd>
          <dt>Result:</dt>
          <dd>
            <dl>
              <dt>OK -</dt>
              <dd>
                <t>list completed</t>
              </dd>
            </dl>
          </dd>
          <dt/>
          <dd>
            <dl>
              <dt>NO -</dt>
              <dd>
                <t>list failure: can't list webpush records</t>
              </dd>
            </dl>
          </dd>
          <dt/>
          <dd>
            <dl>
              <dt>BAD -</dt>
              <dd>
                <t>arguments invalid</t>
              </dd>
            </dl>
          </dd>
        </dl>
        <t>The LWEBPUSH command returns a subset of webpush subscriptions from the complete set of all subscriptions available to the client. Zero or more untagged WEBPUSH responses are returned, containing information to identified the subscriptions. The server <bcp14>MUST</bcp14> return the WEBPUSH response for the exact subscription ID if the account has a subscription with this ID. It <bcp14>MUST</bcp14> return all the account's subscriptions if the argument is a wildcard "*".</t>
        <t>Example:</t>
        <artwork><![CDATA[
C: a1 LWEBPUSH *
S: * WEBPUSH a8282bf9-6102-4e1b-bb61-d26d0e532e65 \
    my-mobile-client 0
    https://push.endpoint.tld/random1 0
S: * WEBPUSH 80a3b492-bc9c-46a9-91ab-5866b27073bb \
    my-mobile-client NIL
    https://push.endpoint.tld/random2 NIL
S: * WEBPUSH 28626e4e-37d1-456c-a667-5258b5528508 \
    my-desktop-client 1112
S: a1 OK LWEBPUSH completed
C: a2 LWEBPUSH a8282bf9-6102-4e1b-bb61-d26d0e532e65
S: * WEBPUSH a8282bf9-6102-4e1b-bb61-d26d0e532e65 \
    my-mobile-client 0
S: a2 OK LWEBPUSH completed
]]></artwork>
      </section>
      <section anchor="silwebpush-command">
        <name>SILWEBPUSH Command</name>
        <t>This command is only available in authenticated or selected state.</t>
        <dl>
          <dt>Arguments:</dt>
          <dd>
            <t>subscription ID</t>
          </dd>
          <dt/>
          <dd>
            <t>duration to silence subscription, in seconds. <bcp14>MUST</bcp14> be equal or higher than 0</t>
          </dd>
          <dt/>
          <dd>
            <t>OR "session" to silence the subscription as long as the connection is alive.</t>
          </dd>
          <dt>Responses:</dt>
          <dd>
            <dl>
              <dt><bcp14>OPTIONAL</bcp14> untagged response:</dt>
              <dd>
                <t>WEBPUSH</t>
              </dd>
            </dl>
          </dd>
          <dt>Result:</dt>
          <dd>
            <dl>
              <dt>OK -</dt>
              <dd>
                <t>create completed</t>
              </dd>
            </dl>
          </dd>
          <dt/>
          <dd>
            <dl>
              <dt>NO -</dt>
              <dd>
                <t>the subscription is unknown or inactive</t>
              </dd>
            </dl>
          </dd>
          <dt/>
          <dd>
            <dl>
              <dt>BAD -</dt>
              <dd>
                <t>command unknown or arguments invalid</t>
              </dd>
            </dl>
          </dd>
        </dl>
        <t>The SILWEBPUSH command allows the client to silence a push subscription for a duration. It may be useful for clients synchronizing with the server when they receive a push notification, without parsing it. It may also be useful for clients that support a "do not disturb" period. When the duration is 0, the push subscription is active again and the server will send events for this subscription.</t>
        <t>Clients <bcp14>MAY</bcp14> announce their subscription ID with <tt>SILWEBPUSH subscription-id session</tt>, which causes the server to not send any push notification as long as the connection is alive. This isn't reflected in WEBPUSH responses. A server <bcp14>MAY</bcp14> refuse to silent for the session more than one subscription from the same connection.</t>
        <t>For example, when a client receives a push notification, it may silence the subscription for the duration (or a little less) that it stays connected to the server:</t>
        <t>Example:</t>
        <artwork><![CDATA[
C: a1 SILWEBPUSH a8282bf9-6102-4e1b-bb61-d26d0e532e65 10
S: * WEBPUSH a8282bf9-6102-4e1b-bb61-d26d0e532e65 \
    my-mobile-client 10
S: a1 OK SILWEBPUSH completed
C: a2 SILWEBPUSH a8282bf9-6102-4e1b-bb61-d26d0e532e65 session
S: * WEBPUSH a8282bf9-6102-4e1b-bb61-d26d0e532e65 \
    my-mobile-client 10
S: a2 OK SILWEBPUSH completed
]]></artwork>
      </section>
    </section>
    <section anchor="server-responses">
      <name>Server Responses</name>
      <section anchor="vapid-response">
        <name>VAPID Response</name>
        <t>The VAPID response occurs as a result of a GETVAPID command. It returns the server VAPID public key (<xref target="RFC8292"/>). This is a public key on the P-256 curve. It <bcp14>MUST</bcp14> be encoded in the uncompressed form <xref target="SEC_1"/> (section 2.3.3, replicated from X9.62), and base64url encoded as described in <xref target="RFC7515"/>. The server <bcp14>MAY</bcp14> use a different key pair for each account.</t>
        <t>Example:</t>
        <artwork><![CDATA[
S: * VAPID BOniQ9xHBPNY9gnQW4o-16vHqOb40pEIMifyUdFsxAgy\
    zVkFMguxw0QrdbZcq8hRjN2zpeInRvKVPlkzABvuTnI
]]></artwork>
      </section>
      <section anchor="webpush-response">
        <name>WEBPUSH Response</name>
        <t>The WEBPUSH response occurs as a result of a LWEBPUSH command. It <bcp14>MAY</bcp14> be returned as a result of a WEBPUSH, or a SILWEBPUSH command too. It contains the subscription ID, the subscription name, and if the subscription is active, the silenced duration in seconds, else nil.</t>
        <t>Example:</t>
        <artwork><![CDATA[
S: * WEBPUSH a8282bf9-6102-4e1b-bb61-d26d0e532e65 \
    my-mobile-client 0
]]></artwork>
      </section>
    </section>
    <section anchor="supported-events">
      <name>Supported events</name>
      <t>The WEBPUSH command enables getting MessageNew, MessageExpunge, AnnotationChange, or FlagChange notifications for the subscribed mailboxes. After a new subscription, the server sends a AckSubscription notification to enable the subscription.</t>
      <section anchor="acksubscription">
        <name>AckSubscription</name>
        <t>A push notification containing a AckSubscription event is sent by the server when a webpush subscription is created or updated with the WEBPUSH command. The JSON contains the following fields:</t>
        <ul spacing="normal">
          <li>
            <t><tt>eventType</tt>: string, "AckSubscription"</t>
          </li>
          <li>
            <t><tt>token</tt>: string, a random token</t>
          </li>
        </ul>
        <t>The random token <bcp14>SHOULD</bcp14> be a UUIDv4 token. The token <bcp14>SHOULD</bcp14> be valid for 10 minutes.</t>
        <t>The token is then send to the server with the ACKWEBPUSH command in order to activate the new or updated subscription.</t>
        <t>Example:</t>
        <artwork><![CDATA[
{
    "eventType": "AckSubscription",
    "token": "1d93db43-0b71-42d1-abfd-7baaa740208b"
}
]]></artwork>
      </section>
      <section anchor="flagchange-and-annotationchange">
        <name>FlagChange and AnnotationChange</name>
        <t>FlagChange covers the MessageRead, MessageTrash, FlagsSet, and FlagsClear events in [RFC5423].</t>
        <t>When the flag and/or message annotation change happens, the server sends a push notification containing a JSON with the following fields:</t>
        <ul spacing="normal">
          <li>
            <t><tt>eventType</tt>: string, "FlagChange" or "AnnotationChange"</t>
          </li>
          <li>
            <t><tt>mailbox</tt>: string, the mailbox concerned by the event</t>
          </li>
          <li>
            <t><tt>uid</tt>: int, the IMAP UID of the concerned message</t>
          </li>
          <li>
            <t><tt>flags</tt>: array of strings, containing the new message flags</t>
          </li>
        </ul>
        <t>If CONDSTORE [RFC4551] and/or QRESYNC [RFC5162] are enabled by the client before sending the WEBPUSH command, then the push notification also contains:</t>
        <ul spacing="normal">
          <li>
            <t><tt>highestmodseq</tt> int, The highest mod-sequence value of all messages in the mailbox</t>
          </li>
          <li>
            <t><tt>uidvalidity</tt> int, the UIDVALIDITY of the mailbox</t>
          </li>
        </ul>
        <t>If the number of messages with the \Seen flag changes, the server <bcp14>MAY</bcp14> also include the UNSEEN data item in the push notification:</t>
        <ul spacing="normal">
          <li>
            <t><tt>unseen</tt> int, the number of messages with the \Seen flag</t>
          </li>
        </ul>
        <t>Example:</t>
        <artwork><![CDATA[
{
    "eventType": "FlagChange",
    "mailbox": "My Mailbox",
    "uid": 9999,
    "flags": ["$Junk"],
    "highestmodseq": 65535,
    "uidvalidity": 101
}
]]></artwork>
      </section>
      <section anchor="messagenew">
        <name>MessageNew</name>
        <t>This covers both MessageNew and MessageAppend in [RFC5423].</t>
        <t>When a new/appended message arrives in a subscribed mailbox, the server sends a push notification containing a JSON with the following fields:</t>
        <ul spacing="normal">
          <li>
            <t><tt>eventType</tt>: string, "MessageNew"</t>
          </li>
          <li>
            <t><tt>mailbox</tt>: string, the mailbox concerned by the event</t>
          </li>
          <li>
            <t><tt>uid</tt>: int, the IMAP UID of the new or appended message</t>
          </li>
        </ul>
        <t>Depending on the subscription filter, the push notifications contain the following message attributes. If the subscription filter don't any attribute, then all fields <bcp14>MUST</bcp14> be in the JSON:</t>
        <ul spacing="normal">
          <li>
            <t><tt>from</tt>: array, if the filter contains <tt>body.peek[header.fields (from)]</tt> an array of JSON containing:
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>name</tt>: optional string, the name of the origin</t>
              </li>
              <li>
                <t><tt>email</tt>: string, the email address of the origin</t>
              </li>
            </ul>
          </li>
          <li>
            <t><tt>to</tt>: array, if the filter contains <tt>body.peek[header.fields (to)]</tt> an array of JSON containing:
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>name</tt>: optional string, the name of the destination</t>
              </li>
              <li>
                <t><tt>email</tt>: string, the email address of the destination</t>
              </li>
            </ul>
          </li>
          <li>
            <t><tt>date</tt>: string, the received date if the filter contains <tt>body.peek[header.fields (date)]</tt></t>
          </li>
          <li>
            <t><tt>subject</tt>: string, the subject of the email if the filter contains <tt>body.peek[header.fields (subject)]</tt></t>
          </li>
        </ul>
        <t>The push notification <bcp14>SHOULD</bcp14> contain the content of the message, if the final payload fits in the push notification size limit (4096 bytes once encrypted):</t>
        <ul spacing="normal">
          <li>
            <t><tt>content</tt>: string, the body of the message, encoded with type of <tt>contentType</tt></t>
          </li>
          <li>
            <t><tt>contentType</tt>: string, indicate the original media type of a resource before any content encoding is applied, <bcp14>REQUIRED</bcp14> IF <tt>content</tt> is present</t>
          </li>
          <li>
            <t><tt>contentEncoding</tt>: string, encoding type of the content, <bcp14>REQUIRED</bcp14> IF <tt>content</tt> is present</t>
          </li>
        </ul>
        <t>If the push notification doesn't contain the content of the message because it doesn't fit in the size limit, then the server <bcp14>MAY</bcp14> add:
- <tt>preview</tt>: string, preview of the message in UTF-8 plaintext, <bcp14>SHOULD</bcp14> be at least 256 bytes long.</t>
        <t>If FlagChange events are also included in the subscription filter, the JSON <bcp14>MUST</bcp14> contain:</t>
        <ul spacing="normal">
          <li>
            <t><tt>flags</tt>: array of strings, containing the new message flags</t>
          </li>
        </ul>
        <t>If CONDSTORE [RFC4551] and/or QRESYNC [RFC5162] are enabled by the client before sending the WEBPUSH command, then the push notification also contains:</t>
        <ul spacing="normal">
          <li>
            <t><tt>highestmodseq</tt> int, The highest mod-sequence value of all messages in the mailbox</t>
          </li>
          <li>
            <t><tt>uidvalidity</tt> int, the UIDVALIDITY of the mailbox</t>
          </li>
        </ul>
        <t>Example:</t>
        <artwork><![CDATA[
{
    "eventType": "MessageNew",
    "mailbox": "My Mailbox",
    "uid": 1001,
    "from": [{"email": "cdup@domain.tld", "name": "Camille"}]
    "to": [{"email": "me@example.tld"}],
    "date": "2025-04-09T13:40:39Z",
    "subject": "Hello",
    "content": "--------------MIME-BOUNDARY------------\nContent-Type: application/octet-stream; name=\"encrypted.asc\"[...]",
    "contentType": "text/plain",
    "contentEncoding": "multipart/encrypted;protocol=\"application/pgp-encrypted\";boundary=\"--------------MIME-BOUNDARY------------\""
}
]]></artwork>
      </section>
      <section anchor="messageexpunge">
        <name>MessageExpunge</name>
        <t>If MessageExpunge is enabled, and a message is expunged, the server sends a push notification containing a JSON with the following fields:</t>
        <ul spacing="normal">
          <li>
            <t><tt>eventType</tt>: string, "MessageExpunge"</t>
          </li>
          <li>
            <t><tt>mailbox</tt>: string, the mailbox concerned by the event</t>
          </li>
          <li>
            <t><tt>uid</tt>: int, the IMAP UID of the expunged message</t>
          </li>
        </ul>
        <t>If CONDSTORE [RFC4551] and/or QRESYNC [RFC5162] are enabled by the client before sending the WEBPUSH command, then the push notification also contains:</t>
        <ul spacing="normal">
          <li>
            <t><tt>highestmodseq</tt> int, The highest mod-sequence value of all messages in the mailbox</t>
          </li>
          <li>
            <t><tt>uidvalidity</tt> int, the UIDVALIDITY of the mailbox</t>
          </li>
        </ul>
        <t>Example:</t>
        <artwork><![CDATA[
{
    "eventType": "MessageExpunge",
    "mailbox": "My Mailbox",
    "uid": 1001
}
]]></artwork>
      </section>
      <section anchor="mailboxname">
        <name>MailboxName</name>
        <t>If MailboxName is enabled, the server sends push notifications when a mailbox is created, deleted or renamed.</t>
        <t>When a mailbox is created, the server sends a push notification containing a JSON with the following fields:</t>
        <ul spacing="normal">
          <li>
            <t><tt>eventType</tt>: string, "MailboxCreated"</t>
          </li>
          <li>
            <t><tt>mailbox</tt>: string, the new mailbox name</t>
          </li>
        </ul>
        <t>When a mailbox is deleted, the server sends a push notification containing a JSON with the following fields:</t>
        <ul spacing="normal">
          <li>
            <t><tt>eventType</tt>: string, "MailboxDeleted"</t>
          </li>
          <li>
            <t><tt>mailbox</tt>: string, the deleted mailbox name</t>
          </li>
        </ul>
        <t>When a mailbox is renamed, the server sends a push notification containing a JSON with the following fields:</t>
        <ul spacing="normal">
          <li>
            <t><tt>eventType</tt>: string, "MailboxDeleted"</t>
          </li>
          <li>
            <t><tt>oldName</tt>: string, the old mailbox name</t>
          </li>
          <li>
            <t><tt>newName</tt>: string, the new mailbox name</t>
          </li>
        </ul>
        <t>Example of a mailbox created:</t>
        <artwork><![CDATA[
{
    "eventType": "MailboxCreated",
    "mailbox": "My Mailbox"
}
]]></artwork>
        <t>Example of a mailbox renamed:</t>
        <artwork><![CDATA[
{
    "eventType": "MailboxRenamed",
    "oldName": "My Mailbox",
    "newName": "My_Mailbox"
}
]]></artwork>
      </section>
      <section anchor="subscriptionchange">
        <name>SubscriptionChange</name>
        <t>If SubscriptionChange is enabled, when the subscription changes, for example when a mailbox is added to the personal collection, the server sends a push notification containing a JSON with the following fields:</t>
        <ul spacing="normal">
          <li>
            <t><tt>eventType</tt>: string, "SubscriptionChange"</t>
          </li>
          <li>
            <t><tt>mailboxes</tt>: array of string, containing all the subscribed mailbox names</t>
          </li>
        </ul>
        <t>Example of a mailbox renamed:</t>
        <artwork><![CDATA[
{
    "eventType": "SubscriptionChange",
    "mailboxes": ["INBOX", "My Mailbox"]
}
]]></artwork>
      </section>
      <section anchor="mailboxmetadatachange">
        <name>MailboxMetadataChange</name>
        <t>Support for this event type is <bcp14>OPTIONAL</bcp14> unless the METADATA extension <xref target="RFC5464"/> is also supported by the server, in which case support for this event type is <bcp14>REQUIRED</bcp14>.</t>
        <t>If enabled, when the metadata of a mailbox changed, the server sends a push notification containing a JSON with the following fields:</t>
        <ul spacing="normal">
          <li>
            <t><tt>eventType</tt>: string, "MailboxMetadataChange"</t>
          </li>
          <li>
            <t><tt>mailbox</tt>: string, the mailbox concerned by the event</t>
          </li>
          <li>
            <t><tt>entries</tt>: array of string, list of entries, each of which have changed on the mailbox</t>
          </li>
        </ul>
        <t>Example of a mailbox renamed:</t>
        <artwork><![CDATA[
{
    "eventType": "MailboxMetadataChange",
    "mailbox": "INBOX",
    "entries": ["/shared/comment", "/private/comment"]
}
]]></artwork>
      </section>
      <section anchor="servermetadatachange">
        <name>ServerMetadataChange</name>
        <t>Support for this event type is <bcp14>OPTIONAL</bcp14> unless the METADATA or the METADATA-SERVER extension <xref target="RFC5464"/> is also supported by the server, in which case support for this event type is <bcp14>REQUIRED</bcp14>.</t>
        <t>If enabled, when the metadata of the server changed, the server sends a push notification containing a JSON with the following fields:</t>
        <ul spacing="normal">
          <li>
            <t><tt>eventType</tt>: string, "ServerMetadataChange"</t>
          </li>
          <li>
            <t><tt>entries</tt>: array of string, list of entries, each of which have changed on the server</t>
          </li>
        </ul>
        <t>Example of a mailbox renamed:</t>
        <artwork><![CDATA[
{
    "eventType": "ServerMetadataChange",
    "entries": ["/shared/comment", "/private/comment"]
}
]]></artwork>
      </section>
      <section anchor="notification-overflow">
        <name>Notification overflow</name>
        <t>Instead of sending the full content for an event, for instance if the content of a push event is too long, the server <bcp14>MAY</bcp14> send an overflow event.</t>
        <t>This event is a JSON with the following fields:</t>
        <ul spacing="normal">
          <li>
            <t><tt>eventType</tt>: string, "Overflow"</t>
          </li>
          <li>
            <t><tt>forEventType</tt>, optional string, the event type of the overflowed event. The server can send a generic overflow event to inform the client should synchronize with the server by not sending this field.</t>
          </li>
          <li>
            <t><tt>mailboxes</tt>, optional array of string, this is the mailboxes concerned by the event. This field is <bcp14>RECOMMENDED</bcp14> if the event is related to mailboxes.</t>
          </li>
        </ul>
        <t>Example:</t>
        <artwork><![CDATA[
{
    "eventType": "Overflow",
    "forEventType": "MessageNew",
    "mailboxes": ["My Mailbox"]
}
]]></artwork>
      </section>
    </section>
    <section anchor="push-notifications">
      <name>Push notifications</name>
      <t>Once an account has one or more push subscription (registered with WEBPUSH command), the server sends a push message for each subscription every time a subscribed event is recorded.</t>
      <t>The notification is encrypted following <xref target="RFC8291"/> specifications, send following <xref target="RFC8030"/> and authorized with <xref target="RFC8292"/>.</t>
      <section anchor="content">
        <name>Content</name>
        <t>The server can send push notifications at any time. The push notification consist of a JSON with:
- <tt>pushId</tt>: u32, a counter for the push subscription, increased by one every time a push is sent. The client may wait a few seconds if it receives a push notification with an higher id than expected, and synchronize with the server if it doesn't receive it. If the client receives a push notification with a lower id than expected, the client <bcp14>MUST</bcp14> store the id as the last id. The server <bcp14>MAY</bcp14> use that behavior to reset the push counter.
 <tt>events</tt>: array, an array of push events, as desribed in the supported events section.</t>
        <t>As stated in RFC8291, the cleartext content of push notifications <bcp14>MUST NOT</bcp14> be longer than 3993 bytes. If the server wants to inform the client about a response longer than that, it <bcp14>MAY</bcp14> send a SYNC message.</t>
        <t>Example of a push notification containing a new message for the "My Mailbox" mailbox, and one deleted message for the "INBOX" mailbox:</t>
        <artwork><![CDATA[
{
    "pushId": 1001,
    "events": [
        {
            "eventType": "MessageNew",
            "mailbox": "My Mailbox",
            "uid": 1001,
            "from": [{"email": "cdup@domain.tld", "name": "Camille"}]
            "to": [{"email": "me@example.tld"}],
            "date": "2025-04-09T13:40:39Z",
            "subject": "Hello",
            "content": "--------------MIME-BOUNDARY------------\nContent-Type: application/octet-stream; name=\"encrypted.asc\"[...]",
            "contentType": "text/plain",
            "contentEncoding": "multipart/encrypted;protocol=\"application/pgp-encrypted\";boundary=\"--------------MIME-BOUNDARY------------\""
        },
        {
            "eventType": "MessageExpunge",
            "mailbox": "INBOX",
            "uid": 1000
        }
    ]
}
]]></artwork>
        <t>Example of a push notification containing overflowed events:</t>
        <artwork><![CDATA[
{
    "pushId": 1002,
    "events": [
        {
            "eventType": "Overflow",
            "forEventType": "MessageNew",
            "mailboxes": ["My Mailbox"],
        },
        {
            "eventType": "Overflow",
            "forEventType": "MessageExpunge",
            "mailboxes": ["INBOX"],
        }
    ]
}
]]></artwork>
        <t>Example of a generic push notification, to implement synchronization on push:</t>
        <artwork><![CDATA[
{
    "pushId": 1003,
    "events": [
        {
            "eventType": "Overflow"
        }
    ]
}
]]></artwork>
      </section>
      <section anchor="webpush-headers">
        <name>WebPush headers</name>
        <t>Push messages <bcp14>SHOULD</bcp14> have 604800 for the <tt>TTL</tt> header (a week).</t>
        <t>Push messages with a MessageNew event <bcp14>SHOULD</bcp14> have <tt>high</tt> for the <tt>Urgency</tt> header, other push messages <bcp14>SHOULD</bcp14> have <tt>normal</tt>for the <tt>Urgency</tt> header.</t>
        <t>Push messages <bcp14>SHOULD NOT</bcp14> contain a <tt>Topic</tt> header.</t>
      </section>
      <section anchor="push-message-processing">
        <name>Push message processing</name>
        <t>Because all events regarding a specific mailbox, sent by push notifications contains a <tt>mailbox</tt> field, the client <bcp14>MAY</bcp14> parse that field only and choose to synchronize with the server. For example, when the client receives <tt>"mailbox": "INBOX"</tt>, it requests the server for new events.</t>
        <t>The client <bcp14>MAY</bcp14> also parse only some other events. For example, a client may parse MessageNew events, so it can directly show important informations on the user interface. And synchronize with the server if it receives another response.</t>
        <t>The client <bcp14>MUST NOT</bcp14> rely exclusively on push notifications to stay synchronized as they may arrive out of order, and delivery isn't guarenteed. Especially if the client uses the contents of the push messages, or if the client performs partial synchronization on push (synchronize a single mailbox), the client <bcp14>MUST</bcp14> rely on another mechanism to be fully synchronized. For example, a periodic synchronization may be used.</t>
      </section>
      <section anchor="push-server-response">
        <name>Push server response</name>
        <t>When the push server returns a <tt>429 Too many requests</tt>, it should have send a <tt>Retry-After</tt> headers <xref target="RFC9110"/> to indicate how long the server has to wait before sending another request. If this header is present, the server <bcp14>MUST</bcp14> follow the period requested. If this header is not present, the mail server <bcp14>SHOULD</bcp14> wait 5 minutes before sending another request to this endpoint.</t>
        <t>When the push server returns another 4XX status code, the mail server <bcp14>MUST</bcp14> removes the subscription.</t>
        <t>When the push server returns a 5XX status code, the mail server <bcp14>SHOULD</bcp14> wait 5 minutes before sending another request to the endpoint.</t>
      </section>
    </section>
    <section anchor="vapid-key-rotation">
      <name>VAPID key rotation</name>
      <t>Server VAPID key rotation may be necessary in some cases.</t>
      <t>When the server rotates the keys, if it still has access to the old VAPID key, the server <bcp14>SHOULD</bcp14> send the new VAPID public key with a VAPID response in a push notification, using the old VAPID key for the authorization.</t>
      <t>The server <bcp14>MAY</bcp14> keep using the old VAPID key for some time. As soon as the old VAPID key is invalidated, old subscriptions activated with this VAPID key <bcp14>MUST</bcp14> be deactivated.</t>
      <t>When the server receives a WEBPUSH command for an activated subscription that has been acknowledged with the old VAPID key, the server <bcp14>MUST</bcp14> deactivate the subscription and <bcp14>MUST</bcp14> reply with an untagged VAPID response and an untagged WEBPUSH response. The server then <bcp14>MUST</bcp14> send an AckSubscription event with a new token in a push notification.</t>
      <t>All pending acknowledgement tokens must be invalidate when the VAPID key is rotated.</t>
      <t>Example of a client sending a WEBPUSH command for a subscription activated with the old VAPID key:</t>
      <artwork><![CDATA[
C: a1 LWEBPUSH *
S: * WEBPUSH a8282bf9-6102-4e1b-bb61-d26d0e532e65 \
    my-mobile-client 0
S: a1 OK LWEBPUSH completed
C: a2 WEBPUSH a8282bf9-6102-4e1b-bb61-d26d0e532e65 \
    my-mobile-client \
    https://push.example.net/push/random1 \
    BCVxsr7N_eNgVRqvHtD0zTZsEc6-VV-JvLexhqUzORcxaOzi6-AYWXvTBHm4bj\
    yPjs7Vd8pZGH6SRpkNtoIAiw4 \
    BTBZMqHH6r4Tts7J_aSIgg
S: * VAPID BOniQ9xHBPNY9gnQW4o-16vHqOb40pEIMifyUdFsxAgy\
    zVkFMguxw0QrdbZcq8hRjN2zpeInRvKVPlkzABvuTnI
S: * WEBPUSH a8282bf9-6102-4e1b-bb61-d26d0e532e65 \
    my-mobile-client NIL
    https://push.example.net/push/random1 NIL
S: a2 OK WEBPUSH completed
]]></artwork>
    </section>
    <section anchor="formal-syntax">
      <name>Formal Syntax</name>
      <t>The following syntax specification uses the Augmented Backus-Naur Form (ABNF) notation as specified in <xref target="RFC5234"/>.</t>
      <t>Non-terminals referenced but not defined below are as defined by <xref target="RFC9051"/> and <xref target="RFC4466"/>. <tt>event-groups</tt> is defined in <xref target="RFC5465"/>.</t>
      <t>capability =/ "WEBPUSH"</t>
      <t>command-auth =/ getvapid / webpush / ackwebpush / lwebpush / silwebpush</t>
      <t>getvapid = "GETVAPID"</t>
      <t>webpush = "WEBPUSH" SP (add-webpush-opt / del-webpush-opt)</t>
      <t>ackwebpush = "ACKWEBPUSH" SP ackwebpush-token</t>
      <t>lwebpush = "LWEBPUSH" SP (list-wildcards / subscription-id)</t>
      <t>silwebpush = "SILWEBPUSH" SP subscription-id SP (duration / "session")</t>
      <t>add-webpush-opt = subscription-id SP subscription-name SP endpoint SP pubkey SP auth SP event-groups
; event-groups is defined in RFC5465</t>
      <t>del-webpush-opt = subscription-id SP nil</t>
      <t>response-payload =/ vapid-resp / webpush-resp / ackwebpush-resp / sync-resp</t>
      <t>vapid-resp = "VAPID" SP pubkey</t>
      <t>webpush-resp = "WEBPUSH" SP subscription-id SP subscription-name SP (duration / nil)</t>
      <t>sync-resp = "SYNC" [SP response-first-word]</t>
      <t>push-content = 1*(response-data)</t>
      <t>response-first-word = &lt;response-payload until first SP&gt;</t>
      <t>subscription-id = atom
; Case sensitive</t>
      <t>subscription-name = atom</t>
      <t>endpoint = "https://" text
; Case sensitive</t>
      <t>pubkey = 87(base64url-char)</t>
      <t>auth = 22(base64url-char)</t>
      <t>duration = number</t>
      <t>base64url-char = ALPHA / DIGIT / "_" / "-"
; Case sensitive</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The privacy and security considerations of <xref target="RFC8030"/> <xref target="RFC8291"/> and <xref target="RFC8292"/> all apply to the use of this extension.</t>
      <t>WebPush on decentralized applications may be used as a DDOS amplification, by registering multiple time a target as the endpoint, on multiple servers then notifying all the accounts. Requiring the client to acknowledge one push notification (with the ACKWEBPUSH command and response) greatly reduces this risk.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>Registration of a new IMAP capability in the IMAP Capability registry requires the publication of a standards- track RFC or an IESG approved experimental RFC. The registry is currently located at <eref target="http://www.iana.org/assignments/imap4-capabilities">http://www.iana.org/assignments/imap4-capabilities</eref>. This document defines the WEBPUSH IMAP capability need to be registered to the registry.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC4466" target="https://www.rfc-editor.org/info/rfc4466" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4466.xml">
          <front>
            <title>Collected Extensions to IMAP4 ABNF</title>
            <author fullname="A. Melnikov" initials="A." surname="Melnikov"/>
            <author fullname="C. Daboo" initials="C." surname="Daboo"/>
            <date month="April" year="2006"/>
            <abstract>
              <t>Over the years, many documents from IMAPEXT and LEMONADE working groups, as well as many individual documents, have added syntactic extensions to many base IMAP commands described in RFC 3501. For ease of reference, this document collects most of such ABNF changes in one place.</t>
              <t>This document also suggests a set of standard patterns for adding options and extensions to several existing IMAP commands defined in RFC 3501. The patterns provide for compatibility between existing and future extensions.</t>
              <t>This document updates ABNF in RFCs 2088, 2342, 3501, 3502, and 3516. It also includes part of the errata to RFC 3501. This document doesn't specify any semantic changes to the listed RFCs. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4466"/>
          <seriesInfo name="DOI" value="10.17487/RFC4466"/>
        </reference>
        <reference anchor="RFC5234" target="https://www.rfc-editor.org/info/rfc5234" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5234.xml">
          <front>
            <title>Augmented BNF for Syntax Specifications: ABNF</title>
            <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker"/>
            <author fullname="P. Overell" initials="P." surname="Overell"/>
            <date month="January" year="2008"/>
            <abstract>
              <t>Internet technical specifications often need to define a formal syntax. Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications. The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power. The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges. This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="68"/>
          <seriesInfo name="RFC" value="5234"/>
          <seriesInfo name="DOI" value="10.17487/RFC5234"/>
        </reference>
        <reference anchor="RFC5464" target="https://www.rfc-editor.org/info/rfc5464" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5464.xml">
          <front>
            <title>The IMAP METADATA Extension</title>
            <author fullname="C. Daboo" initials="C." surname="Daboo"/>
            <date month="February" year="2009"/>
            <abstract>
              <t>The METADATA extension to the Internet Message Access Protocol permits clients and servers to maintain "annotations" or "metadata" on IMAP servers. It is possible to have annotations on a per-mailbox basis or on the server as a whole. For example, this would allow comments about the purpose of a particular mailbox to be "attached" to that mailbox, or a "message of the day" containing server status information to be made available to anyone logging in to the server. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5464"/>
          <seriesInfo name="DOI" value="10.17487/RFC5464"/>
        </reference>
        <reference anchor="RFC5465" target="https://www.rfc-editor.org/info/rfc5465" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5465.xml">
          <front>
            <title>The IMAP NOTIFY Extension</title>
            <author fullname="A. Gulbrandsen" initials="A." surname="Gulbrandsen"/>
            <author fullname="C. King" initials="C." surname="King"/>
            <author fullname="A. Melnikov" initials="A." surname="Melnikov"/>
            <date month="February" year="2009"/>
            <abstract>
              <t>This document defines an IMAP extension that allows a client to request specific kinds of unsolicited notifications for specified mailboxes, such as messages being added to or deleted from such mailboxes. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5465"/>
          <seriesInfo name="DOI" value="10.17487/RFC5465"/>
        </reference>
        <reference anchor="RFC7162" target="https://www.rfc-editor.org/info/rfc7162" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7162.xml">
          <front>
            <title>IMAP Extensions: Quick Flag Changes Resynchronization (CONDSTORE) and Quick Mailbox Resynchronization (QRESYNC)</title>
            <author fullname="A. Melnikov" initials="A." surname="Melnikov"/>
            <author fullname="D. Cridland" initials="D." surname="Cridland"/>
            <date month="May" year="2014"/>
            <abstract>
              <t>Often, multiple IMAP (RFC 3501) clients need to coordinate changes to a common IMAP mailbox. Examples include different clients working on behalf of the same user and multiple users accessing shared mailboxes. These clients need a mechanism to efficiently synchronize state changes for messages within the mailbox.</t>
              <t>Initially defined in RFC 4551, the Conditional Store facility provides a protected update mechanism for message state information and a mechanism for requesting only changes to the message state. This memo updates that mechanism and obsoletes RFC 4551, based on operational experience.</t>
              <t>This document additionally updates another IMAP extension, Quick Resynchronization, which builds on the Conditional STORE extension to provide an IMAP client the ability to fully resynchronize a mailbox as part of the SELECT/EXAMINE command, without the need for additional server-side state or client round trips. Hence, this memo obsoletes RFC 5162.</t>
              <t>Finally, this document also updates the line-length recommendation in Section 3.2.1.5 of RFC 2683.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7162"/>
          <seriesInfo name="DOI" value="10.17487/RFC7162"/>
        </reference>
        <reference anchor="RFC8030" target="https://www.rfc-editor.org/info/rfc8030" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8030.xml">
          <front>
            <title>Generic Event Delivery Using HTTP Push</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <author fullname="E. Damaggio" initials="E." surname="Damaggio"/>
            <author fullname="B. Raymor" initials="B." role="editor" surname="Raymor"/>
            <date month="December" year="2016"/>
            <abstract>
              <t>This document describes a simple protocol for the delivery of real- time events to user agents. This scheme uses HTTP/2 server push.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8030"/>
          <seriesInfo name="DOI" value="10.17487/RFC8030"/>
        </reference>
        <reference anchor="RFC8292" target="https://www.rfc-editor.org/info/rfc8292" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8292.xml">
          <front>
            <title>Voluntary Application Server Identification (VAPID) for Web Push</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <author fullname="P. Beverloo" initials="P." surname="Beverloo"/>
            <date month="November" year="2017"/>
            <abstract>
              <t>An application server can use the Voluntary Application Server Identification (VAPID) method described in this document to voluntarily identify itself to a push service. The "vapid" authentication scheme allows a client to include its identity in a signed token with requests that it makes. The signature can be used by the push service to attribute requests that are made by the same application server to a single entity. The identification information can allow the operator of a push service to contact the operator of the application server. The signature can be used to restrict the use of a push message subscription to a single application server.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8292"/>
          <seriesInfo name="DOI" value="10.17487/RFC8292"/>
        </reference>
        <reference anchor="RFC8291" target="https://www.rfc-editor.org/info/rfc8291" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8291.xml">
          <front>
            <title>Message Encryption for Web Push</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <date month="November" year="2017"/>
            <abstract>
              <t>This document describes a message encryption scheme for the Web Push protocol. This scheme provides confidentiality and integrity for messages sent from an application server to a user agent.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8291"/>
          <seriesInfo name="DOI" value="10.17487/RFC8291"/>
        </reference>
        <reference anchor="RFC9051" target="https://www.rfc-editor.org/info/rfc9051" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9051.xml">
          <front>
            <title>Internet Message Access Protocol (IMAP) - Version 4rev2</title>
            <author fullname="A. Melnikov" initials="A." role="editor" surname="Melnikov"/>
            <author fullname="B. Leiba" initials="B." role="editor" surname="Leiba"/>
            <date month="August" year="2021"/>
            <abstract>
              <t>The Internet Message Access Protocol Version 4rev2 (IMAP4rev2) allows a client to access and manipulate electronic mail messages on a server. IMAP4rev2 permits manipulation of mailboxes (remote message folders) in a way that is functionally equivalent to local folders. IMAP4rev2 also provides the capability for an offline client to resynchronize with the server.</t>
              <t>IMAP4rev2 includes operations for creating, deleting, and renaming mailboxes; checking for new messages; removing messages permanently; setting and clearing flags; parsing per RFCs 5322, 2045, and 2231; searching; and selective fetching of message attributes, texts, and portions thereof. Messages in IMAP4rev2 are accessed by the use of numbers. These numbers are either message sequence numbers or unique identifiers.</t>
              <t>IMAP4rev2 does not specify a means of posting mail; this function is handled by a mail submission protocol such as the one specified in RFC 6409.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9051"/>
          <seriesInfo name="DOI" value="10.17487/RFC9051"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC9110" target="https://www.rfc-editor.org/info/rfc9110" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9110.xml">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="RFC9586" target="https://www.rfc-editor.org/info/rfc9586" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9586.xml">
          <front>
            <title>IMAP Extension for Using and Returning Unique Identifiers (UIDs) Only</title>
            <author fullname="A. Melnikov" initials="A." surname="Melnikov"/>
            <author fullname="A. P. Achuthan" initials="A. P." surname="Achuthan"/>
            <author fullname="V. Nagulakonda" initials="V." surname="Nagulakonda"/>
            <author fullname="A. Singh" initials="A." surname="Singh"/>
            <author fullname="L. Alves" initials="L." surname="Alves"/>
            <date month="May" year="2024"/>
            <abstract>
              <t>The UIDONLY extension to the Internet Message Access Protocol (RFCs 3501 and 9051) allows clients to enable a mode in which information about mailbox changes is returned using only Unique Identifiers (UIDs). Message numbers are not returned in responses and cannot be used in requests once this extension is enabled. This helps both clients and servers to reduce resource usage required to maintain a map between message numbers and UIDs.</t>
              <t>This document defines an experimental IMAP extension.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9586"/>
          <seriesInfo name="DOI" value="10.17487/RFC9586"/>
        </reference>
        <reference anchor="SEC_1" target="https://www.secg.org/sec1-v2.pdf">
          <front>
            <title>SEC 1: Elliptic Curve Cryptography</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RFC7515" target="https://www.rfc-editor.org/info/rfc7515" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7515.xml">
          <front>
            <title>JSON Web Signature (JWS)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>JSON Web Signature (JWS) represents content secured with digital signatures or Message Authentication Codes (MACs) using JSON-based data structures. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and an IANA registry defined by that specification. Related encryption capabilities are described in the separate JSON Web Encryption (JWE) specification.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7515"/>
          <seriesInfo name="DOI" value="10.17487/RFC7515"/>
        </reference>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC2177" target="https://www.rfc-editor.org/info/rfc2177" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2177.xml">
          <front>
            <title>IMAP4 IDLE command</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="June" year="1997"/>
            <abstract>
              <t>This document specifies the syntax of an IDLE command, which will allow a client to tell the server that it's ready to accept such real-time updates. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2177"/>
          <seriesInfo name="DOI" value="10.17487/RFC2177"/>
        </reference>
        <reference anchor="RFC8620" target="https://www.rfc-editor.org/info/rfc8620" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8620.xml">
          <front>
            <title>The JSON Meta Application Protocol (JMAP)</title>
            <author fullname="N. Jenkins" initials="N." surname="Jenkins"/>
            <author fullname="C. Newman" initials="C." surname="Newman"/>
            <date month="July" year="2019"/>
            <abstract>
              <t>This document specifies a protocol for clients to efficiently query, fetch, and modify JSON-based data objects, with support for push notification of changes and fast resynchronisation and for out-of- band binary data upload/download.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8620"/>
          <seriesInfo name="DOI" value="10.17487/RFC8620"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
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
+7ACpJ8BgMj3+nS/KX6HhnZlkyBBHgAz822jQfObQMsT0f12zbbDBIV1ByN5
P2j45vsKpvSXlagVAPbmh0ajvIYnQmbxDGi2T+knmMFC9a0a1ZVx04ZlhSf8
TQeQhU2BbuuaYZhXnoid7TVb7sQDYzNZ1x9Jh1e9XvWVReETvpzbaBTbwIvh
8YvnQ8DxwdGPR5fI6f9q4v97zRo4MBFovEhQxOxjNBTMLROrppgp5nCMl/xN
XG44LjRExcUN5t7zaW5yTaHffWk/3WG+ROx+kLGdfwAcbz6B7hplCahT5Itw
v+TtfpaJypwcHJxdCDx4HE1/tLRfqKTboRQVCJWJy+oPthvlPP92F1o8pmn+
EUnFNTWWbqoiB/PTtjinb84YqyCvWuZoixQlq3rc1+6r8eB+bXJdTDFRNsRV
+YsxnXmoTwbpDRl1R8PTYYWU54QA5hxSNFHdpbsFzhnDoVB6vJ8/1thLluaL
OubrYKPQJvDgiJiD46Ok9gR+dP4GRZrQxsXR4cWPSLmEPkCAseEkwCMaDnho
pLV2OwvmquuvB8Eaw1iXCAIr5HvcU7Cl7u7u2oGMZDtOphsSRPhUf8d8I5jJ
ed9zC/P/wJkklQ/fZ87VhjIW6MvW2tvjpF4UvnWaLPn79fiZg8b/A8xFiB7i
hAAA

-->

</rfc>
