2011-08-11 96 views
1

在嘗試了很多IMAP API之後,我決定編寫自己的(大多數是內存管理器,有些只是不工作,內存不足等等等等)。C#IMAP客戶端 - 與郵件服務器的多個連接

無論如何,我已經寫了一些工作(使用TCPClient對象)的代碼,迄今爲止它的良好。但是,我希望我的一個能夠處理對郵件服務器的多個請求。例如: 假設我得到了所有UID的列表,然後循環查看每個消息的列表,獲得我想要的內容(正文,標題等)。

問題是,我將如何處理多個請求?因此,我一次只能處理10個UID,而不是每次循環處理10個UID。

這裏最好的方法是什麼?一組TCP客戶端,每個都有自己的線程?

謝謝。

回答

3

通常,建議IMAP客戶端始終只有一個最多與服務器的一個連接。附加連接不僅需要服務器上的寶貴資源,而且更重要的是IMAP規範並不保證兩個連接可以同時選擇相同的郵箱。依賴於服務器上存在的此功能可能會導致您的客戶端與這些服務器不兼容。

相反,您應該儘可能高效地使用協議。請注意,許多命令可以在一組或一組UID上運行。這允許您在指定每個UID的地方創建一個單獨的請求,而不是分別爲每個UID發出一個請求。

另一個好的做法是不要求比目前需要更多的數據。例如說你有一個消息列表。然後請不要請求所有人的詳細信息,只請求當前可見消息的信息。

我強烈建議您閱讀RFC 2683,IMAP4 Implementation Recommendations。它涵蓋了這一點。

如果您決定使用多個連接,那麼一個好的方法通常是使用異步操作,而不是明確使用單獨的線程。與某種運行循環集成的組合通常也很有用,這樣,當有數據要讀取時調用代碼,而不是代碼必須輪詢或顯式檢查它。即使您只使用單個連接,這通常也是一種好方法。請記住,根據IMAP協議,即使沒有明確要求,服務器也可能會向您發送回覆。

+0

哇謝謝你這樣一個真棒迴應。我用來加速處理郵件的一種技術是使用它們生成關鍵字,因此我可以在獲取郵件後立即處理郵件,然後從那裏我可以進行線程操作。另外,我注意到即使我沒有要求服務器,服務器也會向我發送命令!例如,如果在我正在處理的過程中添加新郵件,則會向我發送更新。 – Umair

+0

還有一件事,我使用StreamReader從網絡流中讀取響應。由於郵件服務器可以在沒有我要求的情況下向我發送回覆,因此是逐行讀取回復並確保它是我想要的最佳方法? (我問這是因爲在某些情況下,我使用StreamReader.Read()讀取響應中的字符數時會讀取大塊數據,但是這可能會被污染否?希望這是有道理的......) – Umair

+0

這很棘手得到正確的。問題在於服務器不會準確地指出與您的命令有關的響應的起始位置。我一直使用的方法是不要試圖做到這一點。如果你跟蹤你所處的狀態,選擇哪個郵箱等等,那麼你得到的迴應往往只有一種方式。因此,試圖弄清楚哪些行與命令的結果有關,通常是不必要的。 –