在c#pop3客户端中发出TOP命令时出错

时间:2011-09-02 19:47:36

标签: c# email pop3 .net system.net.mail

下面有几个问题。一个是Resharper告诉我serverResponse值不能在任何执行路径中使用。另一个与获取每条消息的标题有关。如果我发出TOP 1 0,它不会抛出任何错误,它就会挂起。如果我发出TOP 1 0后跟Environment.NewLine,它会告诉我"-ERR no such message."我从以下link获得了代码。

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 个答案:

答案 0 :(得分: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将生成该消息。