尝试使用.net的SMPTClient类异步发送带附件的电子邮件:
SmtpClient smtp = new SmtpClient(MailServer);
smtp.SendAsync(mailMsg, "");
smtp.SendCompleted += new SendCompletedEventHandler(MailSentCallback);
mailMsg.Dispose();
我需要在邮件成功发送后立即从我的服务器中删除附件文件。
private static void MailSentCallback(object sender, AsyncCompletedEventArgs e)
{
File.Delete(myAttachment);
}
但是当调用此方法时,出现错误: “该进程无法访问文件'myAttachment',因为它正由另一个进程使用。” 此外,邮件没有被传递。如果我使用Send方法而不是SendAsync,那么邮件传递正在运行。
我在这里缺少什么?
感谢阅读!
答案 0 :(得分:1)
首先,您应该在执行SendAsync之前连接SendCompletedEventHandler。 即:
//Wire up SendCompetedEventHandler
smtp.SendCompleted += new SendCompletedEventHandler(MailSentCallback);
//Send the Message
smtp.SendAsync(mailMsg, "");
其次,myAttachment在哪里宣布?它的范围是什么?
答案 1 :(得分:1)
好的,首先,正如mundeep所说,在SendAsync
电话会议之前连接事件处理程序。
此外,请不要Dispose()
您所做的消息,因为此时它可能还没有被“发送”......当SmtpClient
是SmtpClient
时,您基本上可能会破坏消息试图处理它。
现在,关于你的实际问题,我遇到了同样的问题,并且在内存中,文件在回调期间仍被MemoryStream
保留,所以你真的无法删除它。我认为在文件系统中附加文件最好只在这是一个持久文件时使用。
如果您要发送临时文件,请将其加载到Attachment
,然后从中创建Attachment
。
我发现,在尝试删除文件之前,首先处理回调处理程序中的{{1}}对象可能会解决附件删除问题...尽管我已经非常仔细地测试了这不会引起其他副作用。