Вложение крупных файлов в сообщения и события Outlook

С помощью API Microsoft Graph можно вкладывать файлы размером до 150 МБ в элементы Outlook сообщение или событие. В зависимости от размера файла выберите один из двух способов вложения файла:

  • Если размер файла не превышает 3 МБ, выполните одну операцию POST в свойстве навигации attachments элемента Outlook. Узнайте, как это выполняется для сообщения или события. Успешный отклик POST включает ИД вложенного файла.
  • Если размер файла составляет от 3 до 150 МБ, создайте сеанс отправки и итеративно используйте PUT для отправки диапазонов байтов, пока не будет отправлен весь файл. Заголовок в итоговом успешном отклике PUT включает URL-адрес с ИД вложения.

Чтобы вложить в сообщение несколько файлов, выберите способ для каждого файла на основе их размеров и вложите файлы по отдельности.

В этой статье пошагово демонстрируется второй подход с созданием и использованием сеанса отправки для добавления большого вложенного файла (размером более 3 МБ) в элемент Outlook. На каждом шаге демонстрируется соответствующий код для сообщения и события. После успешной отправки целого файла в статье показано получение заголовка отклика, содержащего идентификатор вложения файла, который затем используется для получения необработанного содержимого или метаданных вложения.

Важно!

Обратите внимание на известную проблему при вложении больших файлов в сообщение или событие в общем или делегированном почтовом ящике.

Шаг 1. Создание сеанса отправки

Создайте сеанс отправки, чтобы вложить файл в сообщение или событие. Укажите файл во входном параметре AttachmentItem.

После успешной операции возвращается HTTP 201 Created и новый экземпляр объекта uploadSession, содержащий непрозрачный URL-адрес, который можно использовать в последующих операциях PUT для отправки частей этого файла. Этот экземпляр uploadSession предоставляет временное место хранения, где байты файла сохраняются до отправки всего файла.

Объект uploadSession в отклике также включает свойство nextExpectedRanges, указывающее, что начальное место отправки должно быть байтом 0.

Разрешения

Обязательно запросите разрешение Mail.ReadWrite на создание экземпляра uploadSession для сообщения и экземпляра Calendars.ReadWrite для события.

Непрозрачный URL-адрес, возвращенный свойством uploadUrl нового объекта uploadSession, проходит предварительную проверку подлинности и содержит соответствующий маркер авторизации для последующих запросов PUT в домене https://outlook.office.com. Этот маркер истекает в срок expirationDateTime. Не следует изменять этот URL-адрес для операций PUT.

Пример: создание сеанса отправки для сообщения

Запрос

POST https://graph.microsoft.com/v1.0/me/messages/AAMkADI5MAAIT3drCAAA=/attachments/createUploadSession
Content-type: application/json

{
  "AttachmentItem": {
    "attachmentType": "file",
    "name": "flower",
    "size": 3483322
  }
}

Отклик

В следующем примере отклика демонстрируется ресурс uploadSession, возвращаемый для сообщения.

HTTP/1.1 201 Created
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.uploadSession",
    "uploadUrl": "https://outlook.office.com/api/v2.0/Users('a8e8e219-4931-95c1-b73d-62626fd79c32@72aa88bf-76f0-494f-91ab-2d7cd730db47')/Messages('AAMkADI5MAAIT3drCAAA=')/AttachmentSessions('AAMkADI5MAAIT3k0tAAA=')?authtoken=eyJhbGciOiJSUzI1NiIsImtpZCI6IktmYUNIUlN6bllHMmNI",
    "expirationDateTime": "2019-09-25T01:09:30.7671707Z",
    "nextExpectedRanges": [
        "0-"
    ]
}

Пример: создание сеанса отправки для события

Запрос

POST https://graph.microsoft.com/v1.0/me/events/AAMkADU5CCmSAAA=/attachments/createUploadSession
Content-type: application/json

{
  "AttachmentItem": {
    "attachmentType": "file",
    "name": "flower",
    "size": 3483322
  }
}

Отклик

В следующем примере отклика демонстрируется ресурс uploadSession, возвращаемый для события.

HTTP/1.1 201 Created
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.uploadSession",
    "uploadUrl": "https://outlook.office.com/api/v2.0/Users('d3b9214b-dd8b-441d-b7dc-c446c9fa0e69@98a79ebe-74bf-4e07-a017-7b410848cb32')/Events('AAMkADU5CCmSAAA=')/AttachmentSessions('AAMkADU5RpAACJlCs8AAA=')?authtoken=eyJhbGciOiJSUzI1NiIsImtpZCI6IktmYUNIBtw",
    "expirationDateTime": "2020-02-22T02:46:56.7410786Z",
    "nextExpectedRanges": [
        "0-"
    ]
}

