<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-korenenovak-smtp-e2eesign-00" category="info" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="SMTP-E2EESIGN">SMTP Extensions for End-to-End Encryption and User-Level Signatures</title>

    <author fullname="Jonas Korene Novak">
      <organization>Independent</organization>
      <address>
        <email>info@dcrubro.com</email>
      </address>
    </author>

    <date year="2025" month="July" day="06"/>

    <area>ART</area>
    <workgroup>DISPATCH</workgroup>
    <keyword>SMTP</keyword> <keyword>E2EE</keyword> <keyword>cryptographic signature</keyword> <keyword>mail</keyword>

    <abstract>


<?line 35?>

<t>This Internet-Draft proposes adding extensions to the SMTP protocol that allow for true End-to-End Encryption and cryptographic signatures between users on a SMTP server. Current DKIM only allows for server verification, while messages sent through secure channels only encrypt traffic between servers, not between users.</t>



    </abstract>

    <note title="About This Document" removeInRFC="true">
      <t>
        The latest revision of this draft can be found at <eref target="https://dcrubro.com/files/smtp-ee2esign-latest.txt"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-korenenovak-smtp-e2eesign/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        DISPATCH Working Group mailing list (<eref target="mailto:dispatch@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/dispatch"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/dispatch/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/dcrubro/smtp-e2eesign"/>.</t>
    </note>


  </front>

  <middle>


<?line 39?>

<section anchor="introduction"><name>Introduction</name>

<t>The current version of SMTP, even with protocols like SMTPS, STARTTLS and DKIM, lacks native support for user-level encryption and cryptographic identity. This document proposes three new SMTP extensions — <spanx style="verb">ENCRYPTMESSAGE</spanx>,  <spanx style="verb">SIGNMESSAGE</spanx> and <spanx style="verb">AUTH HASHEDPASS</spanx> — that allow for end-to-end encrypted content, sender-level digital signatures and hash-based authentication that prevents SMTP servers reconstructing user private keys.</t>

</section>
<section anchor="conventions-and-definitions"><name>Conventions and Definitions</name>

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

<t>This document uses the following terms:</t>

<t><list style="symbols">
  <t><strong>MUA (Mail User Agent)</strong> and <strong>MTA (Mail Transfer Agent)</strong> as defined in <xref target="RFC5321"></xref>.</t>
  <t><strong>E2EE</strong>, which stands for <em>End-to-End Encryption</em>.</t>
  <t><strong>Plain-text</strong>, which refers to an unencrypted, human-readable message that can be read by anyone.</t>
</list></t>

</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>This protocol enhances SMTP security by enabling user-level E2EE and cryptographic signatures. However, several risks and considerations apply:</t>

<section anchor="downgrade-attacks"><name>Downgrade Attacks</name>
<t>Clients and servers <bcp14>MUST</bcp14> ensure that use of <spanx style="verb">ENCRYPTMESSAGE</spanx>, <spanx style="verb">SIGNMESSAGE</spanx> and <spanx style="verb">AUTH HASHEDPASS</spanx> is not silently disabled or ignored in transit. SMTP downgrade attacks are a known vector (e.g., STARTTLS stripping).</t>

</section>
<section anchor="channel-security"><name>Channel Security</name>
<t>All authentication commands (e.g., <spanx style="verb">AUTH HASHEDPASS</spanx>, <spanx style="verb">GETSALT</spanx>) <bcp14>MUST</bcp14> be used <strong>only over secure channels</strong> such as SMTPS or STARTTLS. Servers <bcp14>MUST</bcp14> reject these commands over plain-text connections (normal SMTP).</t>

</section>
<section anchor="key-authenticity"><name>Key Authenticity</name>
<t>Clients retrieving public keys via <spanx style="verb">PUBKEY</spanx> <bcp14>MUST</bcp14> validate that the key is returned from the intended domain. If DNS spoofing or MITM occurs, a forged public key could be inserted.</t>

</section>
<section anchor="key-compromise"><name>Key Compromise</name>
<t>If a user's private key is compromised, message confidentiality and authenticity are at risk. Clients <bcp14>SHOULD</bcp14> support key rotation and expiration.</t>

</section>
<section anchor="hash-function-strength"><name>Hash Function Strength</name>
<t>If password-based key derivation is used, the hashing algorithm (Argon2) <bcp14>MUST</bcp14> be strong and salted. SHA-1 and MD5 are not permitted.</t>

</section>
<section anchor="replay-and-injection"><name>Replay and Injection</name>
<t>Signatures must include timestamping or message-ID binding to prevent replay or message tampering. Signatures over headers <bcp14>MUST</bcp14> include all content-critical headers (To, From, Date, Subject).</t>

</section>
<section anchor="metadata-leakage"><name>Metadata Leakage</name>
<t>Message headers like "Subject" may leak information about the message. These <bcp14>SHOULD</bcp14> be encrypted along with the main body of the message to avoid leaking information.</t>

</section>
</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>This document requests the registration of the following SMTP extension keywords in the "SMTP Service Extensions" registry:</t>

<t><list style="symbols">
  <t>Keyword: ENCRYPTMESSAGE
Description: Indicates support for user-level message encryption via public key.
Reference: This document</t>
  <t>Keyword: SIGNMESSAGE
Description: Indicates support for cryptographic message signatures by end users.
Reference: This document</t>
  <t>Keyword: AUTH HASHEDPASS
Description: An SMTP AUTH method that uses hashed password credentials.
Reference: This document</t>
</list></t>

</section>
<section anchor="protocol-extensions"><name>Protocol Extensions</name>

<t>Servers that support the extensions defined by this document <bcp14>MUST</bcp14> advertise the <spanx style="verb">ENCRYPTMESSAGE</spanx>, <spanx style="verb">SIGNMESSAGE</spanx> and <spanx style="verb">AUTH HASHEDPASS</spanx> EHLO keywords. These keywords indicate that the server supports the extensions, headers and commands defined by this document.</t>

</section>
<section anchor="hashing-and-key-derivation-algorithms"><name>Hashing and Key Derivation Algorithms</name>

<t>This protocol uses a password-derived key for both authentication (<spanx style="verb">AUTH HASHEDPASS</spanx>)
and private key generation (via <spanx style="verb">GETSALT</spanx>).</t>

<t>Servers and clients implementing this protocol:</t>

<t><list style="symbols">
  <t><strong><bcp14>MUST</bcp14> support <spanx style="verb">Argon2id</spanx></strong> with at least 256-bit output and configurable parameters</t>
  <t><strong><bcp14>MUST NOT</bcp14> use PBKDF2, SHA-1, or unsalted hashes</strong></t>
</list></t>

<t>Salt values used in this scheme <bcp14>MUST</bcp14> be:
- At least 128 bits
- Unique per user
- Randomly generated at account creation and returned by <spanx style="verb">GETSALT</spanx></t>

</section>
<section anchor="protocol-definitions"><name>Protocol Definitions</name>

<t>This document introduces three new EHLO extensions: <spanx style="verb">ENCRYPTMESSAGE</spanx>, <spanx style="verb">SIGNMESSAGE</spanx> and <spanx style="verb">AUTH HASHEDPASS</spanx>. These keywords advertise the server’s support for end-to-end encryption, user-level message signing and hash-based authentication as defined in this protocol. Clients can use their presence in the EHLO response to determine whether the remote SMTP server supports these features.</t>

<t>This protocol also defines four new SMTP commands: <spanx style="verb">PUBKEY</spanx>, <spanx style="verb">SETPUBKEY</spanx>, <spanx style="verb">GETSALT</spanx> and <spanx style="verb">RSTSALT</spanx>.</t>

<t><list style="symbols">
  <t><strong>The <spanx style="verb">PUBKEY</spanx> command</strong> retrieves the public key associated with a specific email identity, allowing the sender to encrypt messages for the intended recipient. The key is returned as a base64 encoded string with a prepended algorithm identifier. It <bcp14>SHOULD</bcp14> be issued before <strong>MAIL FROM</strong> and doesn't require authentication.</t>
</list></t>

<figure><sourcecode type="example"><![CDATA[
C: PUBKEY alice@example.com
S: 220 ed25519 QUFBQUMzTnphQzFsWkR...
]]></sourcecode></figure>

<t><list style="symbols">
  <t>For an unknown user:</t>
</list></t>

<figure><sourcecode type="example"><![CDATA[
C: PUBKEY bob@example.net
S: 550 No public key available for bob@example.net
]]></sourcecode></figure>

<t><list style="symbols">
  <t><strong>The <spanx style="verb">SETPUBKEY</spanx> command</strong> requests the server to set the server-stored public key for the authenticated user to the requested value. This command can be used to modify the public key in case of a password or salt change. It <bcp14>SHOULD</bcp14> be issued before <strong>MAIL FROM</strong> and requires authentication.</t>
</list></t>

<figure><sourcecode type="example"><![CDATA[
C: SETPUBKEY base64(publickey)
S: 250 OK
]]></sourcecode></figure>

<t><list style="symbols">
  <t>For an unauthenticated session:</t>
</list></t>

<figure><sourcecode type="example"><![CDATA[
C: SETPUBKEY base64(publickey)
S: 530 5.7.0 Authentication required
]]></sourcecode></figure>

<t><list style="symbols">
  <t><strong>The <spanx style="verb">GETSALT</spanx> command</strong> retrieves the password-derived salt associated with the authenticated user in the current session. This command is available only after successful authentication using the <spanx style="verb">AUTH HASHEDPASS</spanx> mechanism. The salt is returned as a base64 encoded string. It <bcp14>SHOULD</bcp14> be issued before <strong>MAIL FROM</strong> and requires authentication.</t>
</list></t>

<figure><sourcecode type="example"><![CDATA[
C: GETSALT
S: 220 SALT ODcyZmQwNTFlOTM4OTFh...
]]></sourcecode></figure>

<t><list style="symbols">
  <t>For an unauthenticated session:</t>
</list></t>

<figure><sourcecode type="example"><![CDATA[
C: GETSALT
S: 530 5.7.0 Authentication required
]]></sourcecode></figure>

<t><list style="symbols">
  <t><strong>The <spanx style="verb">RSTSALT</spanx> command</strong> requests the server to reset the server-stored salt for the authenticated user to a new, random (128 bits is sufficient) value, and returns it to the client as a base64 encoded string. It <bcp14>SHOULD</bcp14> be issued before <strong>MAIL FROM</strong> and requires authentication.</t>
</list></t>

<figure><sourcecode type="example"><![CDATA[
C: RSTSALT
S: 220 SALT MDk5YTE4ZmJjODlhMTg4...
]]></sourcecode></figure>

<t><list style="symbols">
  <t>For an unauthenticated session:</t>
</list></t>

<figure><sourcecode type="example"><![CDATA[
C: RSTSALT
S: 530 5.7.0 Authentication required
]]></sourcecode></figure>

<section anchor="authentication-method-auth-hashedpass"><name>Authentication Method: AUTH HASHEDPASS</name>

<t>This protocol defines a new authentication mechanism: <spanx style="verb">AUTH HASHEDPASS</spanx>. This mechanism is intended for use only over secure channels, such as SMTP with STARTTLS or SMTPS (port 465). Servers <bcp14>MUST NOT</bcp14> advertise or accept <spanx style="verb">AUTH HASHEDPASS</spanx> over unencrypted connections.</t>

<t>Unlike <spanx style="verb">AUTH PLAIN</spanx>, which transmits the user's cleartext password (typically as a base64-encoded <spanx style="verb">\0username\0password</spanx> string), <spanx style="verb">AUTH HASHEDPASS</spanx> transmits a cryptographic hash of that string instead.</t>

<t>The client computes the hash of the <spanx style="verb">\0username\0password</spanx> string using a secure, salted <strong>Argon2</strong> hashing function. The result is then sent to the server:</t>

<figure><sourcecode type="example"><![CDATA[
C: AUTH HASHEDPASS base64(\0username\0hash(password))
S: 235 Authentication successful
]]></sourcecode></figure>

<t>The server compares the received hash to a verifier stored at account creation. This allows the server to authenticate the client <strong>without ever seeing or storing the original password</strong>.</t>

<t>Because the hash is static and reusable, this authentication mechanism <bcp14>MUST</bcp14> be used only over a secure channel (e.g., TLS). This protects the hash from replay or offline brute-force attacks.</t>

</section>
<section anchor="message-headers"><name>Message Headers</name>

<t>This protocol defines a couple headers that can be added to a message to identify the sender and the mail.</t>

<t><list style="symbols">
  <t><spanx style="verb">X-Sender-Encrypted</spanx>: This header should be added to a message if its contents are encrypted in compliance with this protocol. If it's missing or set to "no", the message is considered plain-text.</t>
</list></t>

<figure><sourcecode type="example"><![CDATA[
X-Sender-Encrypted: yes
]]></sourcecode></figure>

<t><list style="symbols">
  <t><spanx style="verb">X-Sender-Pubkey</spanx>: This header is a courtesy header that includes the sender's public key as a raw UTF-8 string with a prepended algorithm identifier.</t>
</list></t>

<figure><sourcecode type="example"><![CDATA[
X-Sender-Pubkey: ed25519 AAAAC3NzaC1lZDI1NTE5AAA...
]]></sourcecode></figure>

<t><list style="symbols">
  <t><spanx style="verb">X-Sender-Signature</spanx>: This header is a courtesy header that includes the sender's public key as a raw UTF-8 string with a prepended algorithm identifier. This signature is derived from the raw (byte-for-byte) message contents (after headers), and the optional headers <spanx style="verb">From</spanx>, <spanx style="verb">To</spanx>, <spanx style="verb">Date</spanx>, <spanx style="verb">Subject</spanx> and <spanx style="verb">Message-ID</spanx> (if they're present). This signature can be verified by issuing a <spanx style="verb">PUBKEY</spanx> command to the sender server for the sender email address and verifing the signature against the encrypted source data and the retrieved public key. This header <strong><bcp14>MUST</bcp14> not be trusted</strong> and <strong><bcp14>MUST</bcp14> be validated via PUBKEY</strong> to avoid security pitfalls.</t>
