簡體   English   中英

使用 Microsoft.Graph API 檢索 ItemAttachment

[英]Retrieving an ItemAttachment using Microsoft.Graph API

我編寫了一個程序,它成功地使用 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。

可以像這樣請求附加到消息的項目( 文檔):

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

您可以獲取 ItemAttachment 的 InputStream。 請參閱下面的 java 代碼,但對於 c# 將是類似的。 java API 缺少附件上的 .content() 選項,但您可以構建 url 並附加 $value 。

URL requestUrl = graphClient.users("user@***.com").messages("*****").attachments("****").buildRequest().getRequestUrl();
InputStream is = new FileAttachmentStreamRequestBuilder(requestUrl.toString() + "/$value", graphClient, null).buildRequest().get();
// save the file
Files.copy(is, Paths.get(fileName + extension), StandardCopyOption.REPLACE_EXISTING);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM