2016-05-20 8 views
-1

Jetzt bekomme ich nur alle Nachrichten in einem Hintergrund-Worker-Ereignis:Wie kann ich nach neuen E-Mails suchen und nach neuen E-Mails, um sie mit MailKit zu erhalten?

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); 
     } 
    } 

Ich erhalte alle Meldungen über 6000. Jetzt möchte ich in einem Button-Klick-Ereignis haben, ein Code, so dass jedes Mal, wenn ich auf den Button klicken, um es für eine neue E-Mail überprüft. Die gleiche Idee wie im Outlook zum Beispiel.

Und vielleicht auch ein Ereignis zu verwenden, das automatisch eine Benachrichtigung gibt, wenn eine neue E-Mails erhalten.

habe ich diesen Code Beispiel:

MailKit E_MailKit_MailFolder_CountChanged

Aber zuerst bin ich nicht sicher, ob das, was ich brauche/möchte in meinem Fall ist und die zweite im Beispiel sie imap verwenden, aber in meinem Code Ich benutze Pop3 und auch mein Konto, das ich im Hintergrundarbeiter in der Authenticate verwende, ist ein Pop3-Konto.

Ich will das einmal, nachdem ich alle Nachrichten wie 6000 von nun an bekam, wenn ich auf den Knopf klicke, wird es nur neue E-Mails sehen und nicht mehr die 6000 E-Mails bekommen.

+0

ich auf pop3 wissen Sie nicht, auf dem Server für neue E-Mails überprüfen. Aber vielleicht gibt es einen Weg, es als Kunde zu tun? Vielleicht irgendwie mit den ID's der Mails? In Outlook zum Beispiel klicken Sie auf eine Schaltfläche und es überprüft Pop3 für neue E-Mails sehr schnell, es wird nicht alle Nachrichten jedes Mal heruntergeladen/abgerufen. –

Antwort

0

Was Sie tun müssen, ist, die UIDs der Nachrichten, die Sie bereits heruntergeladen haben, zu verfolgen. Leider unterstützt UIDs nicht alle POP3-Server ...

Angenommen, Ihr tut, ist hier, wie Sie es tun würde:

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); 
    } 

}

Offensichtlich wird dies nur funktionieren, solange das Programm bleibt öffnen. Sobald Sie das Programm schließen und es erneut ausführen, wird die Variable downloaded gelöscht und es wird alles erneut heruntergeladen. Sie müssen also Logik hinzufügen, um diese Variable zwischen den Läufen zu speichern und wiederherzustellen (vorausgesetzt, Sie interessieren sich dafür).

Die Art und Weise zu überprüfen, ob ein POP3-Server UIDs unterstützt ist:

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

Dieser Teil funktioniert gut. Was ich vor der Verwendung von openpop getan habe, war, die E-Mails als E-Mail-Dateiformat auf der Festplatte zu speichern und auch alle Nachrichten in einer Textdatei zu speichern und wenn ich das Programm erneut ausgeführt habe, jedes Mal, wenn ich die E-Mails lese UIDs und beim Versuch, neue E-Mails herunterzuladen, habe ich sie mit der UIDs-Liste aus der Textdatei verglichen und nur die nicht vorhandenen UIDs, die ich heruntergeladen habe. Logik oder sollte es anders sein? –

+0

Ja, das wird gut funktionieren. – jstedfast