</list></t>

<figure><sourcecode type="example"><![CDATA[
X-Sender-Signature: ed25519 d75a980182b10ab7d54b...
]]></sourcecode></figure>

</section>
</section>
<section anchor="protocol-process"><name>Protocol Process</name>

<t>This protocol defines a simple process to exchange encrypted and/or signed mail.</t>

<section anchor="message-end-to-end-encryption"><name>Message End-to-End Encryption</name>

<t>To provide true E2EE to users, a few conditions must be met.</t>

<t><list style="numbers" type="1">
  <t>The plain-text (unencrypted) mail should only be available to the sender user and the receiver user, with no middle party being able to access it.</t>
  <t>The decryption (private) key should only be accessible to the user which receives the encrypted mail.</t>
</list></t>

<t>By protocol design, each user should have their own public/private keypair, which can be generated via a preferred asymmetric encryption algorithm (e.g. RSA or ED25519).</t>

<t>Each user's public key <bcp14>SHOULD</bcp14> be stored by the SMTP server responsible for handling mail for their domain (e.g., the server handling <spanx style="verb">example.com</spanx> stores public keys for users like <spanx style="verb">user@example.com</spanx>). These public keys enable senders to encrypt messages such that only the intended recipient — the holder of the corresponding private key — can decrypt them.</t>

