Извлечение вложений в почтовое сообщение с помощью Microsoft GraphServiceClient API & C# - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть следующий код:

var graphServiceClient = GraphClientFactory.GetGraphServiceClient(config.ClientId, config.Authority, config.Scopes);

MailMessagePage = await graphServiceClient.Me.MailFolders.Inbox.Messages
    .Request()
        .Expand("attachments")
    .GetAsync();

foreach (var mm in MailMessagePage)
{
    foreach (var a in mm.Attachments)
    {

    }
}

Этот код успешно загружает Входящие сообщения, а Внутренний foreach l oop перечисляет в коллекции вложений. Вот пример:

Наблюдение за

Что не включено, так это фактические данные вложения. У кого-нибудь есть пример загрузки фактических данных вложения?

Спасибо

На основе предложений от Darrel я реализовал следующее.

var outlookItem = await builder.Request ( ) .GetAsyn c ();

Возвращает метаданные для вложения, но не самого вложения. Я за данными.

MailMessagePage = await graphServiceClient.Me.MailFolders.Inbox.Messages
    .Request()
    .Expand("attachments")
    .GetAsync();

foreach (var mm in MailMessagePage)
{
    foreach (var itemAttachment in mm.Attachments)
    {
        if(itemAttachment is ItemAttachment)
        {
            var builder = new ItemAttachmentRequestBuilder(graphServiceClient.Me.Messages[mm.Id].Attachments[itemAttachment.Id].RequestUrl, graphServiceClient);
            var outlookItem = await builder.Request().GetAsync(); 
        }
    }
}

Смотреть показ элемента Прикрепление против outlookItem

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Вы пробовали ниже? Взято из здесь .

var attachments = await graphServiceClient.Me.Messages[messageId]
   .Attachments
   .Request()
   .GetAsync();

Затем вы можете проверить, является ли это FileAttachment, у которого есть свойство ContentBytes, которое содержит фактические данные вложения.

0 голосов
/ 21 февраля 2020

Проблема здесь в том, что Attachment на самом деле является абстрактным типом и существует несколько разных конкретных типов. FileAttachment имеет свойство ContentBytes, но ItemAttachment имеет свойство навигации Item, которое указывает на OutlookItem. Это означает, что вам нужно сделать отдельный запрос для извлечения OutlookItem. По-видимому, не существует построителя запросов для этого конкретного элемента.

            if (attachment is ItemAttachment)
            {
                var requestUrl = graphClient.Me.Messages[message.Id].Attachments[attachment.Id].RequestUrl + "/item"; 
                var request = new HttpRequestMessage() {
                    RequestUri = new Uri(requestUrl)
                };
                var outlookItemResponse = graphClient.HttpProvider.SendAsync(request);
               var outlookItem = new ResponseHandler(new Serializer()).HandleResponse<OutlookItem>(outlookItemResponse);
            }

Мы признаем, что это не интуитивно понятно. Мы будем исследовать, как мы можем упростить доступ к этим производным типам.

...