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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 19:13:01