【问题标题】:Error when issuing TOP command in c# pop3 client在 c# pop3 客户端中发出 TOP 命令时出错
【发布时间】:2011-09-02 19:47:35
【问题描述】:

下面有几个问题。一是 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);
        }
    }
}

【问题讨论】:

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


    【解决方案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 或其他您可以实时监控的东西,直到您弄清楚网络部分,然后添加您的对象/集合。

    至于错误消息,在将您的代码 sn-p 插入该文章的主代码并修复我上面提到的内容后,我无法重现该错误。但是,如果您没有可用于 POP3 下载的消息,那么 TOP 1 0 会生成该消息。

    【讨论】:

    • 我实际上是在使用来自另一个站点的代码,并在进行过程中对其进行调整。我继续使用 StreamReader、StreamWriter 和 NetworkStream,我也在调用 Flush。现在一切都很好。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2018-03-02
    • 2015-06-14
    • 1970-01-01
    • 2016-11-28
    • 2019-11-16
    • 2017-02-14
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多