如何使用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
相关产品推荐
相关产品推荐

