Получение ItemAttachment с использованием Microsoft.Graph API - PullRequest
0 голосов
/ 16 января 2019

Я написал программу, которая успешно использует API-интерфейс Graph для проверки почтового ящика и получения сообщений. Если сообщение содержит стандартное вложение (например, PDF, документ Word), тогда код работает. В отладке я вижу, что они рассматриваются как тип FileAttachment Однако, если сообщение содержит вложение, являющееся другим электронным письмом, или WAV-файл, являющийся сообщением голосовой почты (что мне кажется странным), тогда программа задыхается, потому что эти вложения имеют тип ItemAttachment, и приведение не выполняется. Соответствующий код:

var msgTask = GraphClient.Me.MailFolders.Inbox.Messages.Request().Filter(filter).Expand("attachments").GetAsync();
IMailFolderMessagesCollectionPage messages = msgTask.Result;
foreach (Message msg in messages)
{
    // ...  
    foreach (Attachment att in msg.Attachments)
    {
        FileAttachment attachment = (FileAttachment)att;
        MsgFile.Attachments.Add(new System.IO.MemoryStream(attachment.ContentBytes), attachment.Name);
    }
}

Я провел небольшой поиск и нахожу документацию, используя REST, чтобы получить данные, связанные с ItemAttachment, но я не использую REST, по крайней мере, напрямую. Это приложение командной строки Windows, и с помощью NuGet я скачал пакеты Microsoft.Graph и Microsoft.Graph.Core. Это библиотеки, которые я использую повсюду в своем коде для аутентификации и доступа к данным Office 365.

Итак, мне интересно, есть ли у кого-нибудь понимание того, как использовать эти библиотеки для доступа и загрузки объектов ItemAttachment. Поиск информации о Graph API почти всегда связан с REST. Я нашел пример кода с использованием этих библиотек, но ни один из них не касается ItemAttachments.

1 Ответ

0 голосов
/ 16 января 2019

Элемент, прикрепленный к сообщению, можно запросить следующим образом ( документация ):

var attachmentRequest = graphClient.Me.MailFolders.Inbox.Messages[message.Id]
                                .Attachments[attachment.Id].Request().Expand("microsoft.graph.itemattachment/item").GetAsync();
var itemAttachment = (ItemAttachment)attachmentRequest.Result;
var itemMessage = (Message) itemAttachment.Item;  //get attached message
Console.WriteLine(itemMessage.Body);  //print message body

Пример

Демонстрирует, как получить вложения и сохранить их в файл, если вложение является файлом, и прочитать вложенное сообщение, если вложение является элементом:

var request = graphClient.Me.MailFolders.Inbox.Messages.Request().Expand("attachments").GetAsync();
var messages = request.Result;
foreach (var message in messages)
{
     foreach(var attachment in message.Attachments)
     {
          if (attachment.ODataType == "#microsoft.graph.itemAttachment")
          {

              var attachmentRequest = graphClient.Me.MailFolders.Inbox.Messages[message.Id]
                            .Attachments[attachment.Id].Request().Expand("microsoft.graph.itemattachment/item").GetAsync();
              var itemAttachment = (ItemAttachment)attachmentRequest.Result;
              var itemMessage = (Message) itemAttachment.Item;  //get attached message
              //...
          }
          else
          {
               var fileAttachment = (FileAttachment)attachment;
               System.IO.File.WriteAllBytes(System.IO.Path.Combine(downloadPath,fileAttachment.Name), fileAttachment.ContentBytes);
         }
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...