Вложение крупных файлов в сообщения и события 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. Если ожидается вложение большого размера:
- Вместо получения вложенного содержимого в формате base64 можно получить необработанные данные вложенного файла.
- Чтобы получить метаданные вложенного файла, добавьте параметр
$select
, включающий только нужные свойства метаданных, исключая свойство contentBytes, которое возвращает вложенный файл в формате base64.
Пример: получение необработанного файла, вложенного в событие
После примера события и использования идентификатора вложения, возвращаемого в заголовке 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
включает ИД файла, прикрепленного к сообщению.