我正在尝试使用.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‘,因为它正被另一个进程使用。”此外,邮件没有被发送我使用delivered.If方法而不是SendAsync,那么邮件传递是有效的。
这里我漏掉了什么?
感谢您的阅读!
发布于 2009-06-04 01:51:08
好的,首先,正如mundeep所说,在SendAsync调用之前连接事件处理程序。
此外,不要在你发送的地方发送消息,因为在这一点上,它可能还没有‘Dispose()’……当SmtpClient试图处理消息时,您基本上是在潜在地破坏消息。
现在,对于您的实际问题,我也遇到了同样的问题,并且在回调期间,文件仍然由SmtpClient保留在内存中,所以您确实不能删除它。我认为在文件系统中附加一个文件是最好的,只有当它是一个持久文件时才是最好的。
如果您正在尝试发送临时文件,请将其加载到MemoryStream中,并从中创建一个Attachment。
我突然想到,也许你可以解决附件删除问题,方法是先在回调处理程序中处理Attachment对象,然后再尝试删除文件……虽然我会非常仔细地测试这不会引起其他副作用。
发布于 2009-06-04 01:41:03
首先,您应该在执行SendAsync之前连接好SendCompletedEventHandler。即:
//Wire up SendCompetedEventHandler
smtp.SendCompleted += new SendCompletedEventHandler(MailSentCallback);
//Send the Message
smtp.SendAsync(mailMsg, ""); 其次,在哪里声明了myAttachment?它的范围是什么?
https://stackoverflow.com/questions/948176
复制相似问题