使用EWS C#发送视频附件时出现XML解析错误求助
解决EWS发送带多媒体附件邮件时的XML序列化错误
这个问题我之前帮同事排查过类似场景,大概率是EWS自动识别多媒体附件的MIME类型出了偏差,或者二进制流处理不当,导致服务端返回的XML响应无法正常解析。给你几个针对性的解决方案:
可能的原因&解决步骤
1. 手动指定正确的MIME类型
EWS的自动MIME类型识别对部分多媒体文件(比如mp4、png)经常会出现识别错误的情况,这会导致Exchange服务端无法正确解析附件,进而返回异常的XML响应。解决方法是手动设置Attachment的ContentType属性,对应常见多媒体类型:
- .jpg/.jpeg →
image/jpeg - .png →
image/png - .mp4 →
video/mp4
示例代码:
var imageAttachment = new FileAttachment(ewsService, @"C:\test.png"); imageAttachment.ContentType = "image/png"; // 强制指定正确的MIME类型 imageAttachment.Name = "test.png"; mailMessage.Attachments.Add(imageAttachment);
2. 确保二进制流的正确读取
如果使用StreamAttachment添加附件,务必用二进制模式读取文件流,绝对不能用文本编码方式处理多媒体文件(会破坏二进制内容,导致服务端解析失败)。示例:
using (var stream = new FileStream(@"C:\demo.mp4", FileMode.Open, FileAccess.Read)) { var videoAttachment = new StreamAttachment(ewsService, "demo.mp4", stream); videoAttachment.ContentType = "video/mp4"; mailMessage.Attachments.Add(videoAttachment); }
3. 升级EWS Managed API版本
旧版本的EWS API(比如2.0及更早)存在部分多媒体附件处理的bug,建议升级到最新的稳定版本。可以通过NuGet安装Microsoft.Exchange.WebServices包,确保版本≥2.2。
4. 检查Exchange服务器兼容性
如果你的Exchange服务器是较旧版本(如Exchange 2010),可能对新的多媒体MIME类型支持有限。可以尝试直接读取文件字节数组添加附件(这种方式兼容性更好):
byte[] fileBytes = File.ReadAllBytes(@"C:\test.jpg"); var attachment = new FileAttachment(ewsService, "test.jpg", fileBytes); attachment.ContentType = "image/jpeg"; mailMessage.Attachments.Add(attachment);
完整可运行示例代码
using Microsoft.Exchange.WebServices.Data; using System; using System.IO; class EwsMultimediaEmailSender { static void Main(string[] args) { // 初始化EWS服务实例 var ewsService = new ExchangeService(ExchangeVersion.Exchange2013_SP1); ewsService.Credentials = new WebCredentials("your-account@domain.com", "your-password"); ewsService.Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx"); // 替换为你的Exchange服务地址 // 创建邮件对象 var mail = new EmailMessage(ewsService); mail.ToRecipients.Add("recipient@domain.com"); mail.Subject = "测试多媒体附件邮件"; mail.Body = new MessageBody(BodyType.HTML, "<h3>这是一封带有图片和视频的测试邮件</h3>"); // 添加PNG图片附件 var pngAttachment = new FileAttachment(ewsService, @"C:\sample.png"); pngAttachment.ContentType = "image/png"; pngAttachment.Name = "sample.png"; mail.Attachments.Add(pngAttachment); // 添加MP4视频附件(字节数组方式) byte[] videoBytes = File.ReadAllBytes(@"C:\demo.mp4"); var videoAttachment = new FileAttachment(ewsService, "demo.mp4", videoBytes); videoAttachment.ContentType = "video/mp4"; mail.Attachments.Add(videoAttachment); try { mail.Send(); Console.WriteLine("邮件发送成功!"); } catch (Exception ex) { Console.WriteLine($"发送失败:{ex.Message}\n{ex.InnerException?.Message}"); } } }
内容的提问来源于stack exchange,提问作者Ziad Antar
相关产品推荐
相关产品推荐