<t>The private key — which can be used for decrypting messages that have been encrypted by its corresponding public key — <bcp14>SHOULD</bcp14> only be held by the actual user. No copy of it should exist on the SMTP server or any other place.</t>

<section anchor="keypair-generation"><name>Keypair Generation</name>

<t>Generating a keypair poses a problem. Logically, we could just generate a random keypair, store the public key on the SMTP server and keep the private key for ourselves, however this gives users a new responsibility of keeping another secret besides their authentication password.</t>

<t>The ideal scenario should be to use the user's password to derive the private key (and subsequently the public key). However, users cannot realistically be trusted to create secure and random passwords to generate a secure keypair.</t>

<t>Instead, this document proposes the solution of using a random salt, stored by the server. To put this sequence into a proper flow:</t>

<t><list style="numbers" type="1">
  <t>When the user authenticates with the SMTP server, the server checks its local salt store.</t>
  <t>If no salt is found, one is randomly generated (128 bits is sufficient) and stored by the server.</t>
  <t>The server responds to the client (user) with the base64 encoded salt, e.g.:  <vspace blankLines='1'/>
    <figure><sourcecode type="example"><![CDATA[
C: AUTH HASHEDPASS base64(\0username\0hash(password))
S: 235 Authentication successful
S: 250 SALT <base64-salt>
]]></sourcecode></figure>
  </t>
  <t>With the gotten salt, the user derives a private key for the desired algorithm using a function <spanx style="verb">KDF</spanx> by passing it the arguments as such: <spanx style="verb">KDF(password, salt)</spanx></t>
  <t>The user (still in the authenticated session) sets its public key on the SMTP server by using the <spanx style="verb">SETPUBKEY</spanx> command as described in the "Protocol Definitions" section:  <vspace blankLines='1'/>
    <figure><sourcecode type="example"><![CDATA[
C: SETPUBKEY base64(publickey)
S: 250 OK
]]></sourcecode></figure>
  </t>
