2009-06-04 65 views
0

正在试图异步发送一封电子邮件,附件使用.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’,因为它正被另一个进程使用。” 此外,邮件不被传递。如果我使用发送方法而不是SendAsync,则邮件传递正在工作。

我在这里失踪了什么?

感谢您的阅读!

回答

1

好的,首先,如mundeep所述,在调用SendAsync之前连接事件处理程序。

另外,不要Dispose()消息在哪里,因为在那时它可能还没有被“发送”呢......当SmtpClient正在尝试处理消息时,你基本上可能会破坏消息。

现在,对于您的实际问题,我遇到了同样的问题,并且在回调期间文件仍由SmtpClient保留,因此您确实无法删除它。我认为在文件系统中附加一个文件最好只在这是一个持久文件时才使用。

如果您尝试发送临时文件,请将其加载到MemoryStream中,然后从中创建一个Attachment

刚刚发生,也许你可以通过在你的回调处理程序中首先处理Attachment对象来解决附件删除问题,然后再尝试删除该文件...虽然我非常仔细地测试了这不是造成其他副作用。

+0

谢谢jerryjvl ...!我现在使用MemoryStream并将它附加到邮件消息上......没有任何“文件正在被其他进程使用”的错误的作品...再次感谢! – 2009-06-05 01:41:49

1

首先,在执行SendAsync之前,应该连接SendCompletedEventHandler。 ie:

//Wire up SendCompetedEventHandler 
smtp.SendCompleted += new SendCompletedEventHandler(MailSentCallback); 
//Send the Message 
smtp.SendAsync(mailMsg, ""); 

其次是myAttachment声明?它的范围是什么?

+0

感谢您的输入mundeep! – 2009-06-05 01:40:15