2010-05-18 73 views
14

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

回答

26

MAILMESSAGE的处置,当你用它做。 它仍然锁定您作为附件添加的文件,直到您完成。

var filePath = "C:\\path\\to\\file.txt"; 
var smtpClient = new SmtpClient("mailhost"); 
using (var message = new MailMessage()) 
{ 
    message.To.Add("[email protected].com"); 
    message.From = new MailAddress("[email protected]"); 
    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

不能发送mail.Before发送您可以删除后删除附加的文件。

什么错误说,你提到的路径是使用其他进程。

MailMessage Message = new MailMessage(); 

Message.Subject = "Attachment Test"; 
Message.Body = "Check out the attachment!"; 
Message.To.Add("[email protected]"); 
Message.From = "[email protected]"; 

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

请注意,我们从MemoryStream创建了附件,我们得到了附件的任何我们想要的名称。在第二个参数附件的名称是在电子邮件中的文件,而不是本地系统硬盘驱动器上的名称的名称。事实上,附件永远不会去到本地硬盘。第三个参数是附件的Mime类型,在我们的例子中,这是文本。

编辑:use Dispose() the mail

+0

我认为你需要处理的附件对象。 – anishMarokey 2010-05-18 12:43:09

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(SmtpClient client = GetMySmtpClient()) 
using(MyMailMessage msd = new MyMailMessage()) 
{ 
    msg.Attach(filename); 
    client.send(msg); 
} 
0

你只需要在删除文件之前处理消息对象。 E.g:

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

如果您的邮件有很多附件

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

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

//delete file