异步发送邮件时出错

时间:2009-06-04 01:29:55

标签: c# smtp

尝试使用.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,那么邮件传递正在运行。

我在这里缺少什么?

感谢阅读!

2 个答案:

答案 0 :(得分:1)

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

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

其次,myAttachment在哪里宣布?它的范围是什么?

答案 1 :(得分:1)

好的,首先,正如mundeep所说,在SendAsync电话会议之前连接事件处理程序。

此外,请不要Dispose()您所做的消息,因为此时它可能还没有被“发送”......当SmtpClientSmtpClient时,您基本上可能会破坏消息试图处理它。

现在,关于你的实际问题,我遇到了同样的问题,并且在内存中,文件在回调期间仍被MemoryStream保留,所以你真的无法删除它。我认为在文件系统中附加文件最好只在这是一个持久文件时使用。

如果您要发送临时文件,请将其加载到Attachment,然后从中创建Attachment

我发现,在尝试删除文件之前,首先处理回调处理程序中的{{1}}对象可能会解决附件删除问题...尽管我已经非常仔细地测试了这不会引起其他副作用。