首页 > 解决方案 > 通过 SmtpClient/System.Net.Mail 发送多个附件后正在使用的文件

问题描述

我有一个 ASP .Net Core 2.2 Web API。在其中,我有一个前端用于发送电子邮件的控制器。它使用 System.Net.Mail。我已经尽可能地简化了代码:

    //POST: api/Email
    [HttpPost]
    public async Task<IActionResult> Post()
    {
        string attachment1 = Path.Combine(System.AppContext.BaseDirectory, "Attachments", "a.pdf");
        string attachment2 = Path.Combine(System.AppContext.BaseDirectory, "Attachments", "b.pdf");

        using (MailMessage mailMessage = new MailMessage())
        {
            mailMessage.Attachments.Add(new Attachment(attachment1));
            mailMessage.Attachments.Add(new Attachment(attachment2));                
            mailMessage.To.Add("someone@somehwere.com");

            using (var smtpClient = new SmtpClient("smtp.gmail.com", 578))
            {
                smtpClient.Credentials = new NetworkCredential("me@gmail.com", "12345");
                smtpClient.EnableSsl = true;
                await smtpClient.SendMailAsync(mailMessage);
            }
        }

        File.Delete(attachment1);
        File.Delete(attachment2);

        return Ok();
    }

当我尝试删除附件时,出现以下错误:

错误:该进程无法访问文件“C:\Users\fabsr\source\repos\PropWorx.API\PropWorx.API\bin\Debug\netcoreapp2.2\Attachments\a.pdf”,因为它正被另一个进程使用.

我试过在删除行之前添加这个:

foreach (var attachment in mailMessage.Attachments)
    attachment.Dispose();

尽管如此,根据我的阅读,处理 MailMessage 也会处理附件。然而,它没有帮助。有任何想法吗?事实上,如果我尝试从资源管理器中删除该文件,它也会告诉我该文件正在使用中。只有在我终止正在运行的项目(通过点击 Visual Studio 中的 STOP 按钮)后,我才能删除这些文件。

Ps 我还没有在实时服务器上测试过这个......目前我正在我的工作站上测试这个,在 Visual Studio 2017 的调试模式下运行,如果这有什么不同......

标签: .net-coreasp.net-core-webapismtpclientmailmessagesystem.net.mail

解决方案


使用过程中添加附件

  //POST: api/Email
    [HttpPost]
    public async Task<IActionResult> Post()
    {

        using (MailMessage mailMessage = new MailMessage())
        {
            mailMessage.Attachments.Add(new Attachment(@"C:\a.pdf"));
            mailMessage.Attachments.Add(new Attachment(@"C:\b.pdf"));
            mailMessage.To.Add("someone@somehwere.com");

            using (var smtpClient = new SmtpClient("smtp.gmail.com", 578))
            {
                smtpClient.Credentials = new NetworkCredential("me@gmail.com", "12345");
                smtpClient.EnableSsl = true;
                await smtpClient.SendMailAsync(mailMessage);
            }
        }

        File.Delete(@"C:\a.pdf");
        File.Delete(@"C:\b.pdf");

        return Ok();
    }

推荐阅读