Отправка IMAP-команд в GMail с использованием C # - PullRequest
2 голосов
/ 05 октября 2010

Я пытался получить доступ к моей учетной записи GMail, чтобы получить непрочитанные письма из моей учетной записи электронной почты.Тем не менее, я могу только выполнить вход в систему ... Все, что после этого не работает.

Сначала я подключаюсь к серверу, затем отправляю команду входа и, наконец, команду исследовать.Дело в том, что полученные ответы относятся только к соединению и логину.После этого он просто перестает ждать чего-то для чтения из StreamReader.

try
        {
            // create an instance of TcpClient
            TcpClient tcpclient = new TcpClient();
            // HOST NAME POP SERVER and gmail uses port number 995 for POP  
            //tcpclient.Connect("pop.gmail.com", 995);
            tcpclient.Connect("imap.gmail.com", 993);
            // This is Secure Stream // opened the connection between client and POP Server
            SslStream sslstream = new SslStream(tcpclient.GetStream());
            // authenticate as client  

            sslstream.AuthenticateAsClient("imap.gmail.com");

            bool flag = sslstream.IsAuthenticated;   // check flag
            // Asssigned the writer to stream
            System.IO.StreamWriter sw = new StreamWriter(sslstream);
            // Assigned reader to stream
            System.IO.StreamReader reader = new StreamReader(sslstream);

            sw.WriteLine("tag LOGIN user@gmail.com pass");
            sw.Flush();

            sw.WriteLine("tag2 EXAMINE inbox");
            sw.Flush();

            sw.WriteLine("tag3 LOGOUT ");
            sw.Flush();

            string str = string.Empty;
            string strTemp = string.Empty;
            try
            {
                while ((strTemp = reader.ReadLine()) != null)
                {
                    Console.WriteLine(strTemp);
                    // find the . character in line
                    if (strTemp == ".")
                    {
                        //reader.Close();
                        break;
                    }
                    if (strTemp.IndexOf("-ERR") != -1)
                    {
                        //reader.Close();
                        break;
                    }
                    str += strTemp;
                }
            }
            catch (Exception ex)
            {
                string s = ex.Message;
            }
            //reader.Close();

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }

Ответы [ 3 ]

2 голосов
/ 03 июля 2011

Я искал именно такой пример "Hello World", чтобы начать меня.С помощью ответов dkarp приведу пример Мигеля:

        static void Main( string[] args ) {
        try {
            TcpClient tcpclient = new TcpClient();
            tcpclient.Connect( "imap.gmail.com", 993 );

            SslStream sslstream = new SslStream( tcpclient.GetStream() );
            sslstream.AuthenticateAsClient( "imap.gmail.com" );

            if ( sslstream.IsAuthenticated ) {
                StreamWriter sw = new StreamWriter( sslstream );
                StreamReader sr = new StreamReader( sslstream );

                sw.WriteLine( "tag LOGIN user@gmail.com pass" );
                sw.Flush();
                ReadResponse( "tag", sr );

                sw.WriteLine( "tag2 EXAMINE inbox" );
                sw.Flush();
                ReadResponse( "tag2", sr );

                sw.WriteLine( "tag3 LOGOUT" );
                sw.Flush();
                ReadResponse( "tag3", sr );
            }
        }
        catch ( Exception ex ) {
            Console.WriteLine( ex.Message );
        }
    }

    private static void ReadResponse( string tag, StreamReader sr ) {
        string response;

        while ( ( response = sr.ReadLine() ) != null ) {
            Console.WriteLine( response );

            if ( response.StartsWith( tag, StringComparison.Ordinal ) ) {
                break;
            }
        }
    }
1 голос
/ 05 февраля 2011

Ваша проблема в том, что вы ожидаете POP-ответы от сервера IMAP.POP завершает извлеченные сообщения с помощью . и отвечает на другие команды строкой, начинающейся либо с +OK, либо с -ERR.IMAP нет.Вы потребляете все ответы сервера и затем зависаете, ожидая, что что-то будет соответствовать вашему POP-подобному парсеру ответов.Если вы изучите возвращенные данные, вы должны увидеть оставшуюся часть ответов сервера на ваши (правильно отформатированные) запросы.

Возможно, сервер не отправляет ответы обратно.на ваши вторые и третьи команды.Это может быть потому, что вы пытаетесь передать три запроса;то есть вы отправляете запросы, не ожидая ответов.Сервер обязан разрешить конвейеризацию в состоянии SELECTED , но протокол не гарантирует, что вы можете передавать команды из состояния NOT AUTHENTICATED.

1 голос
/ 05 октября 2010

Вместо этого вы можете использовать консервированную библиотеку IMAP / SSL - есть такая, которая все еще активна здесь .

Эта альтернатива не является бесплатной.

Основой для одного из них является исходный код, который может быть полезен , так как вы хотите бросить свой собственныйобработчик протокола.

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