通过SmtpClient / System.Net.Mail发送多个附件后正在使用的文件

时间:2019-02-12 09:52:38

标签: .net-core asp.net-core-webapi smtpclient mailmessage 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中的“停止”按钮)之后,才可以删除文件。

P.s。我尚未在实时服务器上对此进行测试...目前,我正在Visual Studio 2017中以调试模式运行的工作站上对此进行测试,如果有所不同...

2 个答案:

答案 0 :(得分:1)

在使用过程中添加附件

@matches

答案 1 :(得分:0)

在阅读Daniel的评论后,我将附件从正在运行的文件夹(运行API的文件夹)中取出,现在可以了。即使它们不是我的项目的一部分,甚至没有出现在我的解决方案资源管理器中,Visual Studio似乎都在锁定这些文件。