5

I am working on a multi-tenant daemon application. The application needs to send an email on behalf of the user. The email sent by the application would have to include another email from the user's inbox as attachment.

Can this be achieved by simply referring to the id of the existing email instead of downloading the content of the existing email?

I am trying something like this below. Using the sendMail api and trying to refer the existing email item as an attachment. But I am getting this error :

Cannot process input of abstract type Microsoft.OutlookServices.Item

Am I in the right direction? What is the best way of achieving this use case.

POST https://graph.microsoft.com/v1.0/me/sendMail HTTP/1.1
authorization: bearer {access_token}
content-type: application/json
content-length: 96

{
    "message": {
        "subject": "Meet for lunch?",
        "body": {
            "contentType": "Text",
            "content": "The new cafeteria is open."
        },
        "toRecipients": [{
            "emailAddress": {
                "address": "garthf@a830edad9050849NDA1.onmicrosoft.com"
            }
        }],
        "attachments": [
            "@odata.type": "#Microsoft.OutlookServices.ItemAttachment",
            "name": "menu.txt",
            "item": {
                "id": "AAMkADBlOWNlOWExLTdjMzktNDI5NC04MDY3LTRiZGM2NTIxMzUyNABGAAAAAAC11nCh2QXMSJ7F766v_WCUBwBSt5DMAwrBRJGMMbg9jqoYAAAGNiHGAABSt5DMAwrBRJGMMbg9jqoYAAAJXgInAAA="
                <!--This is the id of an existing email in User's inbox -->
            }
        ]
    },
    "saveToSentItems": "false"
}
Marc LaFleur
  • 31,987
  • 4
  • 37
  • 63
Dhana
  • 73
  • 3

1 Answers1

8

You cannot provide just the id of the message. If you do that, you'll get a blank attachment. Unfortunately the API is not set up to retrieve the item by ID and insert it for you.

