You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Microsoft Graph获取邮件附件名称并下载附件

解决Microsoft Graph下载Office 365邮件附件问题

你的核心问题是默认情况下Microsoft Graph获取邮件时不会返回Attachments属性,必须显式配置请求加载附件数据,同时需要单独处理附件内容的下载逻辑。以下是修正后的完整方案:

1. 修正邮件查询,加载附件数据

在获取邮件的请求中添加$expand=attachments参数,让Graph同时返回邮件的附件信息:

var messages = await graphClient
    .Users[userEmail]
    .MailFolders[folderId]
    .Messages
    .GetAsync((requestConfiguration) =>
    {
        requestConfiguration.QueryParameters.Filter = 
            "receivedDateTime ge 1900-01-01T00:00:00Z and (from/emailAddress/address) eq 'donotreply@sinarmasland.com'";
        requestConfiguration.QueryParameters.Orderby = new string[] { "receivedDateTime desc"};
        // 关键配置:加载邮件附件
        requestConfiguration.QueryParameters.Expand = new string[] { "attachments" };
    });

2. 遍历邮件并下载附件

遍历邮件列表时,针对FileAttachment类型(文件类附件)执行下载操作,将Base64编码的附件内容转换为本地文件:

var messageList = new List<Message>();
var pageIterator = PageIterator<Message, MessageCollectionResponse>.
    CreatePageIterator(graphClient, messages, (message) =>
{
    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 && m.Attachments != null)
    {
        Console.WriteLine($"{m.Subject} Has attachment(s)");
        foreach (var attachment in m.Attachments)
        {
            // 仅处理文件类型附件(排除邮件、日历等内嵌附件)
            if (attachment is FileAttachment fileAttachment)
            {
                Console.WriteLine($"Attachment Name : {fileAttachment.Name}");
                
                // 获取附件Base64内容
                var attachmentContent = await graphClient
                    .Users[userEmail]
                    .Messages[m.Id]
                    .Attachments[attachment.Id]
                    .Content
                    .GetAsync();
                
                // 转换为字节数组并保存到本地
                byte[] fileBytes = Convert.FromBase64String(attachmentContent);
                File.WriteAllBytes(fileAttachment.Name, fileBytes);
                Console.WriteLine($"已保存附件:{fileAttachment.Name}");
            }
        }
    }
}

注意事项

  • 若附件大小超过4MB,需使用增量下载逻辑分块获取内容,上述代码适用于小附件场景。
  • 确保应用已申请Mail.Read权限,同时程序具备本地文件系统的写入权限。
  • 添加$expand=attachments后,message.Attachments将不再为空,可正常获取附件名称等信息。

内容的提问来源于stack exchange,提问作者Tamtomo Abdi Negoro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 10:31:04