draft-ietf-jmap-mdn-13.txt | draft-ietf-jmap-mdn-14.txt | |||
---|---|---|---|---|
JMAP R. Ouazana, Ed. | JMAP R. Ouazana, Ed. | |||
Internet-Draft Linagora | Internet-Draft Linagora | |||
Intended status: Standards Track July 2, 2020 | Intended status: Standards Track July 24, 2020 | |||
Expires: January 3, 2021 | Expires: January 25, 2021 | |||
Handling Message Disposition Notification with JMAP | Handling Message Disposition Notification with JMAP | |||
draft-ietf-jmap-mdn-13 | draft-ietf-jmap-mdn-14 | |||
Abstract | Abstract | |||
JMAP (RFC8620 - JSON Meta Application Protocol) is a generic protocol | This document specifies a data model for handling Message Disposition | |||
for synchronising data, such as mail, calendars or contacts, between | Notifications (MDNs, RFC 8098) in the JSON Meta Application Protocol | |||
a client and a server. It is optimised for mobile and web | (JMAP, RFCs 8620 and 8621). | |||
environments, and aims to provide a consistent interface to different | ||||
data types. | ||||
JMAP for Mail (RFC8621 - The JSON Meta Application Protocol (JMAP) | ||||
for Mail) specifies a data model for synchronising email data with a | ||||
server using JMAP. Clients can use this to efficiently search, | ||||
access, organise, and send messages. | ||||
MDN are defined in RFC8098 and are used as "read receipts", | ||||
"acknowledgements", or "receipt notifications". | ||||
MDN have a specific format that must be parsed or generated. The | ||||
goal of this document is to specify a data model for handling MDN | ||||
messages with a server using JMAP. | ||||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
This Internet-Draft will expire on January 3, 2021. | This Internet-Draft will expire on January 25, 2021. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2020 IETF Trust and the persons identified as the | Copyright (c) 2020 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
(https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
publication of this document. Please review these documents | publication of this document. Please review these documents | |||
skipping to change at page 2, line 25 ¶ | skipping to change at page 2, line 10 ¶ | |||
to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
described in the Simplified BSD License. | described in the Simplified BSD License. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 | |||
1.1. Notational conventions . . . . . . . . . . . . . . . . . 3 | 1.1. Notational conventions . . . . . . . . . . . . . . . . . 3 | |||
1.2. Terminology . . . . . . . . . . . . . . . . . . . . . . . 3 | 1.2. Terminology . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
1.3. Addition to the capabilities object . . . . . . . . . . . 4 | 1.3. Addition to the capabilities object . . . . . . . . . . . 3 | |||
2. MDN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 2. MDN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
2.1. MDN/send . . . . . . . . . . . . . . . . . . . . . . . . 5 | 2.1. MDN/send . . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
2.2. MDN/parse . . . . . . . . . . . . . . . . . . . . . . . . 7 | 2.2. MDN/parse . . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
3. Samples . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 | 3. Samples . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
3.1. Sending an MDN for a received email . . . . . . . . . . . 8 | 3.1. Sending an MDN for a received email message . . . . . . . 8 | |||
3.2. Asking for MDN when sending an email . . . . . . . . . . 9 | 3.2. Asking for MDN when sending an email message . . . . . . 9 | |||
3.3. Parsing a received MDN . . . . . . . . . . . . . . . . . 10 | 3.3. Parsing a received MDN . . . . . . . . . . . . . . . . . 10 | |||
4. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 11 | 4. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 11 | |||
4.1. JMAP Capability Registration for "mdn" . . . . . . . . . 11 | 4.1. JMAP Capability Registration for "mdn" . . . . . . . . . 11 | |||
4.2. JMAP Error Codes Registry . . . . . . . . . . . . . . . . 12 | 4.2. JMAP Error Codes Registry . . . . . . . . . . . . . . . . 12 | |||
4.2.1. mdnAlreadySent . . . . . . . . . . . . . . . . . . . 12 | ||||
5. Security considerations . . . . . . . . . . . . . . . . . . . 12 | 5. Security considerations . . . . . . . . . . . . . . . . . . . 12 | |||
6. References . . . . . . . . . . . . . . . . . . . . . . . . . 12 | 6. Normative References . . . . . . . . . . . . . . . . . . . . 12 | |||
6.1. Normative References . . . . . . . . . . . . . . . . . . 12 | ||||
6.2. Informative References . . . . . . . . . . . . . . . . . 13 | ||||
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 13 | Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 13 | |||
1. Introduction | 1. Introduction | |||
JMAP ([RFC8620] - JSON Meta Application Protocol) is a generic | JMAP ([RFC8620] - JSON Meta Application Protocol) is a generic | |||
protocol for synchronising data, such as mail, calendars or contacts, | protocol for synchronising data, such as mail, calendars or contacts, | |||
between a client and a server. It is optimised for mobile and web | between a client and a server. It is optimised for mobile and web | |||
environments, and aims to provide a consistent interface to different | environments, and provides a consistent interface to different data | |||
data types. | types. | |||
JMAP for Mail ([RFC8621] - The JSON Meta Application Protocol (JMAP) | JMAP for Mail ([RFC8621] - The JSON Meta Application Protocol (JMAP) | |||
for Mail) specifies a data model for synchronising email data with a | for Mail) specifies a data model for synchronising email data with a | |||
server using JMAP. Clients can use this to efficiently search, | server using JMAP. Clients can use this to efficiently search, | |||
access, organise, and send messages. | access, organise, and send messages. | |||
MDN are defined in [RFC8098] and are used as "read receipts", | Message Disposition Notifications (MDNs) are defined in [RFC8098] and | |||
"acknowledgements", or "receipt notifications". | are used as "read receipts", "acknowledgements", or "receipt | |||
notifications". | ||||
A client can have to deal with MDN in different ways: | A client can have to deal with MDNs in different ways: | |||
1. When receiving an email, an MDN can be sent to the sender. This | 1. When receiving an email message, an MDN can be sent to the | |||
specification defines an MDN/send method to cover this case. | sender. This specification defines an MDN/send method to cover | |||
this case. | ||||
2. When sending an email, an MDN can be requested. This must be | 2. When sending an email message, an MDN can be requested. This | |||
done with the help of a header, and is already specified by | must be done with the help of a header, and is already specified | |||
[RFC8098] and can already be handled by [RFC8621] this way. | by [RFC8098] and can already be handled by [RFC8621] this way. | |||
3. When receiving an MDN, the MDN could be related to an existing | 3. When receiving an MDN, the MDN could be related to an existing | |||
sent mail. This is already covered by [RFC8621] in the | sent message. This is already covered by [RFC8621] in the | |||
EmailSubmission object. Client might want to display detailed | EmailSubmission object. A client might want to display detailed | |||
information about a received MDN. This specification defines an | information about a received MDN. This specification defines an | |||
MDN/parse method to cover this case. | MDN/parse method to cover this case. | |||
1.1. Notational conventions | 1.1. Notational conventions | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
skipping to change at page 3, line 46 ¶ | skipping to change at page 3, line 32 ¶ | |||
document. | document. | |||
Servers MUST support all properties specified for the new data types | Servers MUST support all properties specified for the new data types | |||
defined in this document. | defined in this document. | |||
1.2. Terminology | 1.2. Terminology | |||
The same terminology is used in this document as in the core JMAP | The same terminology is used in this document as in the core JMAP | |||
specification. | specification. | |||
Keywords being case insensitive in IMAP but JSON being case | Because keywords are case-insensitive in IMAP but case-sensitive in | |||
sensitive, the "$mdnsent" keyword MUST always be used in lowercase. | JMAP, the "$mdnsent" keyword MUST always be used in lowercase. | |||
1.3. Addition to the capabilities object | 1.3. Addition to the capabilities object | |||
Capabilities are announced as part of the standard JMAP Session | Capabilities are announced as part of the standard JMAP Session | |||
resource; see [RFC8620], section 2. | resource; see [RFC8620], section 2. This defines a new capability, | |||
"urn:ietf:params:jmap:mdn". | ||||
The capability "urn:ietf:params:jmap:mdn" being present in the | The capability "urn:ietf:params:jmap:mdn" being present in the | |||
"accountCapabilities" property of an account represents support for | "accountCapabilities" property of an account represents support for | |||
the "MDN" data type, parsing MDN via the "MDN/parse" method, and | the "MDN" data type, parsing MDNs via the "MDN/parse" method, and | |||
creating and sending MDN messages via the "MDN/send" method. Servers | creating and sending MDN messages via the "MDN/send" method. Servers | |||
that include the capability in one or more "accountCapabilities" | that include the capability in one or more "accountCapabilities" | |||
properties MUST also include the property in the "capabilities" | properties MUST also include the property in the "capabilities" | |||
property. | property. | |||
The value of this "urn:ietf:params:jmap:mdn" property is an empty | The value of this "urn:ietf:params:jmap:mdn" property is an empty | |||
object in the account's "accountCapabilities" property. | object in the account's "accountCapabilities" property. | |||
2. MDN | 2. MDN | |||
An *MDN* object has the following properties: | An *MDN* object has the following properties: | |||
o forEmailId: "Id|null" Email Id of the received email this MDN is | o forEmailId: "Id|null" Email Id of the received message this MDN is | |||
relative to. This property MUST NOT be null for "MDN/send", but | relative to. This property MUST NOT be null for "MDN/send", but | |||
may be null in the response from the "MDN/parse" method. | may be null in the response from the "MDN/parse" method. | |||
o subject: "String|null" Subject used as "Subject" header for this | o subject: "String|null" Subject used as "Subject" header for this | |||
MDN. | MDN. | |||
o textBody: "String|null" Human readable part of the MDN, as plain | o textBody: "String|null" Human readable part of the MDN, as plain | |||
text. | text. | |||
o includeOriginalMessage: "Boolean" (default: false). If "true", | o includeOriginalMessage: "Boolean" (default: false). If "true", | |||
skipping to change at page 5, line 48 ¶ | skipping to change at page 5, line 33 ¶ | |||
The MDN/send method sends an [RFC5322] message from an MDN object. | The MDN/send method sends an [RFC5322] message from an MDN object. | |||
When calling this method the "using" property of the Request object | When calling this method the "using" property of the Request object | |||
MUST contain the capabilities "urn:ietf:params:jmap:mdn" and | MUST contain the capabilities "urn:ietf:params:jmap:mdn" and | |||
"urn:ietf:params:jmap:mail". The latter because of the implicit call | "urn:ietf:params:jmap:mail". The latter because of the implicit call | |||
to Email/set and the use of Identities, described below. The method | to Email/set and the use of Identities, described below. The method | |||
takes the following arguments: | takes the following arguments: | |||
o accountId: "Id" The id of the account to use. | o accountId: "Id" The id of the account to use. | |||
o identityId: "Id" The id of the Identity to associate with these | o identityId: "Id" The id of the Identity to associate with these | |||
MDN. The server will use this identity to define the sender of | MDNs. The server will use this identity to define the sender of | |||
the MDN and to set the finalRecipient field. | the MDNs and to set the finalRecipient field. | |||
o send: "Id[MDN]" A map of creation id (client specified) to MDN | o send: "Id[MDN]" A map of creation id (client specified) to MDN | |||
objects. | objects. | |||
o onSuccessUpdateEmail: "Id[PatchObject]|null" A map of id to an | o onSuccessUpdateEmail: "Id[PatchObject]|null" A map of id to an | |||
object containing properties to update on the Email object | object containing properties to update on the Email object | |||
referenced by the "MDN/send" if the sending succeeds. This will | referenced by the "MDN/send" if the sending succeeds. This will | |||
always be a backreference to the creation id (see example below in | always be a backward reference to the creation id (see example | |||
Section 3.1). | below in Section 3.1). | |||
The response has the following arguments: | The response has the following arguments: | |||
o accountId: "Id" The id of the account used for the call. | o accountId: "Id" The id of the account used for the call. | |||
o sent: "Id[MDN]|null" A map of creation id to MDN containing any | o sent: "Id[MDN]|null" A map of creation id to MDN containing any | |||
properties that were not set by the client. This includes any | properties that were not set by the client. This includes any | |||
properties that were omitted by the client and thus set to a | properties that were omitted by the client and thus set to a | |||
default by the server. This argument is null if no MDN objects | default by the server. This argument is null if no MDN objects | |||
were successfully sent. | were successfully sent. | |||
skipping to change at page 6, line 37 ¶ | skipping to change at page 6, line 23 ¶ | |||
o notFound: The reference Email Id cannot be found, or has no valid | o notFound: The reference Email Id cannot be found, or has no valid | |||
"Disposition-Notification-To" header. | "Disposition-Notification-To" header. | |||
o forbidden: MDN/send would violate an ACL or other permissions | o forbidden: MDN/send would violate an ACL or other permissions | |||
policy. | policy. | |||
o forbiddenFrom: The user is not allowed to use the given | o forbiddenFrom: The user is not allowed to use the given | |||
finalRecipient property. | finalRecipient property. | |||
o overQuota: MDN/send would exceed a server-defined limit on the | o overQuota: MDN/send would exceed a server-defined limit on the | |||
number or total size of sent MDN. It could include limitations on | number or total size of sent MDNs. It could include limitations | |||
sent emails. | on sent messages. | |||
o tooLarge: MDN/send would result in an MDN that exceeds a server- | o tooLarge: MDN/send would result in an MDN that exceeds a server- | |||
defined limit for the maximum size of an MDN, or more generally on | defined limit for the maximum size of an MDN, or more generally on | |||
emails. | email message. | |||
o rateLimit: Too many MDN or emails have been created recently, and | o rateLimit: Too many MDNs or email messages have been created | |||
a server-defined rate limit has been reached. It may work if | recently, and a server-defined rate limit has been reached. It | |||
tried again later. | may work if tried again later. | |||
o invalidProperties: The record given is invalid in some way. | o invalidProperties: The record given is invalid in some way. | |||
The following is a new SetError: | The following is a new SetError: | |||
o mdnAlreadySent: The message has the "$mdnsent" keyword already | o mdnAlreadySent: The message has the "$mdnsent" keyword already | |||
set. | set. | |||
If the accountId or identityId given cannot be found, the method call | If the accountId or identityId given cannot be found, the method call | |||
is rejected with an "invalidArguments" error. | is rejected with an "invalidArguments" error. | |||
The client SHOULD NOT issue an MDN/send request if the message has | The client SHOULD NOT issue an MDN/send request if the message has | |||
the "$mdnsent" keyword set. | the "$mdnsent" keyword set. | |||
When sending the MDN, the server is in charge of generating the | When sending the MDN, the server is in charge of generating the | |||
"originalRecipient", "finalRecipient" and "originalMessageId" fields | "originalRecipient", "finalRecipient" and "originalMessageId" fields | |||
according to the [RFC8098] specification. | according to the [RFC8098] specification. | |||
The client is expected to explicitly update each "Email" for which an | The client is expected to explicitly update each "Email" for which an | |||
"MDN/send" has been invoked in order to set the "$mdnsent" keyword on | "MDN/send" has been invoked in order to set the "$mdnsent" keyword on | |||
these emails. To ensure that, the server MUST reject an "MDN/send" | these messages. To ensure that, the server MUST reject an "MDN/send" | |||
which does not result in setting the keyword "$mdnsent". Thus the | which does not result in setting the keyword "$mdnsent". Thus the | |||
server MUST check that the "onSuccessUpdateEmail" property of the | server MUST check that the "onSuccessUpdateEmail" property of the | |||
method is correctly set to update this keyword. | method is correctly set to update this keyword. | |||
2.2. MDN/parse | 2.2. MDN/parse | |||
This method allows a client to parse blobs as [RFC5322] messages to | This method allows a client to parse blobs as [RFC5322] messages to | |||
get MDN objects. This can be used to parse and get detailed | get MDN objects. This can be used to parse and get detailed | |||
information about blobs referenced in the "mdnBlobIds" of the | information about blobs referenced in the "mdnBlobIds" of the | |||
EmailSubmission object, or any email the client could expect to be an | EmailSubmission object, or any email message the client could expect | |||
MDN. | to be an MDN. | |||
The "forEmailId" property can be null or missing if the | The "forEmailId" property can be null or missing if the | |||
"originalMessageId" property is missing, not referencing an existing | "originalMessageId" property is missing or does not refer to an | |||
email or if the server cannot efficiently calculate the related email | existing message, or if the server cannot efficiently calculate the | |||
(for example if several emails get the same "Message-Id" header). | related message (for example, if several messages get the same | |||
"Message-Id" header). | ||||
The MDN/parse method takes the following arguments: | The MDN/parse method takes the following arguments: | |||
o accountId: "Id" The id of the account to use. | o accountId: "Id" The id of the account to use. | |||
o blobIds: "Id[]" The ids of the blobs to parse. | o blobIds: "Id[]" The ids of the blobs to parse. | |||
The response has the following arguments: | The response has the following arguments: | |||
o accountId: "Id" The id of the account used for the call. | o accountId: "Id" The id of the account used for the call. | |||
skipping to change at page 8, line 20 ¶ | skipping to change at page 8, line 10 ¶ | |||
o requestTooLarge: The number of ids requested by the client exceeds | o requestTooLarge: The number of ids requested by the client exceeds | |||
the maximum number the server is willing to process in a single | the maximum number the server is willing to process in a single | |||
method call. | method call. | |||
o invalidArguments: If the accountId given cannot be found, the MDN | o invalidArguments: If the accountId given cannot be found, the MDN | |||
parsing is rejected with an "invalidArguments" error. | parsing is rejected with an "invalidArguments" error. | |||
3. Samples | 3. Samples | |||
3.1. Sending an MDN for a received email | 3.1. Sending an MDN for a received email message | |||
A client can use the following request to send an MDN back to the | A client can use the following request to send an MDN back to the | |||
sender: | sender: | |||
[[ "MDN/send", { | [[ "MDN/send", { | |||
"accountId": "ue150411c", | "accountId": "ue150411c", | |||
"identityId": "I64588216", | "identityId": "I64588216", | |||
"send": { | "send": { | |||
"k1546": { | "k1546": { | |||
"forEmailId": "Md45b47b4877521042cec0938", | "forEmailId": "Md45b47b4877521042cec0938", | |||
"subject": "Read receipt for: World domination", | "subject": "Read receipt for: World domination", | |||
"textBody": "This receipt shows that the email has been | "textBody": "This receipt shows that the email has been | |||
displayed on your recipient's computer. There is no | displayed on your recipient's computer. There is no | |||
guaranty it has been read or understood.", | guaranty it has been read or understood.", | |||
"reportingUA": "linagora.com; OpenPaaS", | "reportingUA": "joes-pc.cs.example.com; Foomail 97.1", | |||
"disposition": { | "disposition": { | |||
"actionMode": "manual-action", | "actionMode": "manual-action", | |||
"sendingMode": "mdn-sent-manually", | "sendingMode": "mdn-sent-manually", | |||
"type": "displayed" | "type": "displayed" | |||
}, | }, | |||
"extension": { | "extension": { | |||
"X-EXTENSION-EXAMPLE": "example.com" | "X-EXTENSION-EXAMPLE": "example.com" | |||
} | } | |||
} | } | |||
}, | }, | |||
"onSuccessUpdateEmail": { | "onSuccessUpdateEmail": { | |||
"#k1546": { | "#k1546": { | |||
"keywords/$mdnsent": true | "keywords/$mdnsent": true | |||
} | } | |||
} | } | |||
}, "0" ]] | }, "0" ]] | |||
If the email id matches an existing email without the "$mdnsent" | If the email id matches an existing email message without the | |||
keyword, the server can answer: | "$mdnsent" keyword, the server can answer: | |||
[[ "MDN/send", { | [[ "MDN/send", { | |||
"accountId": "ue150411c", | "accountId": "ue150411c", | |||
"sent": { | "sent": { | |||
"k1546": { | "k1546": { | |||
"finalRecipient": "rfc822; john@example.com", | "finalRecipient": "rfc822; john@example.com", | |||
"originalMessageId": "<1521557867.2614.0.camel@apache.org>" | "originalMessageId": "<199509192301.23456@example.org>" | |||
} | ||||
} | } | |||
} | }, "0" ], | |||
}, "0" ], | [ "Email/set", { | |||
[ "Email/set", { | "accountId": "ue150411c", | |||
"accountId": "ue150411c", | "oldState": "23", | |||
"oldState": "23", | "newState": "42", | |||
"newState": "42", | "updated": { | |||
"updated": { | "Md45b47b4877521042cec0938": {} | |||
"Md45b47b4877521042cec0938": {} | } | |||
} | }, "0" ]] | |||
}, "0" ]] | ||||
If the "$mdnsent" keyword has already been set, the server can answer | If the "$mdnsent" keyword has already been set, the server can answer | |||
an error: | an error: | |||
[[ "MDN/send", { | [[ "MDN/send", { | |||
"accountId": "ue150411c", | "accountId": "ue150411c", | |||
"notSent": { | "notSent": { | |||
"k1546": { | "k1546": { | |||
"type": "mdnAlreadySent", | "type": "mdnAlreadySent", | |||
"description" : "$mdnsent keyword is already present" | "description" : "$mdnsent keyword is already present" | |||
} | } | |||
} | } | |||
}, "0" ]] | }, "0" ]] | |||
3.2. Asking for MDN when sending an email | 3.2. Asking for MDN when sending an email message | |||
This is done with the [RFC8621] "Email/set" "create" method. | This is done with the [RFC8621] "Email/set" "create" method. | |||
[[ "Email/set", { | [[ "Email/set", { | |||
"accountId": "ue150411c", | "accountId": "ue150411c", | |||
"create": { | "create": { | |||
"k1546": { | "k1546": { | |||
"mailboxIds": { | "mailboxIds": { | |||
"2ea1ca41b38e": true | "2ea1ca41b38e": true | |||
}, | }, | |||
skipping to change at page 10, line 32 ¶ | skipping to change at page 10, line 32 ¶ | |||
"email": "john@example.com" | "email": "john@example.com" | |||
}], | }], | |||
"header:Disposition-Notification-To:asText": "joe@example.com", | "header:Disposition-Notification-To:asText": "joe@example.com", | |||
"subject": "World domination", | "subject": "World domination", | |||
... | ... | |||
} | } | |||
} | } | |||
}, "0" ]] | }, "0" ]] | |||
Note the specified "Disposition-Notification-To" header indicating | Note the specified "Disposition-Notification-To" header indicating | |||
where to send MDN back (usually the sender of the email). | where to send MDN back (usually the sender of the message). | |||
3.3. Parsing a received MDN | 3.3. Parsing a received MDN | |||
The client issues a parse request: | The client issues a parse request: | |||
[[ "MDN/parse", { | [[ "MDN/parse", { | |||
"accountId": "ue150411c", | "accountId": "ue150411c", | |||
"blobIds: [ "0f9f65ab-dc7b-4146-850f-6e4881093965" ] | "blobIds": [ "0f9f65ab-dc7b-4146-850f-6e4881093965" ] | |||
}, "0" ]] | }, "0" ]] | |||
The server responds: | The server responds: | |||
[[ "MDN/parse", { | [[ "MDN/parse", { | |||
"accountId": "ue150411c", | "accountId": "ue150411c", | |||
"parsed": { | "parsed": { | |||
"0f9f65ab-dc7b-4146-850f-6e4881093965": { | "0f9f65ab-dc7b-4146-850f-6e4881093965": { | |||
"forEmailId": "Md45b47b4877521042cec0938", | "forEmailId": "Md45b47b4877521042cec0938", | |||
"subject": "Read receipt for: World domination", | "subject": "Read receipt for: World domination", | |||
"textBody": "This receipt shows that the email has been | "textBody": "This receipt shows that the email has been | |||
displayed on your recipient's computer. There is no | displayed on your recipient's computer. There is no | |||
guaranty it has been read or understood.", | guaranty it has been read or understood.", | |||
"reportingUA": "linagora.com; OpenPaaS", | "reportingUA": "joes-pc.cs.example.com; Foomail 97.1", | |||
"disposition": { | "disposition": { | |||
"actionMode": "manual-action", | "actionMode": "manual-action", | |||
"sendingMode": "mdn-sent-manually", | "sendingMode": "mdn-sent-manually", | |||
"type": "displayed" | "type": "displayed" | |||
}, | }, | |||
"finalRecipient": "rfc822; john@example.com", | "finalRecipient": "rfc822; john@example.com", | |||
"originalMessageId": "<1521557867.2614.0.camel@apache.org>" | "originalMessageId": "<199509192301.23456@example.org>" | |||
} | ||||
} | } | |||
} | }, "0" ]] | |||
}, "0" ]] | ||||
In case of a not found blobId, the server would respond: | In case of a not found blobId, the server would respond: | |||
[[ "MDN/parse", { | [[ "MDN/parse", { | |||
"accountId": "ue150411c", | "accountId": "ue150411c", | |||
"notFound": [ "0f9f65ab-dc7b-4146-850f-6e4881093965" ] | "notFound": [ "0f9f65ab-dc7b-4146-850f-6e4881093965" ] | |||
}, "0" ]] | }, "0" ]] | |||
If the blobId has been found but is not parsable, the server would | If the blobId has been found but is not parsable, the server would | |||
respond: | respond: | |||
skipping to change at page 12, line 10 ¶ | skipping to change at page 12, line 10 ¶ | |||
Specification document: this document | Specification document: this document | |||
Intended use: common | Intended use: common | |||
Change Controller: IETF | Change Controller: IETF | |||
Security and privacy considerations: this document, section 5. | Security and privacy considerations: this document, section 5. | |||
4.2. JMAP Error Codes Registry | 4.2. JMAP Error Codes Registry | |||
The following subsection register one new error code in the "JMAP | This section registers one new error code in the "JMAP Error Codes" | |||
Error Codes" registry, as defined in [RFC8620]. | registry, as defined in [RFC8620]. | |||
4.2.1. mdnAlreadySent | ||||
JMAP Error Code: mdnAlreadySent | JMAP Error Code: mdnAlreadySent | |||
Intended use: common | Intended use: common | |||
Change controller: IETF | Change controller: IETF | |||
Reference: This document, Section 2.1 | Reference: This document, Section 2.1 | |||
Description: The message has the "$mdnsent" keyword already set. The | Description: The message has the "$mdnsent" keyword already set. The | |||
client MUST NOT try again to send an MDN for this message. | client MUST NOT try again to send an MDN for this message. | |||
5. Security considerations | 5. Security considerations | |||
The same considerations regarding MDN (see [RFC8098] and [RFC3503]) | The same considerations regarding MDN (see [RFC8098] and [RFC3503]) | |||
apply to this document. | apply to this document. | |||
In order to enforce trust regarding the relation between the user | In order to enforce trust regarding the relation between the user | |||
sending an email and the identity of this user, the server SHOULD | sending an email message and the identity of this user, the server | |||
validate in conformance to the provided Identity that the user is | SHOULD validate in conformance to the provided Identity that the user | |||
permitted to use the finalRecipient value and return a forbiddenFrom | is permitted to use the finalRecipient value and return a | |||
error if not. | forbiddenFrom error if not. | |||
6. References | ||||
6.1. Normative References | 6. Normative References | |||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
<https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
[RFC3503] Melnikov, A., "Message Disposition Notification (MDN) | [RFC3503] Melnikov, A., "Message Disposition Notification (MDN) | |||
profile for Internet Message Access Protocol (IMAP)", | profile for Internet Message Access Protocol (IMAP)", | |||
RFC 3503, DOI 10.17487/RFC3503, March 2003, | RFC 3503, DOI 10.17487/RFC3503, March 2003, | |||
<https://www.rfc-editor.org/info/rfc3503>. | <https://www.rfc-editor.org/info/rfc3503>. | |||
[RFC5322] Resnick, P., Ed., "Internet Message Format", RFC 5322, | [RFC5322] Resnick, P., Ed., "Internet Message Format", RFC 5322, | |||
DOI 10.17487/RFC5322, October 2008, | DOI 10.17487/RFC5322, October 2008, | |||
<https://www.rfc-editor.org/info/rfc5322>. | <https://www.rfc-editor.org/info/rfc5322>. | |||
[RFC8098] Hansen, T., Ed. and A. Melnikov, Ed., "Message Disposition | [RFC8098] Hansen, T., Ed. and A. Melnikov, Ed., "Message Disposition | |||
Notification", STD 85, RFC 8098, DOI 10.17487/RFC8098, | Notification", STD 85, RFC 8098, DOI 10.17487/RFC8098, | |||
February 2017, <https://www.rfc-editor.org/info/rfc8098>. | February 2017, <https://www.rfc-editor.org/info/rfc8098>. | |||
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | ||||
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | ||||
May 2017, <https://www.rfc-editor.org/info/rfc8174>. | ||||
[RFC8620] Jenkins, N. and C. Newman, "The JSON Meta Application | [RFC8620] Jenkins, N. and C. Newman, "The JSON Meta Application | |||
Protocol (JMAP)", RFC 8620, DOI 10.17487/RFC8620, July | Protocol (JMAP)", RFC 8620, DOI 10.17487/RFC8620, July | |||
2019, <https://www.rfc-editor.org/info/rfc8620>. | 2019, <https://www.rfc-editor.org/info/rfc8620>. | |||
[RFC8621] Jenkins, N. and C. Newman, "The JSON Meta Application | [RFC8621] Jenkins, N. and C. Newman, "The JSON Meta Application | |||
Protocol (JMAP) for Mail", RFC 8621, DOI 10.17487/RFC8621, | Protocol (JMAP) for Mail", RFC 8621, DOI 10.17487/RFC8621, | |||
August 2019, <https://www.rfc-editor.org/info/rfc8621>. | August 2019, <https://www.rfc-editor.org/info/rfc8621>. | |||
6.2. Informative References | ||||
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | ||||
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | ||||
May 2017, <https://www.rfc-editor.org/info/rfc8174>. | ||||
Author's Address | Author's Address | |||
Raphael Ouazana (editor) | Raphael Ouazana (editor) | |||
Linagora | Linagora | |||
100 Terrasse Boieldieu - Tour Franklin | 100 Terrasse Boieldieu - Tour Franklin | |||
Paris - La Defense CEDEX 92042 | Paris - La Defense CEDEX 92042 | |||
France | France | |||
Email: rouazana@linagora.com | Email: rouazana@linagora.com | |||
URI: https://www.linagora.com | URI: https://www.linagora.com | |||
End of changes. 41 change blocks. | ||||
120 lines changed or deleted | 101 lines changed or added | |||
This html diff was produced by rfcdiff 1.47. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |