从EWS迁移至Graph API:如何获取ItemAttachment的MimeContent并保存为eml?
从EWS迁移到Graph API:获取ItemAttachment的MimeContent并导出为EML文件
核心问题说明
Graph SDK中无法直接通过ItemAttachment.Item获取MimeContent,需要通过特定接口或手动转换来实现EWS中导出EML的功能,以下是两种可行方案:
方法一:直接获取ItemAttachment的原始MIME内容(推荐)
Graph API支持直接请求附件的原始内容流,对应EWS中获取MimeContent.Content的逻辑,步骤如下:
- 调用Graph API的
/me/messages/{messageId}/attachments/{attachmentId}/$value端点,获取的流即为完整的EML格式内容 - C# Graph SDK代码示例:
// 替换为实际的messageId和attachmentId var attachmentStream = await graphClient.Me.Messages["{messageId}"].Attachments["{attachmentId}"] .Content .Request() .GetAsync(); // 将流写入本地EML文件 using var fileStream = new FileStream("attachment.eml", FileMode.Create); await attachmentStream.CopyToAsync(fileStream);
- 注意:仅当ItemAttachment的
ContentType为message/rfc822时,此接口返回的内容可直接保存为EML文件。
方法二:从OutlookItem手动构建EML内容(备选)
如果已获取OutlookItem对象(如转换为Message类型),可借助MimeKit库手动映射邮件属性生成EML:
- 先安装MimeKit包:
Install-Package MimeKit - C#代码示例:
// 假设已将ItemAttachment.Item转换为Message对象 var outlookMsg = (Message)itemAttachment.Item; var mimeMsg = new MimeMessage(); // 填充邮件头部信息 mimeMsg.From.Add(new MailboxAddress(outlookMsg.From.EmailAddress.Name, outlookMsg.From.EmailAddress.Address)); mimeMsg.To.AddRange(outlookMsg.ToRecipients.Select(r => new MailboxAddress(r.EmailAddress.Name, r.EmailAddress.Address))); if (outlookMsg.CcRecipients != null) mimeMsg.Cc.AddRange(outlookMsg.CcRecipients.Select(r => new MailboxAddress(r.EmailAddress.Name, r.EmailAddress.Address))); mimeMsg.Subject = outlookMsg.Subject; mimeMsg.Date = outlookMsg.ReceivedDateTime ?? DateTimeOffset.Now; // 处理邮件正文 var bodyBuilder = new BodyBuilder(); if (outlookMsg.Body.ContentType == BodyType.Html) bodyBuilder.HtmlBody = outlookMsg.Body.Content; else bodyBuilder.TextBody = outlookMsg.Body.Content; mimeMsg.Body = bodyBuilder.ToMessageBody(); // 保存为EML文件 using var fileStream = new FileStream("exported.eml", FileMode.Create); await mimeMsg.WriteToAsync(fileStream);
- 此方法需要自行处理邮件的所有属性(包括密送、附件、邮件头等),适合无法调用Content接口的场景,但实现成本高于方法一。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

