如何将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
相关产品推荐
相关产品推荐

