接收来自 Gmail 的邮件 [英] Receive messages from gmail

查看:43
本文介绍了接收来自 Gmail 的邮件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I try to receive messages from gmail account but get an error: 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);
       }

我的错误在哪里?我也想从我的盒子里删除一些消息.我该怎么做?

Where is my mistake? Also I want do delete some messages from my box. How can I do this?

非常感谢!

推荐答案

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

The first problem I see with your code is that it doesn't use an SslStream (needed to connect to GMail's SSL-wrapped POP3 service on port 995).

我看到的第二个问题是

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

如果您真的很费心去阅读 POP3 规范,您会发现:

If you actually bother to read the POP3 specification, you'll discover this:

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 以外的八位字节,则该行的第一个八位字节(终止八位字节)将被剥离.

这意味着如果客户端遇到诸如..some text\r\n"之类的行,则前导'.'需要剥离.

This means that if the client encounters a line such as "..some text\r\n", the leading '.' needs to be stripped away.

如果该行与..\r\n"完全匹配,您的代码只会将其删除.

Your code only strips it away if the line exactly matches "..\r\n".

这篇关于接收来自 Gmail 的邮件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