2009-06-04 64 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