使用Microsoft EWS发送带附件邮件后无法删除附件文件的问题求助
问题描述
使用Microsoft EWS发送带PDF附件的邮件后,尝试删除该PDF文件时Windows提示“拒绝访问路径'C:\IIS_PAGES\wwwroot\FILES\report.pdf'”。此前使用.NET标准SMTP处理程序时,调用Dispose()方法解决过同类问题,但EWS中没有对应的Dispose或Clear方法,该如何解决?
原代码示例:
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013_SP1); service.Credentials = new WebCredentials("secret", "data", "ad"); service.TraceEnabled = true; service.TraceFlags = TraceFlags.All; service.Url = new Uri("https://mail.example.com/EWS/exchange.asmx"); EmailMessage email = new EmailMessage(service); email.ToRecipients.Add(receiver); email.Subject = "Test"; email.Attachments.AddFileAttachment(file); email.Body = "test"; email.Send(); File.Delete(file);
解决方案
问题出在AddFileAttachment方法会持续锁定原文件,直到EWS相关资源释放。以下是几种可靠的解决方法:
- 内存流中转附件:先将文件内容读取到内存流,再添加为附件。这样EWS操作的是内存中的数据,不会锁定原文件,发送完成后可直接删除原文件。
- 使用using语句释放资源:
ExchangeService和EmailMessage均实现了IDisposable接口,用using包裹可确保资源被及时释放,解除文件锁定。 - 延迟删除(临时方案):若前两种方法无效,可短暂延迟后再执行删除操作,给EWS足够时间释放文件句柄,但不推荐作为长期解决方案。
推荐代码示例
内存流中转方式
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013_SP1); service.Credentials = new WebCredentials("secret", "data", "ad"); service.TraceEnabled = true; service.TraceFlags = TraceFlags.All; service.Url = new Uri("https://mail.example.com/EWS/exchange.asmx"); EmailMessage email = new EmailMessage(service); email.ToRecipients.Add(receiver); email.Subject = "Test"; email.Body = "test"; // 读取文件到内存流,避免锁定原文件 using (var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read)) { var memoryStream = new MemoryStream(); fileStream.CopyTo(memoryStream); memoryStream.Position = 0; // 添加内存流作为附件,指定原文件名 email.Attachments.AddFileAttachment(Path.GetFileName(file), memoryStream); } email.Send(); // 此时文件已无锁定,可正常删除 File.Delete(file);
Using释放资源方式
using (ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013_SP1)) { service.Credentials = new WebCredentials("secret", "data", "ad"); service.TraceEnabled = true; service.TraceFlags = TraceFlags.All; service.Url = new Uri("https://mail.example.com/EWS/exchange.asmx"); using (EmailMessage email = new EmailMessage(service)) { email.ToRecipients.Add(receiver); email.Subject = "Test"; email.Attachments.AddFileAttachment(file); email.Body = "test"; email.Send(); } } // 资源已释放,文件锁定解除 File.Delete(file);
内容的提问来源于stack exchange,提问作者Hakuryuu
相关产品推荐
相关产品推荐