</list></t>

<t>By using this method, the user and server now have their required data, without leaking any sensitive info. Since the salt is a big part of the private key, but still not sufficient to generate it, this effectively makes the private key only generatable by the user that knows the password. Of course, making the password itself longer and more random helps a lot to making the private key even more unguessable.</t>

</section>
<section anchor="encrypting-and-sending-mail"><name>Encrypting and Sending Mail</name>

<t>Encrypting mail and sending it to the receiver is fairly straightforward. We can use this flow to securely send mail to the receiver without any intermediate party being able to read it:</t>

<t><list style="numbers" type="1">
  <t>The sender (locally) writes out the e-mail with their desired content.</t>
  <t>The sender (e.g. at the "example.net" domain) connects to the receiver's domain's SMTP server and issues an <spanx style="verb">EHLO</spanx>. If the EHLO responds with the <spanx style="verb">ENCRYPTMESSAGE</spanx> and <spanx style="verb">SIGNMESSAGE</spanx> extensions, we can continue with encryption.  <vspace blankLines='1'/>
    <figure><sourcecode type="example"><![CDATA[
C: EHLO example.net
S: 250-example.com
S: ...
S: 250-ENCRYPTMESSAGE
S: 250-SIGNMESSAGE
S: 250-AUTH HASHEDPASS
]]></sourcecode></figure>
  </t>
  <t>The sender issues the <spanx style="verb">PUBKEY</spanx> command for the receiver. If the SMTP server responds with <strong>220</strong>, the receiver has a public key on the server, which we can temporarily store. Else, if the server responds with <strong>550</strong> (the SMTP server does not have a public key for that user), we can fallback to sending normal, plain-text mail.  <vspace blankLines='1'/>
    <figure><sourcecode type="example"><![CDATA[
C: PUBKEY receiver@example.com
S: 220 ed25519 QUFBQUMzTnphQzFsWkR...
]]></sourcecode></figure>
  </t>
  <t>With this public key, we can proceed to encrypt the parts of the mail that we want to secure in <strong>DATA</strong> (e.g. the "Subject" header, the message body, attachments, etc.). We also add the <spanx style="verb">X-Sender-Encrypted: yes</spanx> header to inform the receiver that the message is encrypted. The message <bcp14>MUST</bcp14> be ASCII-armored to ensure best compatability with SMTP (in base64 format).</t>
  <t>If the receiver SMTP server provides <spanx style="verb">SIGNMESSAGE</spanx> in its <spanx style="verb">EHLO</spanx>, we can proceed to sign the message. In the signature function, we can sign the agreed-upon, encrypted parts of the message (e.g. the "Subject" header, the "Date" header (or UNIX timestamp), the "From" header, the "To" header, the message body, etc.). We then append the signature to the mail in the <spanx style="verb">X-Sender-Signature</spanx> header.</t>
  <t>Optionally, we can also provide our public key in the <spanx style="verb">X-Sender-Pubkey</spanx> header. This is optional, because a receiver <bcp14>SHOULD</bcp14> issue their own <spanx style="verb">PUBKEY</spanx> request to the sender's SMTP server instead of trusting the provided one.</t>
  <t>We can now submit the mail to the receiver's SMTP server normally, using the encrypted content instead.</t>
