从gmail接收消息

时间:2014-04-16 10:43:30

标签: c# tcpclient pop3

我尝试从Gmail帐户接收邮件但收到错误:host not found

这是我的代码:

        using (TcpClient client = new TcpClient("pop.gmail.com ", 995))
        using (NetworkStream n = client.GetStream())
        {
            ReadLine(n);                             // Read the welcome message.
            SendCommand(n, "my_login@gmail.com");
            SendCommand(n, "my_password");
            SendCommand(n, "LIST");                  // Retrieve message IDs
            List<int> messageIDs = new List<int>();
            while (true)
            {
                string line = ReadLine(n);             // e.g.  "1 1876"
                if (line == ".") break;
                messageIDs.Add(int.Parse(line.Split(' ')[0]));   // Message ID
            }

            foreach (int id in messageIDs)         // Retrieve each message.
            {
                SendCommand(n, "RETR " + id);
                string randomFile = Guid.NewGuid().ToString() + ".eml";
                using (StreamWriter writer = File.CreateText(randomFile))
                    while (true)
                    {
                        string line = ReadLine(n);      // Read next line of message.
                        if (line == ".") break;          // Single dot = end of message.
                        if (line == "..") line = ".";    // "Escape out" double dot.
                        writer.WriteLine(line);         // Write to output file.
                    }
                SendCommand(n, "DELE " + id);       // Delete message off server.
            }
            SendCommand(n, "QUIT");
        }

       static void SendCommand(Stream stream, string line)
       {
           byte[] data = Encoding.UTF8.GetBytes(line + "\r\n");
           stream.Write(data, 0, data.Length);
           string response = ReadLine(stream);
           if (!response.StartsWith("+OK"))
               throw new Exception("POP Error: " + response);
       }

我的错误在哪里?我也想从我的盒子中删除一些消息。我怎么能这样做?

非常感谢!

1 个答案:

答案 0 :(得分:0)

我在代码中看到的第一个问题是它没有使用SslStream(需要在端口995上连接到GMail的SSL包装的POP3服务)。

我看到的第二个问题是

if (line == "..") line = ".";

如果你真的懒得阅读POP3 specification,你会发现这个:

Responses to certain commands are multi-line. In these cases, which
are clearly indicated below, after sending the first line of the
response and a CRLF, any additional lines are sent, each terminated
by a CRLF pair. When all lines of the response have been sent, a
final line is sent, consisting of a termination octet (decimal code
046, ".") and a CRLF pair. If any line of the multi-line response
begins with the termination octet, the line is "byte-stuffed" by
pre-pending the termination octet to that line of the response.
Hence a multi-line response is terminated with the five octets
"CRLF.CRLF". When examining a multi-line response, the client checks
to see if the line begins with the termination octet. If so and if
octets other than CRLF follow, the first octet of the line (the
termination octet) is stripped away. If so and if CRLF immediately
follows the termination character, then the response from the POP
server is ended and the line containing ".CRLF" is not considered
part of the multi-line response.

这是重要的一点:在检查多行响应时,客户端会检查该行是否以终止八位字节开头。如果是这样,并且如果跟随CRLF之外的八位字节,则该行的第一个八位字节(终止八位字节)将被删除。

这意味着如果客户遇到诸如&#34; ...某些文本\ r \ n&#34;之类的行,那么领先的&#39;。&#39;需要被剥夺。

如果该行完全匹配&#34; .. \ r \ n&#34;。

,您的代码只会将其剥离。