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

EWS转Microsoft Graph:.NET Core 6邮件作为附件转发问题解决

将邮件作为附件转发:从EWS迁移到Microsoft Graph(.NET Core 6)

我正在将基于.NET Framework 4、使用Exchange Web Services(EWS)开发的Exchange邮件客户端升级为基于.NET Core 6、使用Microsoft Graph的版本。大部分功能已完成迁移,但在实现「将邮件作为附件转发」功能时遇到了困难。

EWS中的原有实现

// 此方法会调用EWS的GetItem接口。
var msgToAttach = EWS.EmailMessage.Bind(
    ServiceInstance,
    message.Source.Id,
    new EWS.PropertySet(EWS.ItemSchema.MimeContent, EWS.ItemSchema.Subject));

// 创建邮件并设置属性
var forward = new EWS.EmailMessage(ServiceInstance);
if (!bodyType.HasValue)
    bodyType = message.BodyType;

forward.Subject = subject == null ? $"FW: {message.Subject}" : subject;
forward.Body = new EWS.MessageBody(
    bodyType.Value == BodyTypes.Html ? EWS.BodyType.HTML : EWS.BodyType.Text,
    body ?? "请参考附件中的邮件");

// 添加收件人
if (to?.Any() ?? false)
    forward.ToRecipients.AddRange(to);
if (cc?.Any() ?? false)
    forward.CcRecipients.AddRange(cc);
if (bcc?.Any() ?? false)
    forward.BccRecipients.AddRange(bcc);

// 添加附件前需保存草稿,否则会抛出异常
forward.Save();

// 添加邮件作为项附件并设置属性
EWS.ItemAttachment<EWS.EmailMessage> itemAttachment = forward.Attachments.AddItemAttachment<EWS.EmailMessage>();
itemAttachment.Item.MimeContent = msgToAttach.MimeContent;
itemAttachment.Name = msgToAttach.Subject;
// 发送邮件并在已发送邮件中保存副本,此方法会调用EWS的CreateItem和SendItem接口
forward.Update(EWS.ConflictResolutionMode.AlwaysOverwrite);
forward.Send();

解决方案:Microsoft Graph实现方式

关键要点:

  • 通过_serviceInstance.Users[UserId].Messages[message.Id].Content.GetAsync()读取目标邮件的MIME内容
  • 返回的流需转换为字节数组作为附件内容
  • 附件名称必须以.eml结尾,否则Outlook无法识别为邮件(即使设置ContentType为message/rfc822也无效)

完整实现代码:

public void ForwardMessageAsAttachment(
    Message message,
    IEnumerable<string> to,
    string subject = null,
    string body = null,
    BodyType? bodyType = null)
{
    // 下载指定邮件的MIME内容
    var mimeContentStream = _serviceInstance
        .Users[UserId]
        .Messages[message.Id]
        .Content
        .Request()
        .GetAsync()
        .GetAwaiter()
        .GetResult();

    // 将MIME内容流写入缓冲区
    var buffer = new Span<Byte>(new byte[mimeContentStream.Length]);
    var mimeContent = mimeContentStream.Read(buffer);

    // 附件名称必须以.eml结尾,否则Outlook无法识别为邮件
    // 即使设置contentType为message/rfc822也不行
    var messageAsAttachment = new FileAttachment
    {
        ContentBytes = buffer.ToArray(),
        ContentType = "message/rfc822",
        Name = $"{message.Subject}.eml"
    };

    // 创建新邮件
    var forward = new Message()
    {
        Attachments = new MessageAttachmentsCollectionPage(),
        Subject = String.IsNullOrWhiteSpace(subject) ? subject : $"FW: {message.Subject}".Trim(),
        Body = new ItemBody
        {
            ContentType = bodyType,
            Content = body
        },
        ToRecipients = to.Select(x => new Recipient { EmailAddress = new EmailAddress { Address = x } })
    };

    // 添加EML附件
    forward.Attachments.Add(messageAsAttachment);

    _serviceInstance
        .Users[UserId]
        .SendMail(forward)
        .Request()
        .PostAsync()
        .GetAwaiter()
        .GetResult();
}

内容的提问来源于stack exchange,提问作者Rhett Leech

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:25:21