检索附件名称并下载附件

问题描述 投票:0回答:1

希望这里有人可以启发我如何使用 Microsoft Graph 从电子邮件下载附件。我正在尝试自动下载和处理 Office 365 邮件中特定主题的附件。到目前为止,我已成功迭代消息并将它们放入名为 messageList 的列表中,但未能成功检索每条消息中的附件名称并下载它们。这是我的代码:

     var messages = await graphClient
             .Users[userEmail]
             .MailFolders[folderId]
             .Messages
             .GetAsync((requestConfiguration) =>
             {
                 //requestConfiguration.QueryParameters.Count = true;
                 //requestConfiguration.Headers.Add("ConsistencyLevel", "eventual");
                 requestConfiguration.QueryParameters.Filter = 
                 "receivedDateTime ge 1900-01-01T00:00:00Z and (from/emailAddress/address) eq '[email protected]'";
                 requestConfiguration.QueryParameters.Orderby = new string[] { "receivedDateTime desc"};
             });
var messageList = new List<Message>();
     var pageIterator = PageIterator<Message, MessageCollectionResponse>.
         CreatePageIterator(graphClient, messages, (message) =>
     {
         
         //Console.WriteLine(message.Subject);
         messageList.Add(message);
         return true;
     });
     await pageIterator.IterateAsync();
     while (pageIterator.State != PagingState.Complete)
     {
         await pageIterator.IterateAsync();
     }
     foreach (var m in messageList)
     {
         if (m.HasAttachments == true)
         {
             var attachments=m.Attachments;
             if (attachments != null)
             {
                 foreach (var attachment in attachments)
                 {
    
                     Console.WriteLine("Attachment Name : " + attachment.Name);
                 }
             }
             Console.WriteLine(m.Subject + " Has attachment(s)");
         }
    
     }

如果我在 Autos 中查看 m 对象,它的 Attachment 属性为 null。 请帮忙,特别是下载文件。预先感谢您的帮助。

c# outlook microsoft-graph-api office365 email-attachments
1个回答
0
投票

默认情况下不包含附件,您需要使用 Expand 告诉服务器响应中应包含附件。然后你需要将每个附件转换为

FileAttachment
才能读取数据

var messages = await graphClient
 .Users[""]
 .MailFolders[""]
 .Messages
 .GetAsync((requestConfiguration) =>
 {
     requestConfiguration.QueryParameters.Filter =
     "receivedDateTime ge 1900-01-01T00:00:00Z and (from/emailAddress/address) eq '[email protected]'";
     requestConfiguration.QueryParameters.Orderby = new string[] { "receivedDateTime desc" };
     // return also attachments
     requestConfiguration.QueryParameters.Expand = new string[] { "attachments" };
 });
var messageList = new List<Message>();
var pageIterator = PageIterator<Message, MessageCollectionResponse>.
    CreatePageIterator(graphClient, messages, (message) =>
    {
        //Console.WriteLine(message.Subject);
        messageList.Add(message);
        return true;
    });
await pageIterator.IterateAsync();
while (pageIterator.State != PagingState.Complete)
{
    await pageIterator.IterateAsync();
}
foreach (var m in messageList)
{
    if (m.HasAttachments == true)
    {
        foreach (var attachment in m.Attachments)
        {
            Console.WriteLine("Attachment Name : " + attachment.Name);
            if (attachment is FileAttachment fileAttachment)
            {
                // content is base64 encoded bytes
                var base64String = Encoding.ASCII.GetString(fileAttachment.ContentBytes);
                var bytes = Convert.FromBase64String(base64String);
                File.WriteAllBytes("path", bytes);
            }
        }
    }
    Console.WriteLine(m.Subject + " Has attachment(s)");
}

从性能角度来看,过滤带附件的消息会更好

var messages = await graphClient
 .Users[""]
 .MailFolders[""]
 .Messages
 .GetAsync((requestConfiguration) =>
 {
     requestConfiguration.QueryParameters.Filter =
     "receivedDateTime ge 1900-01-01T00:00:00Z and (from/emailAddress/address) eq '[email protected]' and hasAttachments eq true";
     requestConfiguration.QueryParameters.Orderby = new string[] { "receivedDateTime desc" };
 });

并为每条消息单独调用以返回附件

var attachments = await graphClient
 .Users[""]
 .MailFolders[""]
 .Messages["{message_id}"].Attachments.GetAsync()
© www.soinside.com 2019 - 2024. All rights reserved.