2014-10-14 2 views
4

Мне нужно создать сервисное (или консольное) приложение, которое подключается к серверу IMAP и прослушивает новую почту. В настоящее время я пытаюсь использовать MailKit, но у меня возникают проблемы с попыткой выяснить, как это сделать из документации.MailKit: получение нового почтового уведомления с сервера IMAP

Ближайший я приехал от this почты. Из того, что я вижу, этот пост устанавливает соединение в режим IDLE и иногда отправляет NoOP, чтобы попытаться сохранить соединение в живых. Мне не совсем понятно, как получить новое уведомление по почте.

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

Вот что я пробовал:

var cts = new CancellationTokenSource(); 
    testIDLEMailNotification(cts.Token); 

    ... 

    private static void testIDLEMailNotification(CancellationToken token) 
    { 
     using (var client = ClientCreateAndConnect(token)) 
     { 
      while(!token.IsCancellationRequested) 
      { 
       using (var done = new CancellationTokenSource()) 
       { 
        using (var timer = new System.Timers.Timer(9 * 60 * 1000)) 
        { 
         timer.Elapsed += (sender, e) => done.Cancel(); 
         timer.AutoReset = false; 
         timer.Enabled = true; 
         try 
         { 
          client.Idle(done.Token, token); 
          client.NoOp(token); 

         } 
         catch (OperationCanceledException) 
         { 
          break; 
         } 
        } 
       } 
      } 
     } 
    } 

    private static ImapClient ClientCreateAndConnect(CancellationToken token) 
    { 
     var client = new ImapClient(); 
     client.Connect("server.domain", 993, true, token); 
     client.AuthenticationMechanisms.Remove("XOAUTH"); 
     client.Authenticate("[email protected]", "password",token); 

     client.Inbox.Open(MailKit.FolderAccess.ReadWrite, token); 
     client.Alert += client_Alert; 
     return client; 
    } 

    static void client_Alert(object sender, AlertEventArgs e) 
    { 
     Console.WriteLine("New Email or something."); 
    } 

ответ

-5

Как вы, по сути пытается написать клиент IMAP, чтение пару РЛК является обязательным. В частности, RFC3501 расскажет вам, что такое ALERT и что вы должны делать с ним.

Извините, выберите другую библиотеку, которая представляет вам интерфейс более высокого уровня, или узнайте, как использовать IMAP.

+0

Mailkit неплохой и сделает то, что хочет OP. Ссылка в вопросе даже говорит, что включает пример программы под названием «imapidle». – arnt

+0

RFC3501 ничего мне не говорит о внедрении IMAP-клиента с MailKit, о чем я и говорил. Мой вопрос касался MailKit и того, как MailKit реализует обработку новых почтовых уведомлений. Я согласен с тем, что RFC3501, возможно, поможет моему пониманию IMAP, но он не собирается ничего делать, чтобы помочь мне с MailKit. Да, я мог бы использовать другую библиотеку, но когда у меня есть львиная доля кода, написанного и работающего, я не думаю, что его необоснованно спросить о SO, чтобы узнать, знает ли кто-то другой (может быть, автор), как его реализовать. – RHarris

+0

Проблема с кодом, который вы показали, заключается в том, что он пытается использовать довольно сырые события IMAP, а не те события, которые уже переведены в состояние высокого уровня удаленного почтового ящика. Кажется, что вы нашли часть MailKit, которая реализует необходимый вам интерфейс, что хорошо. –

3

Я нашел образец here. Я продолжал искать IMAPClient для какого-то события, и не было никакого конкретного уведомления о сообщении.

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

Надеюсь, это поможет кому-то еще.

Смежные вопросы