IMAP Почтовый клиент - C#

Узнай цену своей работы

Формулировка задачи:

Уважаемые! Нашёл пример IMAP клиента https://code.msdn.microsoft.com/wind...LIENT-b249d2e6 Столкнулся со следующей проблемой. Когда посылаю команду, например, LIST "" "*", возвращается только одна строка ответа. При дальнейшем считывании ssl потока, считываются и остальные. Вопрос в том, какое условие поставить для цикла чтения из ssl? Не парсить же, пока придёт ответ "OK LIST Completed".
using System;
using System.Text;
 
namespace _test_email_console
{
    class Program
    {
        static System.Net.Sockets.TcpClient tcpc = null;
        static System.Net.Security.SslStream ssl = null;
        static string username, password;
        static int bytes = -1;
        static byte[] buffer;
        static StringBuilder sb = new StringBuilder();
        static byte[] dummy;
        static void Main(string[] args)
        {
            try
            {
                
                // there should be no gap between the imap command and the \r\n       
                // ssl.read() -- while ssl.readbyte!= eof does not work because there is no eof from server 
                // cannot check for \r\n because in case of larger response from server ex:read email message 
                // there are lot of lines so \r \n appears at the end of each line 
                //ssl.timeout sets the underlying tcp connections timeout if the read or write 
                //time out exceeds then the undelying connection is closed 
                tcpc = new System.Net.Sockets.TcpClient("imap.yandex.ru", 993);
 
                ssl = new System.Net.Security.SslStream(tcpc.GetStream());
                ssl.AuthenticateAsClient("imap.yandex.ru");
                receiveResponse("");
 
                Console.WriteLine("username : ");
                username = Console.ReadLine();
 
                Console.WriteLine("password : ");
                password = Console.ReadLine();
                receiveResponse("$ LOGIN " + username + " " + password + "\r\n");
 
                receiveResponse("$ LIST " + "\"\"" + " \"*\"" + "\r\n");

                receiveResponse("$ LOGOUT\r\n");
            }
            catch (Exception ex)
            {
                Console.WriteLine("error: " + ex.Message);
            }
            finally
            {
                if (ssl != null)
                {
                    ssl.Close();
                    ssl.Dispose();
                }
                if (tcpc != null)
                {
                    tcpc.Close();
                }
            }

            Console.ReadKey();
        }
        static void receiveResponse(string command)
        {
            try
            {
                Console.WriteLine("<<<" + command);
                if (command != "")
                {
                    if (tcpc.Connected)
                    {
                        dummy = Encoding.ASCII.GetBytes(command);
                        ssl.Write(dummy, 0, dummy.Length);
                    }
                    else
                    {
                        throw new ApplicationException("TCP CONNECTION DISCONNECTED");
                    }
                }
 
                // Какое условие должно быть в этом цикле?
                //while (bytes > 0)
                //{
                    ssl.Flush();
 
                    buffer = new byte[2048];
                    bytes = ssl.Read(buffer, 0, 2048);
                    sb.Append(Encoding.ASCII.GetString(buffer), 0, bytes-1);
 
                    Console.WriteLine(">>>" + sb.ToString());
                    sb = new StringBuilder();
                //}
 
            }
            catch (Exception ex)
            {
                throw new ApplicationException(ex.Message);
            }
        }
 
    }
}

Решение задачи: «IMAP Почтовый клиент»

textual
Листинг программы
static void receiveResponse(string command)
        {
            try
            {
                if (command != "")
                {
                    command = ("A" + tagNumber.ToString("D4") + " " + command + "\r\n");
                    Console.WriteLine("<<<" + command);
 
                    if (tcpc.Connected)
                    {
                        dummy = Encoding.ASCII.GetBytes(command);
                        ssl.Write(dummy, 0, dummy.Length);
                        tagNumber++;
                    }
                    else
                    {
                        throw new ApplicationException("TCP CONNECTION DISCONNECTED");
                    }
                }
 
                bytes = -1;
                buffer = new byte[2048];
                sslReadStatus = -1;
                while (sslReadStatus != 0)
                {
                    try
                    {
                        bytes = ssl.Read(buffer, 0, buffer.Length);
                    }
                    catch (Exception)
                    {
                        break;
                    }
 
                    //Декодирование ответа сервера
                    sb.Clear();
                    sb.Append(Encoding.ASCII.GetString(buffer, 0, bytes-2));
 
                    switch (buffer[0])
                    {
                        case (byte)'*'  : ParserStar(command); break;
                        case (byte)'A'  : ParserCommand(); break; //A0001 OK
                        case (byte)'{'  : ParserBuffer(); break;
                        case (byte)23   : continue; //23,3,1,0,160
                        case (byte)0    : continue; //\0,\0,\0
                        default         : ParserDefault(); continue;
                    }
 
                    if (command == "") break;
                }
            }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.846 из 5