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

.net core 通过SmtpClient/System.Net.Mail发送多个附件后正在使用的文件,.net-core,asp.net-core-webapi,smtpclient,mailmessage,system.net.mail,.net Core,Asp.net Core Webapi,Smtpclient,Mailmessage,System.net.mail,我有一个ASP.NETCore2.2WebAPI。 在它里面,我有一个前端用来发送电子邮件的控制器。 它正在使用System.Net.Mail。 我已经尽可能地简化了代码: //POST: api/Email [HttpPost] public async Task<IActionResult> Post() { string attachment1 = Path.Combine(System.AppContext.BaseDirect

我有一个ASP.NETCore2.2WebAPI。 在它里面,我有一个前端用来发送电子邮件的控制器。 它正在使用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();
    }
尽管如此,据我所知,处理邮件消息也会处理附件。然而,这没有帮助。有什么想法吗?事实上,如果我试图从资源管理器中删除该文件,它也会告诉我该文件正在使用中。只有当我终止正在运行的项目(通过点击VisualStudio中的停止按钮)后,我才能删除这些文件


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

在使用过程中添加附件

  //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();
    }
//POST:api/Email
[HttpPost]
公共异步任务Post()
{
使用(MailMessage=newmailmessage())
{
mailMessage.Attachments.Add(新附件(@“C:\a.pdf”);
mailMessage.Attachments.Add(新附件(@“C:\b.pdf”);
mailMessage.To.Add(“someone@somehwere.com");
使用(var smtpClient=newsmtpclient(“smtp.gmail.com”,578))
{
smtpClient.Credentials=新的网络凭据(“me@gmail.com", "12345");
smtpClient.EnableSsl=true;
等待smtpClient.SendMailAsync(mailMessage);
}
}
删除(@“C:\a.pdf”);
删除(@“C:\b.pdf”);
返回Ok();
}

在阅读Daniel的评论后,我从运行API的文件夹中取出了附件,现在一切正常。看起来Visual Studio正在锁定这些文件,尽管它们不是我项目的一部分,甚至没有出现在我的解决方案资源管理器中。

非常抱歉,Daniel,我实际上是按照您的建议执行的。我只是没有;I don’我的原始问题发错了。我编辑了原始问题以反映正确的代码。对不起!!你上传这些文件是作为同一过程的一部分吗?可能问题在于上传,而不是邮件。我没有上传这些文件,不。我发布的代码就是我所做的一切。但是,我想知道这是否与VisualStudio保留文件有关。因为我注意到,只有在我关闭API(通过单击VisualStudio中的停止按钮)后,文件才会被释放,然后我才能删除它们。也许我应该将API发布到服务器上,看看它是否表现出相同的行为。可能这一切都是因为我在VS中以调试模式运行项目?我假设这些文件是项目的一部分,并且它们是由生成生成的,那么是的,调试器正在锁定它们,而不是邮件。您甚至可以在调试模式下对其进行测试,只是不“生成”文件,在开始调试后手动添加它们
  //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();
    }