2014-10-02 7 views
1

Я пытаюсь получить электронную почту от Gmail. Occaisionly (приблизительно 1 из 5 раз) Я получаю сообщение System.Net.Sockets.SocketException, ошибка:Операция сокета была предпринята для недоступной сети [2a00: 1450: 4013: c01 :: 6d]: 993 при получении электронной почты Gmail с S22 ImapClient

A socket operation was attempted to an unreachable network [2a00:1450:4013:c01::6d]:993 

Сетевой адрес не всегда то же самое, но немного меняется. Эта ошибка появляется во всех окнах Gmail, которые я хочу проверить, но не появляется в моем почтовом ящике Office 365 вообще.

Мое приложение - это приложения MVC 5, размещенные Microsoft Azure. Я использую S22 Imap library

Соответствующая часть кода для извлечения электронной почты является:

using S22.Imap; 

ImapClient Client; 

List<MailMessage> NewMessages; 
try 
{ 
    Client = new ImapClient(tenant.ImapHostName, 
    tenant.ImapPortNumber, 
    tenant.ImapUserName, 
    tenant.ImapPassword, 
    AuthMethod.Login, tenant.UseSsl); 
} 
catch (Exception e) 
{ 
    return; 
} 

try 
{ 
    NewMessages = GetUnseenMessages(Client); 
} 
catch (Exception e) 
{ 
} 

Я отключить IPv6 на моем Azure WebService (оно было отключено от адаптера), но все же эта ошибка возвращается через и снова.

ответ

1

imap.gmail.com возвращает несколько IP-адресов (три сейчас, но число может меняться в зависимости от времени и местоположения). Вы должны попробовать все три. Если кто-то терпит неудачу в том, как вы видите, вы должны попробовать следующий адрес, поэтому ваш следующий шаг - выяснить, делает ли S22 это, а если нет, как вы можете это сделать.

+0

FWIW, мой [MailKit] (https://github.com/jstedfast/MailKit) библиотека будет пытаться все IP-адреса, возвращаемые DNS, пока один из них не будет успешно подключен. Я упоминаю об этом, если OP не может легко обойти это ограничение в S22.Imap. Удачи! – jstedfast

0

У меня была такая же проблема, как OP и сделал следующее повторить несколько IP-адресов с S22.Imap.dll

 var ips = Dns.GetHostAddresses("imap.gmail.com"); 
     foreach(var ip in ips) 
     { 
      try 
      { 
       return new ImapClient(ip.ToString(), "993", Email, Password, AuthMethod.Login, true); 
      } 
      catch(SocketException e) //error means server is down, try other IP 
      { 
       //nothing, check next IP for connection 
      } 
     }