2011-09-02 59 views
0

下面有幾個問題。一個是Resharper告訴我serverResponse值不能用在任何執行路徑中。另一個與獲取每封郵件的標題有關。如果我發出TOP 1 0,它不會拋出任何錯誤,它只是掛在那裏。如果我發出一個TOP 1 0,然後是Environment.NewLine,它會告訴我"-ERR no such message."我從以下link得到了代碼。在c#pop3客戶端發出TOP命令時出錯

for (int i = 0; i <= messageCount; i++) 
{ 
    _data = "TOP " + i + " 0"; 
    _sizeOfData = Encoding.ASCII.GetBytes(_data.ToCharArray()); 
    _networkStream.Write(_sizeOfData,0,_sizeOfData.Length); 

    serverResponse = _streamReader.ReadLine(); 

    while (true) 
    { 
     serverResponse = _streamReader.ReadLine(); 

     if (serverResponse == ".") break; 
     if (serverResponse.Length > 4) 
     { 
      if (serverResponse.Substring(0, 5) == "From:") 
       lstMessages.Items.Add(serverResponse); 
     } 
    } 
} 

回答

1

你爲什麼要發送原始字節而不是原來在文章中的文本?事實上,我實際上無法讓您的代碼編譯,因爲GetBytes返回byte[],但Write預計char[]。我可以把它改成這一點,至少它編譯:

char[] _sizeOfData = Encoding.ASCII.GetChars(Encoding.ASCII.GetBytes(_data.ToCharArray())); 

不過這些都不會被遮蔽,你可能不會遇到反正,即非ASCII字符的潛在問題。 (你的代碼將導致問號出現其中,如果他們想過會導致你頭疼調試非ASCII字符,但他們不應該在這種情況下發生的。)相反,你可以這樣做:

char[] _sizeOfData = _data.ToCharArray(); 

無論如何,你的代碼掛起的原因之一是因爲文章中的代碼使用WriteLine(),它爲你發送NewLine。因此,無論使用WriteLine()(推薦)或更改您的字符串:

string _data = "TOP " + i + " 0\n"; 

另一個原因是掛你沒有每行後沖水:

_networkStream.Flush(); 

一個原因,你可能會是掛如果你有大量的消息,並且你正在UI線程上處理所有這些。不要將複雜性,輸出結果輸出到Console或其他您可以實時監視的其他東西,直到找出網絡部分,然後添加對象/集合。

至於錯誤消息,將代碼片段插入該文章的主代碼並修復上面提到的問題後,我無法重現錯誤。但是,如果您沒有可用於POP3下載的消息,則TOP 1 0會生成該消息。

+0

我實際上是使用另一個網站的代碼,並在我去的時候進行調整。我繼續前進,轉而使用StreamReader,StreamWriter和NetworkStream,我也打電話給Flush。現在一切都很好。謝謝。 – Xaisoft