.NET C#中如何将.msg文件转换为Exchange.EmailMessage对象
将本地.msg文件转换为Exchange.EmailMessage对象的可行方案
核心说明
无法直接将MsgReader解析的本地邮件对象转换为Microsoft.Exchange.WebServices.Data.EmailMessage,因为二者分属不同技术栈:前者是本地.msg文件的解析模型,后者是Exchange Web Services(EWS)的服务器端邮件对象。必须通过手动属性映射实现转换。
具体实现步骤
1. 使用MsgReader解析本地.msg文件
先读取.msg文件并提取所需的邮件属性(主题、发件人、收件人、正文、附件等):using MsgReader.Outlook; // 读取本地.msg文件 using var msgStorage = new Storage.Message(@"C:\path\to\your\email.msg"); // 提取核心属性 var subject = msgStorage.Subject; var senderEmail = msgStorage.SenderEmail; var toRecipients = msgStorage.Recipients.Select(r => r.Email).ToList(); var emailBody = msgStorage.BodyHtml ?? msgStorage.BodyText; var sentTime = msgStorage.SentOn;2. 初始化EWS服务并创建EmailMessage对象
配置EWS连接后,创建EmailMessage实例并将提取的属性逐一映射:using Microsoft.Exchange.WebServices.Data; // 初始化EWS服务(需替换为你的Exchange配置) var ewsService = new ExchangeService(ExchangeVersion.Exchange2019); ewsService.Credentials = new WebCredentials("your-username", "your-password"); ewsService.Url = new Uri("https://your-exchange-server-url/EWS/Exchange.asmx"); // 创建空的EmailMessage对象 var ewsEmail = new EmailMessage(ewsService); // 映射基础属性 ewsEmail.Subject = subject; ewsEmail.From = new EmailAddress(senderEmail); toRecipients.ForEach(addr => ewsEmail.ToRecipients.Add(addr)); ewsEmail.Body = new MessageBody(string.IsNullOrEmpty(emailBody) ? BodyType.Text : BodyType.HTML, emailBody); ewsEmail.DateTimeSent = sentTime; // 映射附件(如果有) foreach (var attachment in msgStorage.Attachments) { if (attachment is Storage.Attachment.FileAttachment fileAtt) { ewsEmail.Attachments.AddFileAttachment(fileAtt.FileName, fileAtt.Data); } }3. 执行后续操作
属性映射完成后,即可对EmailMessage执行EWS支持的操作,比如保存到服务器、遍历属性等:// 保存到Exchange草稿箱 ewsEmail.Save(WellKnownFolderName.Drafts); // 遍历收件人列表示例 foreach (var recipient in ewsEmail.ToRecipients) { Console.WriteLine($"Recipient: {recipient.Name} <{recipient.Address}>"); }
关键注意事项
- 确保使用的MsgReader版本与.NET环境兼容,避免解析异常;
- EWS服务需配置正确的权限和服务器地址,否则无法创建或操作
EmailMessage; - 对于.msg文件中的自定义字段、密件抄送等特殊属性,需补充对应的映射逻辑。
内容的提问来源于stack exchange,提问作者Cardo
相关产品推荐
相关产品推荐

