Использование Gmail для чтения писем - PullRequest
1 голос
/ 17 августа 2011

Я читал C # 4.0 в двух словах Джозефа и Бена Албахари и наткнулся на этот код в главе «Сеть», которая читает почту с использованием POP3. У POP3 есть определенная связь, как мы все знаем. Когда я использую код в этой главе, кажется очевидным, что он должен работать, но это не так. Это код:

private static string ReadLine(Stream stream)
        {
            List<byte> list = new List<byte>();
            while (true)
            {
                int b = stream.ReadByte();
                if (b == 10 || b < 0) break;

                if (b != 13) list.Add( (byte)b);
            }
            return Encoding.UTF8.GetString(list.ToArray());
        }

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

        static void Main(string[] args)
        {

            using (TcpClient client = new TcpClient("pop.gmail.com", 995))
            {

                using (NetworkStream stream = client.GetStream())
                {
                    ReadLine(stream);
                }
            }

Код неполный в том смысле, что он не загружает почту. Я просто пытался понять, какой первый ответ мы получаем из Gmail. Но, к сожалению, программа просто зависает в методе ReadByte в ReadLine. Я думаю, что я должен получить эту строку при первом подключении к Gmail:

+OK Hello there.

Но моя программа просто зависает. На этой странице:

http://mail.google.com/support/bin/answer.py?answer=13287

Вы должны подключиться к pop.gmail.com, что я и сделал. Кто-нибудь может сказать мне, чего не хватает?

Примечание: Не присылайте мне какие-либо сторонние проекты, чтобы сделать это. Я знаю, что их очень легко использовать. Но я просто пытаюсь увидеть, что происходит под капотами. Было бы лучше, если бы вы обнаружили ошибку в самой моей программе.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 17 августа 2011

Используйте SslStream вместо NetworkStream, поскольку gmail требует ssl

TcpClient objTcpClient = new TcpClient();
//Connecting to the pop3 server at the specified port 
objTcpClient.Connect(pop3Server, pop3PortNumber);

//ValidateCertificate is a delegate
SslStream netStream = new SslStream(objTcpClient.GetStream(), false, ValidateCertificate); //Authenticates the client on the server
netStream.AuthenticateAsClient(pop3Server);
//Stream Reader to read response stream 
StreamReader netStreamReader = new StreamReader(netStream, Encoding.UTF8, true);
1 голос
/ 17 августа 2011

Gmail требует использования SSL.

Порт

995 - это протокол POP3 поверх SSL, рассмотрите возможность использования SslStream .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...