2017-09-13 128 views
0

我有,通過使用Gmail收件箱和S22.Imap閱讀電子郵件和PDF附件處理來自銷售商的發票的應用程序。它已經使用了好幾年,現在沒有任何問題,但最近,我已經看到試圖從收件箱中收到的所有消息時,「流無法讀取」錯誤使用命令進行處理:S22.Imap System.IO.IOException:數據流不能被讀取,在client.GetMessages信息(UID)

IEnumerable<uint> uids = client.Search(SearchCondition.Unseen()); 
IEnumerable<MailMessage> messages = client.GetMessages(uids); 

此異常似乎只發生在某個供應商一次發送大量電子郵件時。我一直在尋找S22.Imap documentation,但沒有找到任何幫助。

注:我沒有看到讓電子郵件的這種方式,但我上面用原來的方法是在文檔中的「下載看不見的郵件」的實際例子:

// Fetch the messages and process each one 
foreach (uint uid in uids) 
{ 
    MailMessage message = client.GetMessage(uid); 
    ProcessMessage(message); 
} 

我在這裏的問題是,我一直無法在本地重現例外,我真的不明白它是如何涉及client.GetMessages信息(UID)命令。

有沒有可以用這種方式處理的消息的最大數量,還是有更好的方式來閱讀和處理電子郵件?

如果client.GetMessages信息(UID)是獲得這些郵件的最好辦法,就是有,我可以捕獲此異常,並繼續當它發生的好辦法?

我將不勝感激任何意見。謝謝,

回答

0

不知道這將永遠甚至幫助任何人,因爲它是如此的特別與我們如何用S22來處理電子郵件這一情況,但我想我會無論如何發佈答案。

發生的主要問題是,使用client.GetMessages(uids)語法時,所有電子郵件都被標記爲「未讀」。這將收件箱中的所有電子郵件標記爲「已讀」(我對未讀電子郵件進行了統計,以確保每封電子郵件都已處理完畢)。每次更改此方法以通過收集的uid,就可以避免這個問題。這個錯誤偶爾會發生,但它並沒有給用戶造成任何困擾。下一次運行應用程序時,只處理未能處理的消息。所以基本上,我只是改變了如何使用S22.Imap檢索未讀電子郵件,並通過捕獲它們並繼續處理這些錯誤。

//get the message one at a time from uids. catching any rare errors with a message 
try 
{ 
    MailMessage message = client.GetMessage(uid); 
    ProcessMessage(message); 
} 
catch(Exception e) 
{ 
    System.Threading.Thread.Sleep(1000); 
    SendErrorEmail("An exception has been caught: " + e.ToString() + 
        Environment.NewLine + "UID: " + uid.ToString()); 
}