So what that means is you need to retrieve the message yourself and include that entire JSON payload in the item property of the attachment. (See https://developer.microsoft.com/en-us/graph/docs/api-reference/v1.0/api/message_post_attachments)

There is one key detail that you need to be aware of: before adding the JSON representation of the message to be attached, you need to add an @odata.type property to it, and set it to microsoft.graph.message.

For example:

Get the message to be attached

GET /me/messages/{id}

Response

{
  "@odata.etag": "W/\"CQAAABYAAACImwNLdwWFR4SE3YBnGvEfAAAOjRuW\"",
  "id": "AAMkADRkOWJjMjdlLTM3OWMtNDU5ZS05YWZlLTRjMjkwZWE5NWMyYgBGAAAAAACUZXoWyqoWRohmHfOzvx9wBwCImwNLdwWFR4SE3YBnGvEfAAAAAAEMAACImwNLdwWFR4SE3YBnGvEfAAAOi7KdAAA=",
  "createdDateTime": "2017-10-26T12:22:03Z",
  "lastModifiedDateTime": "2017-10-26T12:22:03Z",
  "changeKey": "CQAAABYAAACImwNLdwWFR4SE3YBnGvEfAAAOjRuW",
  "categories": [],
  "receivedDateTime": "2017-10-26T12:22:03Z",
  "sentDateTime": "2017-10-26T12:22:02Z",
  "hasAttachments": false,
  "internetMessageId": "<BLUPR13MB0274245999AAD00105B87333A6450@BLUPR13MB0274.namprd13.prod.outlook.com>",
  "subject": "Test attachment stuff",
  "bodyPreview": "Hello world!",
  "importance": "normal",
  "parentFolderId": "AQMkADRkOWJjMjdlLTM3OWMtNDU5ZS05YWZlLTRjMjkwZWE5NWMyYgAuAAADlGV6FsqqFkaIZh3zs78fcAEAiJsDS3cFhUeEhADdgGca8R8AAAIBDAAAAA==",
  "conversationId": "AAQkADRkOWJjMjdlLTM3OWMtNDU5ZS05YWZlLTRjMjkwZWE5NWMyYgAQAOcAXOsMKqFDlKHlkwvtP0Y=",
  "isDeliveryReceiptRequested": false,
  "isReadReceiptRequested": false,
  "isRead": false,
  "isDraft": false,
  "webLink": "https://outlook.office365.com/owa/?ItemID=AAMkADRkOWJjMjdlLTM3OWMtNDU5ZS05YWZlLTRjMjkwZWE5NWMyYgBGAAAAAACUZXoWyqoWRohmHfOzvx9wBwCImwNLdwWFR4SE3YBnGvEfAAAAAAEMAACImwNLdwWFR4SE3YBnGvEfAAAOi7KdAAA%3D&exvsurl=1&viewmodel=ReadMessageItem",
  "inferenceClassification": "focused",
  "body": {
    "contentType": "html",
    "content": "<html>\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n<meta content=\"text/html; charset=iso-8859-1\">\r\n<style type=\"text/css\" style=\"display:none\">\r\n<!--\r\np\r\n\t{margin-top:0;\r\n\tmargin-bottom:0}\r\n-->\r\n</style>\r\n</head>\r\n<body dir=\"ltr\">\r\n<div id=\"divtagdefaultwrapper\" dir=\"ltr\" style=\"font-size:12pt; color:#000000; font-family:Calibri,Helvetica,sans-serif\">\r\n<p>Hello world!</p>\r\n</div>\r\n</body>\r\n</html>\r\n"
  },
  "sender": {
    "emailAddress": {
      "name": "MOD Administrator",
      "address": "admin@contoso.onmicrosoft.com"
    }
  },
  "from": {
    "emailAddress": {
      "name": "MOD Administrator",
      "address": "admin@contoso.onmicrosoft.com"
    }
  },
  "toRecipients": [
    {
      "emailAddress": {
        "name": "Adele Vance",
        "address": "AdeleV@contoso.onmicrosoft.com"
      }
    }
  ],
  "ccRecipients": [],
  "bccRecipients": [],
  "replyTo": []
}

Send a new mail with item attachment

Notice the addition of "@odata.type": "microsoft.graph.message", to the JSON representation of the attached message in the item property.

POST /me/sendmail
Content-Type: application/json

{
  "message": {
    "subject": "Meet for lunch?",
    "body": {
      "contentType": "Text",
      "content": "The new cafeteria is open."
    },
    "toRecipients": [{
      "emailAddress": {
        "address": "adelev@contoso.onmicrosoft.com"
      }
    }],
    "attachments": [
      {
        "@odata.type": "#microsoft.graph.itemAttachment",
        "name": "Test attachment stuff",
        "item": {
          "@odata.type": "microsoft.graph.message",
          "@odata.etag": "W/\"CQAAABYAAACImwNLdwWFR4SE3YBnGvEfAAAOjRuW\"",
          "id": "AAMkADRkOWJjMjdlLTM3OWMtNDU5ZS05YWZlLTRjMjkwZWE5NWMyYgBGAAAAAACUZXoWyqoWRohmHfOzvx9wBwCImwNLdwWFR4SE3YBnGvEfAAAAAAEMAACImwNLdwWFR4SE3YBnGvEfAAAOi7KdAAA=",
          "createdDateTime": "2017-10-26T12:22:03Z",
          "lastModifiedDateTime": "2017-10-26T12:22:03Z",
          "changeKey": "CQAAABYAAACImwNLdwWFR4SE3YBnGvEfAAAOjRuW",
          "categories": [],
          "receivedDateTime": "2017-10-26T12:22:03Z",
          "sentDateTime": "2017-10-26T12:22:02Z",
          "hasAttachments": false,
          "internetMessageId": "<BLUPR13MB0274245999AAD00105B87333A6450@BLUPR13MB0274.namprd13.prod.outlook.com>",
          "subject": "Test attachment stuff",
          "bodyPreview": "Hello world!",
          "importance": "normal",
          "parentFolderId": "AQMkADRkOWJjMjdlLTM3OWMtNDU5ZS05YWZlLTRjMjkwZWE5NWMyYgAuAAADlGV6FsqqFkaIZh3zs78fcAEAiJsDS3cFhUeEhADdgGca8R8AAAIBDAAAAA==",
          "conversationId": "AAQkADRkOWJjMjdlLTM3OWMtNDU5ZS05YWZlLTRjMjkwZWE5NWMyYgAQAOcAXOsMKqFDlKHlkwvtP0Y=",
          "isDeliveryReceiptRequested": false,
          "isReadReceiptRequested": false,
          "isRead": false,
          "isDraft": false,
          "webLink": "https://outlook.office365.com/owa/?ItemID=AAMkADRkOWJjMjdlLTM3OWMtNDU5ZS05YWZlLTRjMjkwZWE5NWMyYgBGAAAAAACUZXoWyqoWRohmHfOzvx9wBwCImwNLdwWFR4SE3YBnGvEfAAAAAAEMAACImwNLdwWFR4SE3YBnGvEfAAAOi7KdAAA%3D&exvsurl=1&viewmodel=ReadMessageItem",
          "inferenceClassification": "focused",
          "body": {
            "contentType": "html",
            "content": "<html>\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n<meta content=\"text/html; charset=iso-8859-1\">\r\n<style type=\"text/css\" style=\"display:none\">\r\n<!--\r\np\r\n\t{margin-top:0;\r\n\tmargin-bottom:0}\r\n-->\r\n</style>\r\n</head>\r\n<body dir=\"ltr\">\r\n<div id=\"divtagdefaultwrapper\" dir=\"ltr\" style=\"font-size:12pt; color:#000000; font-family:Calibri,Helvetica,sans-serif\">\r\n<p>Hello world!</p>\r\n</div>\r\n</body>\r\n</html>\r\n"
          },
          "sender": {
            "emailAddress": {
              "name": "MOD Administrator",
              "address": "admin@contoso.onmicrosoft.com"
            }
          },
          "from": {
            "emailAddress": {
              "name": "MOD Administrator",
              "address": "admin@contoso.onmicrosoft.com"
            }
          },
          "toRecipients": [
            {
              "emailAddress": {
                "name": "Adele Vance",
                "address": "AdeleV@contoso.onmicrosoft.com"
              }
            }
          ],
          "ccRecipients": [],
          "bccRecipients": [],
          "replyTo": []
        }
      }
    ]
  },
  "saveToSentItems": "false"
}
Jason Johnston
  • 17,194
  • 2
  • 20
  • 34
  • 1
    I found your answer is very helpful and informative. In my case I need to extend the same approach a bit. I just need to do an item attachment which has another attachment (Let's say a single text file). When I am trying do that in the same way, I am getting an error (I will provide more information about the error later). Please let me know you assumption, if you have a clue. – Kushan Randima Nov 20 '17 at 11:48
  • Having the same problem here. Can't send nested attachments, i.E. an ItemAttachment having one FileAttachment in it. See https://stackoverflow.com/questions/51093960/how-to-send-nested-attachments – Michael Heuberger Jul 02 '18 at 00:13
  • Will this preserve the attached email's headers? When you open the attachment again will it be read-only or will it open in draft mode? – gonzobrains Sep 22 '20 at 19:36
  • Will this include/preserve header data? When the user opens up the attached email will it show up read-only or will it be in draft/edit mode? – gonzobrains Sep 22 '20 at 20:16