【问题标题】:Files in use after sending multiple attachments via SmtpClient/System.Net.Mail通过 SmtpClient/System.Net.Mail 发送多个附件后正在使用的文件
【发布时间】:2019-07-05 22:19:13
【问题描述】:

我有一个 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 按钮)后,我才能删除文件。

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

【问题讨论】:

    标签: .net-core asp.net-core-webapi smtpclient mailmessage system.net.mail


    【解决方案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("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();
        }
    

    【讨论】:

    • 我很抱歉丹尼尔,我实际上是按照你的建议做的。我只是没有正确发布我原来的问题。我已经编辑了原始问题以反映正确的代码。对不起!
    • 您是否将这些文件作为同一过程的一部分上传?,问题可能出在上传中,而不是在邮寄中
    • 我不会上传这些文件,不。我发布的代码就是我正在做的一切。但是,我想知道这是否与 Visual Studio 保留文件有关。因为我注意到只有在我终止 API 后(通过单击 Visual Studio 中的停止按钮)文件才会被释放,然后我才能删除它们。也许我应该将 API 发布到服务器,看看它是否表现出相同的行为。也许这一切都是因为我在 VS 中以 Debug 模式运行项目?
    • 我假设这些文件是您项目的一部分并且它们是由构建生成的,那么是的,调试器正在锁定它们,而不是邮件
    • 您甚至可以在调试模式下对其进行测试,只是不要“构建”文件,在开始调试后手动添加它们
    【解决方案2】:

    阅读 Daniel 的评论后,我将附件从运行文件夹(运行 API 的位置)中取出,现在一切正常。看起来 Visual Studio 正在锁定这些文件,即使它们不属于我的项目,甚至没有出现在我的解决方案资源管理器中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多