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

如何将System.Net.Mail.Message转换为EWS EmailMessage?有无简便方法?

把System.Net.Mail.Message转成EWS EmailMessage的简便方法

嘿,刚好碰到过类似的需求!遗憾的是,.NET并没有提供直接的内置转换方法来把System.Net.Mail.MailMessage转成Microsoft.Exchange.WebServices.Data.EmailMessage——毕竟这俩属于不同的API体系,一个是通用SMTP邮件类,一个是专门针对Exchange EWS的类。

不过你完全不用手动从头创建新对象,可以自己写一个扩展方法来封装转换逻辑,以后用起来就跟调用内置方法一样方便。下面是一个实用的实现示例:

using System.Net.Mail;
using Microsoft.Exchange.WebServices.Data;
using System.IO;

public static class MailMessageExtensions
{
    public static EmailMessage ConvertToEwsEmailMessage(this MailMessage smtpMessage, ExchangeService ewsService)
    {
        var ewsMessage = new EmailMessage(ewsService);

        // 基础属性映射
        ewsMessage.Subject = smtpMessage.Subject;
        ewsMessage.Body = new MessageBody(
            smtpMessage.IsBodyHtml ? BodyType.HTML : BodyType.Text, 
            smtpMessage.Body
        );
        
        // 收件人
        foreach (var to in smtpMessage.To)
        {
            ewsMessage.ToRecipients.Add(to.Address);
        }
        
        // 抄送人
        foreach (var cc in smtpMessage.CC)
        {
            ewsMessage.CcRecipients.Add(cc.Address);
        }
        
        // 密送人
        foreach (var bcc in smtpMessage.Bcc)
        {
            ewsMessage.BccRecipients.Add(bcc.Address);
        }
        
        // 发件人(按需设置)
        if (smtpMessage.From != null)
        {
            ewsMessage.From = new EmailAddress(smtpMessage.From.Address);
        }
        
        // 处理附件
        foreach (var attachment in smtpMessage.Attachments)
        {
            if (attachment is Attachment fileAttachment)
            {
                // 普通文件附件
                using (var stream = new MemoryStream())
                {
                    fileAttachment.ContentStream.CopyTo(stream);
                    stream.Position = 0;
                    ewsMessage.Attachments.AddFileAttachment(fileAttachment.Name, stream);
                }
            }
            else if (attachment is LinkedResource linkedResource)
            {
                // HTML邮件内嵌资源(比如图片)
                using (var stream = new MemoryStream())
                {
                    linkedResource.ContentStream.CopyTo(stream);
                    stream.Position = 0;
                    var ewsAttachment = ewsMessage.Attachments.AddFileAttachment(linkedResource.ContentId, stream);
                    ewsAttachment.IsInline = true;
                    ewsAttachment.ContentType = linkedResource.ContentType.ToString();
                }
            }
        }

        // 可选:映射自定义邮件头
        foreach (var header in smtpMessage.Headers)
        {
            ewsMessage.InternetMessageHeaders.Add(new InternetMessageHeader(header.Key, header.Value));
        }

        return ewsMessage;
    }
}

使用的时候就非常简洁:

// 假设你已经有了初始化好的实例
MailMessage smtpMsg = GetYourExistingSmtpMessage();
ExchangeService ewsService = GetYourConfiguredEwsService();

// 一键转换
EmailMessage ewsMsg = smtpMsg.ConvertToEwsEmailMessage(ewsService);

// 用EWS发送邮件
ewsMsg.Send();

需要注意几个小细节:

  • 这个方法覆盖了大部分常用场景,但如果你的MailMessage有特殊属性(比如邮件优先级、回复地址),可以在扩展方法里补充对应的映射逻辑。
  • 处理附件时用using块包裹流,避免资源泄漏。
  • 确保ExchangeService实例已经正确配置了Exchange版本、凭据和服务地址。

总的来说,自己写扩展方法是最省心的方式,一次封装后后续可以重复调用,不用再手动逐个属性赋值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:41:42