2010-08-18 51 views
0

我正嘗試使用CDO對象發送帶附件的消息。當SMTP服務器可用並且所有信息都正確時,該消息將與附件一起正確發送。CDO消息未發送且消息的附加文件不可自由刪除

但是,如果SMTP服務器不正確,則不會發送消息(按預期方式),但它似乎在某處「卡住」。我正在使用:

Fields["http://schemas.microsoft.com/cdo/configuration/sendusing"] = 2 

我在互聯網上搜索,發現這個選項會給60秒超時。但是我附加到郵件的文件永遠不可用。

我所做的測試是發送帶附件的郵件並使用無效的SMTP服務器。然後,我等了幾分鐘,然後嘗試刪除我附加的文件。但是,當我嘗試這樣做時,我有權限問題。當我殺死發送電子郵件程序時,我可以刪除該文件。

我想知道如何配置超時以確保它放棄發送消息,當消息未發送時如何「分離」文件以及如何使程序等待消息發送(我想發送消息,然後從計算機上清除附加的文件,因此我需要知道消息何時發送或消息是否超時。

回答

1

CDO無可救藥地過時了,你真的需要考慮切換到System.Net.Mail。具體的問題聽起來像是一個文件鎖定問題。 Quacks就像CDO中的一個錯誤,它會打開附件來撰寫電子郵件,但忘記在SMTP服務器閒置時關閉文件。

這個錯誤可能會加劇.NET處理COM服務器的方式,如CDO。 COM對象在垃圾收集器運行之前不會被釋放。這可能需要一段時間,特別是當您的程序在嘗試發送電子郵件後沒有做任何重要的事情時。解決方法是調用CDO對象上的Marshal.ReleaseComObject()。如果程序中有其他CDO接口引用,則趨向於無法工作,這些引用往往是隱藏的。 GC.Collect()+ GC.WaitForPendingFinalizers()是您清除任何對象引用後的大錘。

但是,真的,使用System.Net.Mail。

+0

我會嘗試使用System.Net.Mail,因爲我不認爲問題是垃圾回收器,因爲我們在發送(或嘗試發送)電子郵件後清理對象。 謝謝你的幫助! – jpnavarini 2010-08-19 16:37:02