簡體   English   中英

通過SmtpClient / System.Net.Mail發送多個附件后正在使用的文件

[英]Files in use after sending multiple attachments via 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中的“停止”按鈕)之后,才可以刪除文件。

Ps我尚未在實時服務器上對此進行測試...當前,我正在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();
    }

閱讀了Daniel的評論后,我將附件從正在運行的文件夾(運行API的文件夾)中取出,現在可以了。 看起來Visual Studio鎖定了這些文件,即使它們不是我的項目的一部分,甚至沒有出現在我的解決方案資源管理器中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM