【问题标题】:Retrieving a mail message's attachments with Microsoft GraphServiceClient API & C#使用 Microsoft GraphServiceClient API 和 C# 检索邮件的附件
【发布时间】:2020-02-19 18:04:14
【问题描述】:

我有以下代码:

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 循环正在枚举附件集合。这是一个例子:

Watch of a

不包括实际附件数据。有人有下载实际附件数据的例子吗?

谢谢

根据 Darrel 的建议,我实现了以下内容。

var outlookItem = await builder.Request().GetAsync();

返回附件的元数据而不是附件本身。我在关注数据。

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(); 
        }
    }
}

Watch showing itemAttachnment vs outlookItem

【问题讨论】:

    标签: c# microsoft-graph-api microsoft-graph-mail


    【解决方案1】:

    您尝试过以下方法吗?取自here

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

    然后您可以检查它们是否是具有包含实际附件数据的 ContentBytes 属性的 FileAttachment。

    【讨论】:

    • 我使用了 .Expand("attachments") ,它返回的信息与您建议的代码返回的信息相同。我拥有的附件的 contentType 是:message/rfc822。这只是一个附加的 Rfc822 电子邮件。没有 ContentBytes 属性。
    • 您必须强制转换为 FileAttachment 类才能获取 ContentBytes 属性,但通过查看您的图像,它无论如何都是一个不同的类。我建议看看这个看起来很相似的SO question and answer
    【解决方案2】:

    这里的挑战是 Attachment 实际上是一种抽象类型,并且有多种不同的具体类型。 FileAttachment 具有 ContentBytes 属性,但 ItemAttachment 具有指向 OutlookItem 的导航属性 Item。这意味着您需要执行单独的请求来检索 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);
                }
    

    我们承认这并不直观。我们将研究如何更轻松地访问这些派生类型。

    【讨论】:

    • 感谢您的洞察力。我没有为 ItemAttachmentRequestBuilder 找到合适的名称空间?你能给我指出适当的参考吗?
    • 这很奇怪。它位于同一个 Microsoft.Graph 命名空间 github.com/microsoftgraph/msgraph-sdk-dotnet/blob/dev/src/…
    • 使用第一个示例时,itemAttachmentRequestBuilder 始终返回 null。我编辑了我的原始帖子以展示我的实现。我确定我只是错过了一些东西。
    • @WilliamHolmes 你是对的。只有派生类型的响应才使用响应中返回的 OData.Type 注释正确反序列化为其专用类型。使用 RequestBuilders 我们无法预测会返回什么类型。您将需要使用第二种方法。将来我们可能会考虑为模型创建扩展方法,以使用模型作为创建请求的根。
    • 我已经实现了第二种方法。 var outlookItem = await builder.Request().GetAsync();返回附件元数据,但不返回附件内容本身。此调用本质上返回与 mm.attachments 中已有的信息相同的信息。是否有额外的步骤来返回内容。注意这个附件的类型是:message/rfc822 这需要一些特殊处理吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2022-10-05
    • 2019-07-16
    • 2012-09-16
    • 2020-03-01
    • 1970-01-01
    • 2022-11-23
    相关资源
    最近更新 更多