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

问题描述 投票:0回答:2

我有一个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("[email protected]");

            using (var smtpClient = new SmtpClient("smtp.gmail.com", 578))
            {
                smtpClient.Credentials = new NetworkCredential("[email protected]", "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按钮)我才能删除这些文件。

附:我还没有在实时服务器上测试过这个...目前我正在我的工作站上测试它,在Visual Studio 2017中以调试模式运行,如果这有所不同......

.net-core asp.net-core-webapi smtpclient mailmessage system.net.mail
2个回答
1
投票

在使用过程中添加附件

  //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("[email protected]");

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

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

        return Ok();
    }

0
投票

阅读Daniel的评论后,我把附件了运行文件夹(其中API运行状态)的,现在它的罚款。它看起来像Visual Studio被锁定这些文件,即使他们不是我的项目的一部分,甚至没有出现在我的解决方案资源管理器。

© www.soinside.com 2019 - 2024. All rights reserved.