2016-05-20 2 views
-1

Теперь я просто получаю все сообщения в событии dowork на рабочем столе:Как я могу проверить новые электронные письма и если есть новые письма, чтобы получить их с помощью MailKit?

private int numberofallmessages = 0; private int countMsg = 0;

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     List<string> uids = new List<string>(); 
     using (var client = new Pop3Client()) 
     { 
      client.Connect(textServer.Text, Convert.ToInt32(textPort.Text), ssl); 
      client.AuthenticationMechanisms.Remove("XOAUTH2"); 
      client.Authenticate(textUser.Text, textPassword.Text); 

      for (int i = client.Count -1; i > 0; i--) 
      { 
       if (backgroundWorker1.CancellationPending == true) 
       { 
        e.Cancel = true; 
        return; 
       } 
       if (i > 0) 
       { 
        allMessages.Add(client.GetMessage(i)); 
       } 
        int nProgress = (client.Count - i + 1) * 100/client.Count; 
        backgroundWorker1.ReportProgress(nProgress, client.Count.ToString() + "/" + i); 
      } 

      client.Disconnect(true); 
     } 
    } 

Я получаю все сообщения о 6000. Теперь я хочу, чтобы в случае нажатия кнопки код, так что каждый раз, когда я нажимаю на кнопку она будет проверять на новую почту. Такая же идея, как в перспективе, например.

А также, возможно, использовать событие, которое автоматически выдаст уведомление, когда будут отправлены новые письма.

Я видел этот пример кода:

MailKit E_MailKit_MailFolder_CountChanged

Но первый я не уверен, если это то, что мне нужно/хочу в моем случае, и второй в примере они используют протокол IMAP, но в моем коде Я использую pop3, а также мою учетную запись, которую я использую в фоновом режиме в Authenticate, является учетной записью pop3.

Я хочу, чтобы один раз после того, как я получил все сообщения, такие как 6000 с этого момента, при нажатии кнопки он будет проверять/получать только новые письма и не все снова 6000 писем.

+0

Я знаю, что на pop3 вы не можете проверить на сервере для новых сообщений электронной почты. Но, может быть, есть способ сделать это как клиент? Может быть, как-то с идентификаторами писем? В Outlook, например, вы нажимаете на кнопку, и она очень быстро проверяет pop3 для новых писем, это не загружает/получает все сообщения каждый раз. –

ответ

0

Что вам нужно сделать, так это отслеживать UID сообщений, которые вы уже загрузили. К сожалению, не все серверы POP3 поддерживают UIDs ...

Предполагая, что ваш делает, вот как бы это сделать:

private HashSet<string> downloaded = new HashSet<string>(); 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    using (var client = new Pop3Client()) 
    { 
     client.Connect(textServer.Text, Convert.ToInt32(textPort.Text), ssl); 
     client.AuthenticationMechanisms.Remove("XOAUTH2"); 
     client.Authenticate(textUser.Text, textPassword.Text); 

     var uids = client.GetMessageUids(); 

     for (int i = 0; i < client.Count; i++) 
     { 
      if (backgroundWorker1.CancellationPending) 
      { 
       e.Cancel = true; 
       return; 
      } 
      if (!downloaded.Contains (uids[i])) 
      { 
       allMessages.Add(client.GetMessage(i)); 
       downloaded.Add (uids[i]); 
      } 

      int nProgress = (client.Count - i + 1) * 100/client.Count; 
      backgroundWorker1.ReportProgress(nProgress, client.Count.ToString() + "/" + i); 
     } 

     client.Disconnect(true); 
    } 

}

Очевидно, что это будет работать только до тех пор, как программа остается открытый. После того, как вы закроете программу и заново ее запустите, переменная downloaded будет очищена, и она снова перезагрузит все, поэтому вам нужно будет добавить логику для сохранения и восстановления этой переменной между прогонами (при условии, что вы заботитесь).

Способ проверить, если сервер POP3 поддерживает UIDs является:

if (client.Capabilities.HasFlag (Pop3Capabilities.UIDL)) 
{ 
    // UIDs are supported 
} 
+0

Эта часть работает нормально. То, что я делал до использования openpop, заключалось в том, чтобы сохранить электронные письма в виде формата файлов электронной почты на жесткий диск, а также сохранить в текстовом файле все сообщения uids и при запуске программы ovr снова каждый раз, когда я читал электронные письма, загружая их, а также uids и при попытке загрузить новые электронные письма я сравнивал их с списком uids из текстового файла, и только те, которые не существуют, загружаются iids. Логика или это должно быть по-другому? –

+0

Да, это сработает. – jstedfast

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