删除附件文件

时间:2010-05-18 12:17:04

标签: c# email-attachments

我使用System.Net.Mail在asp.net中发送邮件.. 如何作为附件邮件发送后删除附件文件.. 我试图使用File.Delete方法..但我收到此错误.. 该进程无法访问文件路径\ fun.jpg',因为它正由另一个进程使用。 谢谢

5 个答案:

答案 0 :(得分:26)

完成后,请处理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));

输出:错误

我想如果你在处理完邮件后还有一些锁定文件的东西,你可能还有另一个文件锁,但没有代码,我们无法帮助你。

答案 1 :(得分:1)

发送邮件后无法删除附件。在发送之前,您可以删除。

错误说的是,你提到的路径是使用其他一些过程。

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

答案 2 :(得分:0)

扩展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);
}

答案 3 :(得分:0)

您只需在删除文件之前处理消息对象。例如:

    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!

答案 4 :(得分:0)

如果您的邮件有很多附件

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

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

//delete file