удалить файл вложения - PullRequest
14 голосов
/ 18 мая 2010

Я использую System.Net.Mail для отправки почты в asp.net .. как удалить файл вложения после его отправки в виде вложения почты .. я пытался использовать метод File.Delete .. но я получаю эту ошибку .. процесс не может получить доступ к файлу path \ fun.jpg ', потому что он используется другим процессом. спасибо

Ответы [ 5 ]

26 голосов
/ 18 мая 2010

Утилизируйте 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

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

1 голос
/ 18 мая 2010

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

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

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-тип вложения, в нашем случае это текст.

Редактировать: use Dispose() the mail

0 голосов
/ 05 февраля 2015

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

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

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

//delete file
0 голосов
/ 10 сентября 2014

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

    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!
0 голосов
/ 09 июля 2013

Расширение класса 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);
}
...