使用Microsoft.Graph API检索ItemAttachment

时间:2019-01-15 23:44:21

标签: c# microsoft-graph

我编写了一个程序,该程序成功使用Graph API来检查邮箱和检索消息。如果邮件包含标准附件(例如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.GraphMicrosoft.Graph.Core软件包。这些是我在代码中的其他所有地方都用来验证和访问Office 365数据的库。

因此,我想知道是否有人对如何使用这些库访问和下载ItemAttachment对象有任何见解。谷歌搜索有关Graph API的信息几乎总是与REST有关。我已经找到了一些使用这些库的示例代码,但都没有涉及ItemAttachments。

1 个答案:

答案 0 :(得分:0)

可以通过以下方式请求附加到邮件的项目(documentation):

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