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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 16:20:49