如何使用Graph SDK V5(.NET)发送MIME格式邮件
问题描述
我正在基于Graph SDK开发邮件发送系统,尝试发送已保存的.eml格式(MIME内容)文件。在微软官方文档中仅找到HTTP方式的实现,目前使用MIMEKIT库重构邮件后发送,但认为这并非最优方案。
当前实现代码:
byte[] newbuffer = File.ReadAllBytes(filepath); using (var memoryStream = new MemoryStream(newbuffer)) { var mimeMessage = MimeKit.MimeMessage.Load(memoryStream); var message = new Microsoft.Graph.Models.Message { Subject = mimeMessage.Subject, Body = new Microsoft.Graph.Models.ItemBody { ContentType = mimeMessage.HtmlBody != null ? Microsoft.Graph.Models.BodyType.Html : Microsoft.Graph.Models.BodyType.Text, Content = mimeMessage.HtmlBody ?? mimeMessage.TextBody }, ToRecipients = mimeMessage.To.Mailboxes.Select(mailbox => new Microsoft.Graph.Models.Recipient { EmailAddress = new Microsoft.Graph.Models.EmailAddress { Address = mailbox.Address } }).ToList() }; var draftMessage = await gsc.Users[userinfo.UserPrincipalName].Messages.PostAsync(message); foreach (var attachment in mimeMessage.Attachments.OfType<MimeKit.MimePart>()) { var attachmentStream = new MemoryStream(); attachment.Content.DecodeTo(attachmentStream); byte[] fileBytes = attachmentStream.ToArray(); attachmentStream.Dispose(); var fileAttachment = new Microsoft.Graph.Models.FileAttachment { OdataType = "#microsoft.graph.fileAttachment", ContentBytes = fileBytes, ContentType = attachment.ContentType.MimeType, Name = attachment.FileName }; await gsc.Users[userinfo.UserPrincipalName].Messages[draftMessage.Id].Attachments.PostAsync(fileAttachment); } await gsc.Users[userinfo.UserPrincipalName].Messages[draftMessage.Id].Send.PostAsync(); }
想请教是否可以使用ToPostRequestInformation实现更简便的方式,或者有其他更优方案?
最优方案:直接发送原始MIME内容
可以直接通过Graph SDK构造包含原始.eml内容的请求,无需拆解重构邮件,这是更高效简洁的方案。核心是模拟官方HTTP接口的SendMail逻辑,将.eml的原始字节作为请求体发送。
使用自定义请求信息的实现代码
var emlBytes = File.ReadAllBytes(filepath); // 构造SendMail请求的基础信息 var requestInfo = new RequestInformation { HttpMethod = Method.POST, Url = new Uri($"https://graph.microsoft.com/v1.0/users/{userinfo.UserPrincipalName}/sendMail"), Headers = new RequestHeaders { { "Content-Type", "message/rfc822" } } }; // 设置请求体为原始EML字节流 requestInfo.SetStreamContent(new MemoryStream(emlBytes)); // 发送请求并验证结果 var response = await gsc.SendAsync(requestInfo, () => new HttpResponseMessage()); response.EnsureSuccessStatusCode();
方案优势
- 无需依赖MimeKit解析重构,减少代码复杂度和潜在的格式解析错误
- 单请求完成发送,避免创建草稿、添加附件、触发发送的多步操作,提升执行效率
- 完整保留.eml文件的所有原始属性,包括抄送/密送列表、自定义邮件头、复杂嵌套附件等
注意事项
- 确保应用已配置
Mail.Send权限(委托权限或应用权限均可) - 需添加异常处理逻辑,覆盖文件读取失败、请求返回错误等场景
内容的提问来源于stack exchange,提问作者John Park
相关产品推荐
相关产品推荐