Шаг 2. Отправка диапазона байтов файла с помощью сеанса отправки

Чтобы отправить файл или часть файла, выполните запрос PUT к URL-адресу, возвращенному на шаге 1 в свойстве uploadUrl ресурса uploadSession. Можно отправить файл целиком или разделить файл на несколько диапазонов байтов. Для более высокой производительности размер каждого диапазона байтов не должен превышать 4 МБ.

Укажите заголовки и основной текст запроса, как описано ниже.

Заголовки запросов

Имя Тип Описание
Content-Length Int32 Количество байтов, отправляемых в этой операции. Для более высокой производительности количество байт в каждой операции PUT не должно превышать 4 МБ. Обязательный элемент.
Content-Range String Диапазон байтов файла, отправляемого в этой операции, начиная с байта 0, выраженный в формате bytes {start}-{end}/{total}. Обязательный элемент.
Content-Type String Тип MIME. Укажите application/octet-stream. Обязательный элемент.

Не указывайте заголовок запроса Authorization. Запрос PUT использует прошедший предварительную проверку подлинности URL-адрес из свойства uploadUrl, что позволяет получить доступ к домену https://outlook.office.com.

Основной текст запроса

Укажите фактические байты вкладываемого файла, находящиеся в диапазоне расположения, указанном в заголовке запроса Content-Range.

Отклик

После успешной отправки возвращается HTTP 200 OK и объект uploadSession. Объект отклика имеет указанные ниже свойства.

  • Свойство ExpirationDateTime указывает дату и время окончания срока действия для маркера авторизации, внедренного в значение свойства uploadUrl. Это значение даты и времени окончания срока действия остается таким же, какое было возвращено начальным объектом uploadSession на шаге 1.
  • nextExpectedRanges указывает расположение следующего байта для начала загрузки, например, "nextExpectedRanges":["2097152"]. Байты файла необходимо отправлять по порядку.
  • Свойство uploadUrl не возвращается явным образом, поскольку все операции PUT сеанса отправки используют тот же самый URL-адрес, который был возвращен при создании сеанса (на шаге 1).

Пример: первая отправка в сообщение

Запрос

PUT https://outlook.office.com/api/v2.0/Users('a8e8e219-4931-95c1-b73d-62626fd79c32@72aa88bf-76f0-494f-91ab-2d7cd730db47')/Messages('AAMkADI5MAAIT3drCAAA=')/AttachmentSessions('AAMkADI5MAAIT3k0tAAA=')?authtoken=eyJhbGciOiJSUzI1NiIsImtpZCI6IktmYUNIUlN6bllHMmNI
Content-Type: application/octet-stream
Content-Length: 2097152
Content-Range: bytes 0-2097151/3483322

{
  <bytes 0-2097151 of the file to be attached, in binary format>
}

Отклик

Следующий пример ответа показывает в свойстве nextExpectedRanges начало следующего диапазона байтов, ожидаемого сервером.

HTTP/1.1 200 OK
Content-type: application/json

{
  "@odata.context":"https://outlook.office.com/api/v2.0/$metadata#Users('a8e8e219-4931-95c1-b73d-62626fd79c32%4072aa88bf-76f0-494f-91ab-2d7cd730db47')/Messages('AAMkADI5MAAIT3drCAAA%3D')/AttachmentSessions/$entity",
  "ExpirationDateTime":"2019-09-25T01:09:30.7671707Z",
  "nextExpectedRanges":["2097152"]
}

Пример: первая отправка в событие

Запрос

PUT https://outlook.office.com/api/v2.0/Users('d3b9214b-dd8b-441d-b7dc-c446c9fa0e69@98a79ebe-74bf-4e07-a017-7b410848cb32')/Events('AAMkADU5CCmSAAA=')/AttachmentSessions('AAMkADU5RpAACJlCs8AAA=')?authtoken=eyJhbGciOiJSUzI1NiIsImtpZCI6IktmYUNIBtw
Content-Type: application/octet-stream
Content-Length: 2097152
Content-Range: bytes 0-2097151/3483322

{
  <bytes 0-2097151 of the file to be attached, in binary format>
}