</list></t>

<t>The whole flow in a SMTP session should look something like this:</t>

<t>User/Client side:</t>

<figure><sourcecode type="example"><![CDATA[
C: EHLO example.net
S: 250-example.com
S: ...
S: 250-ENCRYPTMESSAGE
S: 250-SIGNMESSAGE
S: 250-AUTH HASHEDPASS

C: PUBKEY receiver@example.com
S: 220 ed25519 QUFBQUMzTnphQzFsWkR...

C: QUIT
S: 221 2.0.0 Bye
]]></sourcecode></figure>

<t>Sender SMTP server side:</t>

<figure><sourcecode type="example"><![CDATA[
C: EHLO example.net
S: 250-example.com
S: ...
S: 250-ENCRYPTMESSAGE
S: 250-SIGNMESSAGE

C: MAIL FROM:<sender@example.net>
S: 250 2.1.0 OK
C: RCPT TO:<receiver@example.com>
S: 250 2.1.0 OK

C: DATA
S: 354 End data with <CR><LF>.<CR><LF>

Headers and encrypted message data here

C: <CR><LF>.<CR><LF>
S: 250 OK: queued as 12345

C: QUIT
S: 221 2.0.0 Bye
]]></sourcecode></figure>

</section>
<section anchor="reading-mail"><name>Reading Mail</name>

