Библиотека 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;
}
/*
* Получаем письма
*/