Файлы, используемые после отправки нескольких вложений через 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 также удалит вложения. Однако это не помогло. Есть идеи? Действительно, если я попытаюсь удалить файл из Проводника, он также скажет мне, что файл используется. Только после того, как я уничтожу запущенный проект (нажав кнопку STOP в Visual Studio), я смогу удалить файлы.
Ps Я еще не тестировал это на живом сервере... в настоящее время я тестирую это на своей рабочей станции, работающей в режиме отладки в Visual Studio 2017, если это имеет значение...
2 ответа
Добавить вложения во время использования
//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();
}
Прочитав комментарий Даниэля, я вынул вложения из рабочей папки (где работал API), и теперь все в порядке. Похоже, Visual Studio блокировала эти файлы, хотя они не были частью моего проекта и даже не появлялись в моем обозревателе решений.