Отклик

Следующий пример ответа показывает в свойстве nextExpectedRanges начало следующего диапазона байтов, ожидаемого сервером.

HTTP/1.1 200 OK
Content-type: application/json

{
    "@odata.context":"https://outlook.office.com/api/v2.0/$metadata#Users('d3b9214b-dd8b-441d-b7dc-c446c9fa0e69%4098a79ebe-74bf-4e07-a017-7b410848cb32')/Events('AAMkADU5CCmSAAA%3D')/AttachmentSessions/$entity",
    "ExpirationDateTime":"2020-02-22T02:46:56.7410786Z",
    "nextExpectedRanges":["2097152"]
}

Шаг 3. Продолжение отправки диапазонов байтов вплоть до отправки всего файла

После первоначальной отправки на шаге 2 продолжайте отправлять оставшиеся части файла, используя аналогичный запрос PUT, как описано на шаге 2, до достижения даты и времени окончания срока действия сеанса. Используйте коллекцию nextExpectedRanges, чтобы определить, с чего начать отправку следующего диапазона байтов. Вы можете увидеть несколько диапазонов, указывающих части файла, еще не полученные сервером. Это удобно, когда требуется возобновить прерванную передачу, а клиенту неизвестно состояние службы.

После успешной отправки последнего байта файла операция PUT возвращает HTTP 201 Created и заголовок Location, указывающий URL-адрес вложенного файла в домене https://outlook.office.com. Можно получить ИД вложения по этому URL-адресу и сохранить его для дальнейшего использования. В зависимости от сценария можно использовать этот ИД для получения метаданных вложения или для удаления вложения из элемента Outlook с помощью конечной точки Microsoft Graph.

В следующих примерах показана отправка последнего диапазона байтов файла в сообщение и событие из предыдущих шагов.

Пример: окончательная отправка в сообщение

Запрос

PUT https://outlook.office.com/api/v2.0/Users('a8e8e219-4931-95c1-b73d-62626fd79c32@72aa88bf-76f0-494f-91ab-2d7cd730db47')/Messages('AAMkADI5MAAIT3drCAAA=')/AttachmentSessions('AAMkADI5MAAIT3k0tAAA=')?authtoken=eyJhbGciOiJSUzI1NiIsImtpZCI6IktmYUNIUlN6bllHMmNI
Content-Type: application/octet-stream
Content-Length: 1386170
Content-Range: bytes 2097152-3483321/3483322

{
  <bytes 2097152-3483321 of the file to be attached, in binary format>
}

Отклик

В следующем примере отклика показан заголовок отклика Location, из которого можно сохранить идентификатор вложения (AAMkADI5MAAIT3drCAAABEgAQANAqbAe7qaROhYdTnUQwXm0=) для дальнейшего применения.

HTTP/1.1 201 Created

Location: https://outlook.office.com/api/v2.0/Users('a8e8e219-4931-95c1-b73d-62626fd79c32@72aa88bf-76f0-494f-91ab-2d7cd730db47')/Messages('AAMkADI5MAAIT3drCAAA=')/Attachments('AAMkADI5MAAIT3drCAAABEgAQANAqbAe7qaROhYdTnUQwXm0=')
Content-Length: 0

Пример: окончательная отправка в событие

Запрос

PUT https://outlook.office.com/api/v2.0/Users('d3b9214b-dd8b-441d-b7dc-c446c9fa0e69@98a79ebe-74bf-4e07-a017-7b410848cb32')/Events('AAMkADU5CCmSAAA=')/AttachmentSessions('AAMkADU5RpAACJlCs8AAA=')?authtoken=eyJhbGciOiJSUzI1NiIsImtpZCI6IktmYUNIBtw
Content-Type: application/octet-stream
Content-Length: 1386170
Content-Range: bytes 2097152-3483321/3483322

{
  <bytes 2097152-3483321 of the file to be attached, in binary format>
}

Отклик

В следующем примере отклика показан заголовок отклика Location, из которого можно сохранить идентификатор вложения (AAMkADU5CCmSAAANZAlYPeyQByv7Y=) для дальнейшего применения.

HTTP/1.1 201 Created

Location: https://outlook.office.com/api/v2.0/Users('d3b9214b-dd8b-441d-b7dc-c446c9fa0e69@98a79ebe-74bf-4e07-a017-7b410848cb32')/Events('AAMkADU5CCmSAAA=')/Attachments('AAMkADU5CCmSAAANZAlYPeyQByv7Y=')
Content-Length: 0

Шаг 4 (необязательно). Получение вложенного файла из элемента Outlook

Как всегда, при получении вложения из элемента Outlook размер вложения не ограничивается технически.

Тем не менее, получение большого вложенного файла в формате кодировки base64 влияет на производительность API. Если ожидается вложение большого размера:

Пример: получение необработанного файла, вложенного в событие

После примера события и использования идентификатора вложения, возвращаемого в заголовке Location предыдущего шага, в примере запроса в этом разделе демонстрируется использование параметра $value для получения необработанных данных содержимого вложения.

Разрешения

Для этой операции необходимо использовать подходящее разрешение делегирования или приложения с минимальным уровнем привилегий, Calendars.Read. Дополнительные сведения см. в разделе Разрешения для календаря.

Запрос

GET https://graph.microsoft.com/v1.0/Users('d3b9214b-dd8b-441d-b7dc-c446c9fa0e69@98a79ebe-74bf-4e07-a017-7b410848cb32')/Events('AAMkADU5CCmSAAA=')/Attachments('AAMkADU5CCmSAAANZAlYPeyQByv7Y=')/$value

Отклик

HTTP/1.1 200 OK
content-length: 3483322
Content-type: image/jpeg

{Raw bytes of the file}

Пример: получение метаданных файла, вложенного в сообщение

После примера сообщения в примере запроса в этом разделе демонстрируется использование параметра $select для получения некоторых метаданных файла, вложенного в сообщение, кроме contentBytes.

Разрешения

Для этой операции необходимо использовать подходящее разрешение делегирования или приложения с минимальным уровнем привилегий, Mail.Read. Дополнительные сведения см. в разделе Разрешения для почты.

Запрос

GET https://graph.microsoft.com/api/v1.0/Users('a8e8e219-4931-95c1-b73d-62626fd79c32@72aa88bf-76f0-494f-91ab-2d7cd730db47')/Messages('AAMkADI5MAAIT3drCAAA=')/Attachments('AAMkADI5MAAIT3drCAAABEgAQANAqbAe7qaROhYdTnUQwXm0=')?$select=lastModifiedDateTime,name,contentType,size,isInline

Отклик

HTTP/1.1 200 OK
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('a8e8e219-4931-95c1-b73d-62626fd79c32%4072aa88bf-76f0-494f-91ab-2d7cd730db47')/messages('AAMkADI5MAAIT3drCAAA%3D')/attachments/$entity",
    "@odata.type": "#microsoft.graph.fileAttachment",
    "@odata.mediaContentType": "image/jpeg",
    "id": "AAMkADI5MAAIT3drCAAABEgAQANAqbAe7qaROhYdTnUQwXm0=",
    "lastModifiedDateTime": "2019-09-24T23:27:43Z",
    "name": "flower",
    "contentType": "image/jpeg",
    "size": 3640066,
    "isInline": false
}

Альтернатива: отмена сеанса отправки

Если необходимо отменить отправку в любое время до окончания срока действия сеанса отправки, можно использовать тот же самый начальный непрозрачный URL-адрес, чтобы удалить сеанс отправки. После успешной операции возвращается HTTP 204 No Content.

Разрешения

Поскольку исходный непрозрачный URL-адрес прошел предварительную проверку подлинности и содержит подходящий маркер авторизации для последующих запросов для этого сеанса отправки, не указывайте заголовок запроса на авторизацию для этой операции.

Пример: отмена сеанса отправки для сообщения

Запрос

DELETE https://outlook.office.com/api/v2.0/Users('a8e8e219-4931-95c1-b73d-62626fd79c32@72aa88bf-76f0-494f-91ab-2d7cd730db47')/Messages('AAMkADI5MAAIT3drCAAA=')/AttachmentSessions('AAMkADI5MAAIT3k0tAAA=')?authtoken=eyJhbGciOiJSUzI1NiIsImtpZCI6IktmYUNIUlN6bllHMmNI

Отклик

HTTP/1.1 204 No content

Ошибки

ErrorAttachmentSizeShouldNotBeLessThanMinimumSize

Эта ошибка возвращается при попытке создать сеанс отправки, чтобы вложить файл размером менее 3 МБ. Если размер файла меньше 3 МБ, следует выполнить одну операцию POST для свойства навигации attachmentsсообщения или события. Успешный отклик POST включает ИД файла, прикрепленного к сообщению.