在c#pop3客户端发出TOP命令时出错
问题描述:
下面有几个问题。一个是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);
}
}
}
答
你为什么要发送原始字节而不是原来在文章中的文本?事实上,我实际上无法让您的代码编译,因为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
会生成该消息。
我实际上是使用另一个网站的代码,并在我去的时候进行调整。我继续前进,转而使用StreamReader,StreamWriter和NetworkStream,我也打电话给Flush。现在一切都很好。谢谢。 – Xaisoft