draft-ietf-jmap-mdn-03.txt | draft-ietf-jmap-mdn-04.txt | |||
---|---|---|---|---|
JMAP R. Ouazana, Ed. | JMAP R. Ouazana, Ed. | |||
Internet-Draft Linagora | Internet-Draft Linagora | |||
Intended status: Standards Track November 20, 2019 | Intended status: Standards Track December 16, 2019 | |||
Expires: May 23, 2020 | Expires: June 18, 2020 | |||
Handling Message Disposition Notification with JMAP | Handling Message Disposition Notification with JMAP | |||
draft-ietf-jmap-mdn-03 | draft-ietf-jmap-mdn-04 | |||
Abstract | Abstract | |||
This document specifies a data model for handling [RFC8098] MDN | This document specifies a data model for handling [RFC8098] MDN | |||
messages with a server using JMAP. | 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. | |||
skipping to change at page 1, line 31 ¶ | skipping to change at page 1, line 31 ¶ | |||
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 May 23, 2020. | This Internet-Draft will expire on June 18, 2020. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2019 IETF Trust and the persons identified as the | Copyright (c) 2019 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 12 ¶ | skipping to change at page 2, line 12 ¶ | |||
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 . . . . . . . . . . . 3 | 1.3. Addition to the capabilities object . . . . . . . . . . . 3 | |||
2. MDN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 | 2. MDN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
2.1. MDN/set . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 2.1. MDN/set . . . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
2.2. MDN/parse . . . . . . . . . . . . . . . . . . . . . . . . 5 | 2.2. MDN/parse . . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
3. Samples . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 | 3. Samples . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
3.1. Sending an MDN for a received email . . . . . . . . . . . 5 | 3.1. Sending an MDN for a received email . . . . . . . . . . . 6 | |||
3.2. Asking for MDN when sending an email . . . . . . . . . . 6 | 3.2. Asking for MDN when sending an email . . . . . . . . . . 7 | |||
3.3. Parsing a received MDN . . . . . . . . . . . . . . . . . 7 | 3.3. Parsing a received MDN . . . . . . . . . . . . . . . . . 7 | |||
4. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 8 | 4. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 8 | |||
4.1. JMAP Capability Registration for "mdn" . . . . . . . . . 8 | 4.1. JMAP Capability Registration for "mdn" . . . . . . . . . 8 | |||
5. Security considerations . . . . . . . . . . . . . . . . . . . 8 | 5. Security considerations . . . . . . . . . . . . . . . . . . . 8 | |||
6. References . . . . . . . . . . . . . . . . . . . . . . . . . 8 | 6. References . . . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
6.1. Normative References . . . . . . . . . . . . . . . . . . 9 | 6.1. Normative References . . . . . . . . . . . . . . . . . . 9 | |||
6.2. Informative References . . . . . . . . . . . . . . . . . 9 | 6.2. Informative References . . . . . . . . . . . . . . . . . 9 | |||
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 9 | Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
1. Introduction | 1. Introduction | |||
skipping to change at page 3, line 28 ¶ | skipping to change at page 3, line 28 ¶ | |||
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. | |||
1.3. Addition to the capabilities object | 1.3. Addition to the capabilities object | |||
The capabilities object is returned as part of the standard JMAP | Capabilities are announced as part of the standard JMAP Session | |||
Session object; see the JMAP spec. Servers supporting _this_ | resource; see [RFC8620], section 2. | |||
specification MUST add a property called "urn:ietf:params:jmap:mdn" | ||||
to the capabilities object. | Support for the "MDN" data type and the "MDN/parse" method are | |||
represented by the capability "urn:ietf:params:jmap:mdn" being | ||||
present in the "capabilities" property. The capability | ||||
"urn:ietf:params:jmap:mdn" being present in the "accountCapabilities" | ||||
property of an account represents support for creating and sending | ||||
MDN messages via the "MDN/set" method. Servers that include the | ||||
capability in one or more "accountCapabilities" properties MUST also | ||||
include the property in the "capabilities" property. | ||||
The value of this "urn:ietf:params:jmap:mdn" property is an empty | ||||
object in both the JMAP session "capabilities" property and an | ||||
account's "accountCapabilities" property. | ||||
2. MDN | 2. MDN | |||
An *MDN* object has the following properties: | An *MDN* object has the following properties: | |||
o *forEmailId*: "String" Email Id of the received email this MDN is | o forEmailId: "Id|null" Email Id of the received email this MDN is | |||
relative to. | relative to. | |||
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 *reportingUA*: "String|null" Name of the MUA creating this MDN. | o reportingUA: "String|null" Name of the MUA creating this MDN. It | |||
It is used to build the MDN Report part of the MDN. | is used to build the MDN Report part of the MDN. | |||
o *disposition*: "Disposition" Object containing the diverse MDN | o disposition: "Disposition" Object containing the diverse MDN | |||
disposition options. | disposition options. | |||
o *mdnGateway*: "String|null" (server-set) Name of the gateway or | o mdnGateway: "String|null" (server-set) Name of the gateway or MTA | |||
MTA that translated a foreign (non-Internet) message disposition | that translated a foreign (non-Internet) message disposition | |||
notification into this MDN. | notification into this MDN. | |||
o *originalRecipient*: "String|null" (server-set) Original recipient | o originalRecipient: "String|null" (server-set) Original recipient | |||
address as specified by the sender of the message for which the | address as specified by the sender of the message for which the | |||
MDN is being issued. | MDN is being issued. | |||
o *finalRecipient*: "String" (server-set) Recipient for which the | o finalRecipient: "String" (server-set) Recipient for which the MDN | |||
MDN is being issued. | is being issued. | |||
o *originalMessageID*: "String|null" (server-set) Message-ID (the | o originalMessageId: "String|null" (server-set) Message-ID (the | |||
[RFC5322] header field, not the JMAP Id) of the message for which | [RFC5322] header field, not the JMAP Id) of the message for which | |||
the MDN is being issued. | the MDN is being issued. | |||
o *error*: "String[]|null" (server-set) Additional information in | o error: "String[]|null" (server-set) Additional information in the | |||
the form of text messages when the "error" disposition modifier | form of text messages when the "error" disposition modifier | |||
appears. | appears. | |||
o *extensionFields*: "String[String]|null" (server-set) Object where | o extensionFields: "String[String]|null" (server-set) Object where | |||
keys are extension-field names and values are extension-field | keys are extension-field names and values are extension-field | |||
values. | values. | |||
A *Disposition* object has the following properties: | A *Disposition* object has the following properties: | |||
o *actionMode*: "String" This MUST be one of the following strings: | o actionMode: "String" This MUST be one of the following strings: | |||
"manual-action" / "automatic-action" | "manual-action" / "automatic-action" | |||
o *sendingMode*: "String" This MUST be one of the following strings: | o sendingMode: "String" This MUST be one of the following strings: | |||
"MDN-sent-manually" / "MDN-sent-automatically" | "MDN-sent-manually" / "MDN-sent-automatically" | |||
o *type*: "String" This MUST be one of the following strings: | o type: "String" This MUST be one of the following strings: | |||
"deleted" / "dispatched" / "displayed" / "processed" | "deleted" / "dispatched" / "displayed" / "processed" | |||
See [RFC8098] for the exact meaning of these different fields. | See [RFC8098] for the exact meaning of these different fields. | |||
2.1. MDN/set | 2.1. MDN/set | |||
Standard "/set" method as described in [RFC8620] where only the | This is a standard "/set" method as described in [RFC8620] where only | |||
_create_ parameter is supported. | create is supported; any attempt to update/destroy MUST be rejected | |||
with a "forbidden" SetError. | ||||
The MDN/set method generates and sends an [RFC5322] message from an | The MDN/set method generates and sends an [RFC5322] message from an | |||
MDN object. | MDN object. | |||
The client SHOULD NOT issue a MDN/set request if the message has the | The client SHOULD NOT issue a MDN/set request if the message has the | |||
"$MDNSent" keyword set. In this case, the server MUST reject the | "$MDNSent" keyword set. In this case, the server MUST reject the | |||
submission with a standard "alreadyExists" SetError. | submission with a standard "alreadyExists" SetError. | |||
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 | |||
accordingly to the [RFC8098] specification. | accordingly to the [RFC8098] specification. | |||
For each "forEmailId" whose MDN where sent, the server MUST add a | After all items in the "MDN/set" invocation have been processed, a | |||
"$MDNSent" keyword to the email. See [RFC3503] for more details. | single implicit "Email/set" call MUST be made to set the "$MDNSent" | |||
keyword on "Email" objects referenced by "MDN" objects that have been | ||||
successfully created (see [RFC3503] for more details). The response | ||||
to this MUST be returned after the "MDN/set" response. | ||||
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 the client could expect to be an | |||
MDN. | 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 or not referencing an | "originalMessageId" property is missing or not referencing an | |||
existing email. | existing email. | |||
The Email/parse method takes the following arguments: | The MDN/parse method takes the following arguments: | |||
o *accountId*: "String" 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. | |||
o *parsed*: "Id[MDN]|null" A map of blob id to parsed MDN | o parsed: "Id[MDN]|null" A map of blob id to parsed MDN | |||
representation for each successfully parsed blob, or null if none. | representation for each successfully parsed blob, or null if none. | |||
o *notParsable*: "Id[]|null" A list of ids given that corresponded | o notParsable: "Id[]|null" A list of ids given that corresponded to | |||
to blobs that could not be parsed as MDNs, or null if none. | blobs that could not be parsed as MDNs, or null if none. | |||
o *notFound*: "Id[]|null" A list of blob ids given that could not be | o notFound: "Id[]|null" A list of blob ids given that could not be | |||
found, or null if none. | found, or null if none. | |||
3. Samples | 3. Samples | |||
3.1. Sending an MDN for a received email | 3.1. Sending an MDN for a received email | |||
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/set", { | [[ "MDN/set", { | |||
skipping to change at page 6, line 34 ¶ | skipping to change at page 6, line 47 ¶ | |||
If the email id matches an existing email without the "$MDNSent" | If the email id matches an existing email without the "$MDNSent" | |||
keyword, the server can answer: | keyword, the server can answer: | |||
[[ "MDN/set", { | [[ "MDN/set", { | |||
"accountId": "ue150411c", | "accountId": "ue150411c", | |||
"oldState": "012421s6-8nrq-4ps4-n0p4-9330r951ns21", | "oldState": "012421s6-8nrq-4ps4-n0p4-9330r951ns21", | |||
"newState": "355421f6-8aed-4cf4-a0c4-7377e951af36", | "newState": "355421f6-8aed-4cf4-a0c4-7377e951af36", | |||
"created": { | "created": { | |||
"k1546": { | "k1546": { | |||
"finalRecipient": "rfc822; john@example.com", | "finalRecipient": "rfc822; john@example.com", | |||
"originalMessageID": "<1521557867.2614.0.camel@apache.org>" | "originalMessageId": "<1521557867.2614.0.camel@apache.org>" | |||
} | } | |||
} | } | |||
}, "0" ], | }, "0" ], | |||
3.2. Asking for MDN when sending an email | 3.2. Asking for MDN when sending an email | |||
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 | |||
}, | }, | |||
"keywords": { | "keywords": { | |||
"$seen": true, | "$seen": true, | |||
skipping to change at page 8, line 21 ¶ | skipping to change at page 8, line 21 ¶ | |||
"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": "linagora.com; OpenPaaS", | |||
"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": "<1521557867.2614.0.camel@apache.org>" | |||
} | } | |||
} | } | |||
}, "0" ]] | }, "0" ]] | |||
4. IANA Considerations | 4. IANA Considerations | |||
4.1. JMAP Capability Registration for "mdn" | 4.1. JMAP Capability Registration for "mdn" | |||
IANA will register the "mdn" JMAP Capability as follows: | IANA will register the "mdn" JMAP Capability as follows: | |||
End of changes. 35 change blocks. | ||||
49 lines changed or deleted | 64 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/ |