<t>When a receiver wants to read their mail, they can do so like this:</t>

<t><list style="numbers" type="1">
  <t>Authenticate into their SMTP server (e.g. using <spanx style="verb">AUTH HASHEDPASS</spanx>) as described above.</t>
  <t>Request their own <strong>SALT</strong> by issuing a <spanx style="verb">GETSALT</spanx> command.</t>
  <t>Rederive their private key from their password and received salt.</t>
  <t>Use a mail retrieval protocol like <strong>IMAP</strong> or <strong>POP3</strong> and decrypt/verify the mail locally using their private key and the sender's public key (gotten by issuing a <spanx style="verb">PUBKEY &lt;sender email&gt;</spanx> to the sender's SMTP server).</t>
</list></t>

</section>
<section anchor="key-rotation"><name>Key Rotation</name>

<t>Users <bcp14>MAY</bcp14> want to occasionally rotate their keypairs to secure their mail. This can be done with the following flow:</t>

<t><list style="numbers" type="1">
  <t>Authenticate into their SMTP server (e.g. using <spanx style="verb">AUTH HASHEDPASS</spanx>) as described above.</t>
  <t>Requesting a new <strong>SALT</strong> by issuing a <spanx style="verb">RSTSALT</spanx> command.</t>
  <t>Derive a new private key from their password and received salt.</t>
  <t>Issue the new public key (derived from the private key) to the SMTP server by issuing a <spanx style="verb">SETPUBKEY</spanx> command to it.</t>
  <t>The old private key <bcp14>MAY</bcp14> be saved locally to keep access to old mail.</t>
</list></t>

</section>
</section>
</section>


  </middle>

  <back>



    <references title='Normative References' anchor="sec-normative-references">



<reference anchor="RFC5321">
  <front>
    <title>Simple Mail Transfer Protocol</title>
    <author fullname="J. Klensin" initials="J." surname="Klensin"/>
    <date month="October" year="2008"/>
    <abstract>
      <t>This document is a specification of the basic protocol for Internet electronic mail transport. It consolidates, updates, and clarifies several previous documents, making all or parts of most of them obsolete. It covers the SMTP extension mechanisms and best practices for the contemporary Internet, but does not provide details about particular extensions. Although SMTP was designed as a mail transport and delivery protocol, this specification also contains information that is important to its use as a "mail submission" protocol for "split-UA" (User Agent) mail reading systems and mobile environments. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="5321"/>
  <seriesInfo name="DOI" value="10.17487/RFC5321"/>
</reference>
<reference anchor="RFC2119">
  <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>
<reference anchor="RFC8174">
  <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>



    </references>




<?line 385?>

<section numbered="false" anchor="acknowledgments"><name>Acknowledgments</name>

<t>Thanks to the email security community for inspiration, guidance, and decades of pain to learn from.</t>

</section>


  </back>

<!-- ##markdown-source:
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
2o7EcDHDX8FhbJJh3SVPiVX94L8BQAi22D1EAAA=

-->

</rfc>

