удалить файл вложения

Я использую систему.Сеть.Почта для отправки почты asp.net - ... . как удалить файл вложения после его отправки в качестве вложения почты.. я попытался использовать файл.метод Delete.. но я получаю эту ошибку.. процесс не может получить доступ к файлу pathfun.в JPG, потому что он используется другим процессом. спасибо

5 ответов


избавьтесь от MailMessage, когда вы закончите с ним. Он по-прежнему имеет блокировку файла, который вы добавили в качестве вложения, пока вы этого не сделаете.

var filePath = "C:\path\to\file.txt";
var smtpClient = new SmtpClient("mailhost");
using (var message = new MailMessage())
{
    message.To.Add("to@domain.com");
    message.From = new MailAddress("from@domain.com");
    message.Subject = "Test";
    message.SubjectEncoding = Encoding.UTF8;
    message.Body = "Test " + DateTime.Now;
    message.Attachments.Add(new Attachment(filePath));
}
if (File.Exists(filePath)) File.Delete(filePath);
Console.WriteLine(File.Exists(filePath));

Вывод: False

Я бы предположил, что если у вас все еще есть что-то, блокирующее файл после удаления сообщения, что у вас, вероятно, есть другая блокировка файла, но без кода мы не можем вам помочь.


вы не можете удалить прикрепленный файл после отправки почты.Перед отправкой можно удалить.

что говорит ошибка, что путь, который вы упомянули, использует какой-то другой процесс.

MailMessage Message = new MailMessage();

Message.Subject = "Attachment Test";
Message.Body = "Check out the attachment!";
Message.To.Add("webmaster@15Seconds.com");
Message.From = "someone@somedomain.com";

Message.Attachments.Add(new Attachment(memorystream, "test.txt", MediaTypeNames.Application.Text));

обратите внимание, что мы создали вложение из MemoryStream и мы должны назвать вложение все, что мы хотим. Имя вложения во втором параметре - это имя файла в электронном письме, а не имя на жестком диске локальной системы. На самом деле привязанность никогда идет на локальный жесткий диск. Третий параметр-это тип MIME вложения, в нашем случае это текст.

Edit:use Dispose() the mail


расширение класса MailMessage-хороший способ решить эту проблему и уменьшить шансы снова столкнуться с этой проблемой...

class MyMailMessage : MailMessage, IDisposable
{
    private List<string> _tempFiles = new List<string>();

    public void Attach(string filename)
    {
        base.Attachments.Add(new Attachment(filename));
        this._tempFiles.add(filename);
    }

    new public void Dispose()
    {
        base.Dispose();
        this._tempFiles.Foreach(x => File.Delete(x));
    }
}

... и не забудьте использовать конструкцию "using" (которую вы должны использовать в любом случае)...

using(SmtpClient client = GetMySmtpClient())
using(MyMailMessage msd = new MyMailMessage())
{
    msg.Attach(filename);
    client.send(msg);
}

вам просто нужно удалить объект сообщения перед удалением файла. Например:

    Dim message As New MailMessage
    message.From = New MailAddress(fromEmail, fromName)
    message.Subject = subject
    message.CC.Add(toCCEmail)
    message.Bcc.Add(toBCCEmail)
    Dim attach As Attachment = New Attachment(attachmentPath)
    message.Attachments.Add(attach)
    message.IsBodyHtml = True
    message.Body = body
    mailClient.Send(message)

    message.Dispose()   'Add this line to dispose the message!

Если ваша почта имеет много вложений

List<Attachments> lstAtt = new List<Attachments>();
Attachment att = new Attachment(file);
lstAtt.Add(att);

//finally
foreach(var a in lstAtt)
{
    a.Dispose();
}

//delete file