Библиотека Mail.NET не подключается к IMAP серверу через прокси - C#

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

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

Всем здравствуйте. Кто-нибудь работал с библиотекой Mail.NET? Пишу программу, которая авторизуется по IMAP и отмечает все новые письма прочитанными. Все шикарно работает, но заказчик просит прикрутить прокси. Вот тут косяк. Поддержка прокси есть, делаю как описано на сайте, но не подключается к IMAP серверу через прокси. Прикрепляю лог программы. Когда подключение через прокси создано, то вылазит ошибка при подключении к imap.mail.ru. В логе выделено строками /**********/ сверху и снизу.
/******************************************************************************************************/
23-10-2014 05:06:31	Подключение к прокси 66.110.216.50
23-10-2014 05:06:45	Подключение к прокси 66.110.216.50 успешно установлено
23-10-2014 05:06:45	Подключение к IMAP серверу imap.mail.ru
23-10-2014 05:06:45	Подключение не удалось. Сервер разорвал соединение. 
23-10-2014 05:06:45	SocketException[Сделан запрос на подключение для уже подключенного сокета 217.69.139.90:993]

23-10-2014 05:06:45	Подключение к прокси 69.174.157.245
23-10-2014 05:06:50	Подключение к прокси 69.174.157.245 успешно установлено
23-10-2014 05:06:50	Подключение к IMAP серверу imap.mail.ru
23-10-2014 05:06:50	Подключение не удалось. Сервер разорвал соединение. 
23-10-2014 05:06:50	SocketException[Сделан запрос на подключение для уже подключенного сокета 217.69.139.90:993]
/******************************************************************************************************/

Решение задачи: «Библиотека Mail.NET не подключается к IMAP серверу через прокси»

textual
Листинг программы
Imap imap = new Imap ( );
 
            if ( _useProxy )
            {
                if ( proxylist.Count == 0 )
                {
                    WriteToLog ( "Не загружен список прокси-серверов", "bad" );
                    MessageBox.Show ( "Не загружен список прокси-серверов!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error );
                    return;
                }
 
                int j = 1;
 
                foreach ( var item in proxylist )
                {
 
                    WriteToLog ( "Подключение к прокси " + item.Key );
                    ProxyFactory factory = new ProxyFactory ( );
                    try
                    {    
                        IProxyClient proxy = factory.CreateProxy ( ProxyType.Socks4, item.Key, item.Value ); // подключаемся к прокси
                        Socket socket = proxy.Connect ( _server, _port );
                        imap.AttachSSL ( socket, _server );
                        WriteToLog ( "Подключение к прокси " + item.Key + " успешно установлено", "good" );
                        break;
                    }
                    catch ( System.Net.Sockets.SocketException message)
                    {
                        WriteToLog ( "Подключение к прокси " + item.Key + " не удалось: ", "bad" );
                        WriteToLog ( "SocketException[" + message.Message + "]", "bad" );
                        Application.DoEvents ( );
                    }
                    catch ( Exception message )
                    {
                        WriteToLog ( "Подключение к прокси " + item.Key + " не удалось: ", "bad" );
                        WriteToLog ( message.Message, "bad" );
                        Application.DoEvents ( );
                    }
                    finally
                    {
                        j++;
                    }
                }
 
                if ( j == proxylist.Count )
                {
                    WriteToLog ( "Прокси закончились и ни один не подошел (((", "bad" );
                    WriteToLog ( "Дальше работаем напрямую" );
                    //MessageBox.Show ( "Прокси закончились и ни один не подошел (((", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error );
                }
 
            }
 
            WriteToLog ( "Подключение к IMAP серверу " + _server );
 
            Invoke ( new MethodInvoker ( delegate
                { 
                    progressBarTotal.Value++;
                    progressBarCurrent.Value = 0;
                } ) );
 
            Application.DoEvents ( );
 
            try
            {
                imap.Connect ( _server, _port, _ssl );  // Чтобы использовать SSL использовать перегрузку метода и вызывать его так: imap.Connect ( string _server, int port, bool useSSL ) 
                WriteToLog ( "Подключение к " + _server + " успешно выполнено", "good" );
                Application.DoEvents ( );
            }
            catch ( Limilabs.Client.ServerException message )
            {
                WriteToLog ( "Подключение не удалось. Сервер разорвал соединение. " , "bad" );
                WriteToLog ( "ServerException[" + message.Message + "]", "bad" );
                Application.DoEvents ( );
                return;
            }
            catch(Exception message)
            {
                WriteToLog ( "Подключение не удалось: ", "bad" );
                WriteToLog ( message.Message, "bad" );
                Application.DoEvents ( );
                return;
            }
 
            WriteToLog ( "Авторизация аккаунта " + _user );
 
            try
            {
                Application.DoEvents ( );
                imap.UseBestLogin ( _user, _password );
                imap.SelectInbox ( );
                WriteToLog ( "Авторизация успешно выполнена", "good" );
                _DoneCounter++;
                Invoke ( new MethodInvoker ( delegate
                    { labelDoneCounter.Text = _DoneCounter.ToString ( ); } ) );
            }
            catch ( Exception message )
            {
                Application.DoEvents ( );
                WriteToLog ( "Авторизация не удалась: ", "bad" );
                WriteToLog ( "[" + message.Source + "]:" + message.Message, "bad" );
                _FailedCounter++;
                Invoke ( new MethodInvoker ( delegate
                    { labelFailedCounter.Text = _FailedCounter.ToString ( ); } ) );
                _ErrorCounterAccaunts.Add ( _user + ":" + _password );
                WriteToLog ( "Пара " + _user + ":" + _password + " невалидная", "bad" );
                return;
 
            }
/*
*         Получаем письма
*/

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


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

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

15   голосов , оценка 4.2 из 5
Похожие ответы