2017-09-13 1 views
0

Ich habe eine Anwendung, die Rechnungen von Anbietern mit einem Gmail-Posteingang und S22.Imap verarbeitet, um E-Mails und PDF-Anhänge zu lesen . Es ist seit mehreren Jahren ohne Problem verwendet, aber in letzter Zeit, ich habe gesehen worden „Der Strom kann nicht gelesen werden“ Fehler, wenn alle Nachrichten aus dem Posteingang zu erhalten versuchen, den Befehl zu verarbeiten mit:S22.Imap System.IO.IOException: Der Stream konnte nicht gelesen werden, während client.GetMessages (Uids)

IEnumerable<uint> uids = client.Search(SearchCondition.Unseen()); 
IEnumerable<MailMessage> messages = client.GetMessages(uids); 

Diese Ausnahme tritt nur dann auf, wenn ein bestimmter Anbieter eine große Anzahl von E-Mails gleichzeitig sendet. Ich habe durch die S22.Imap documentation gesucht, aber nichts von Hilfe gefunden.

Hinweis: ich auf diese Weise sehen, hat E-Mails zu bekommen, aber die ursprüngliche Methode, die ich oben verwendet wird, ist das eigentliche Beispiel für „Herunterladen von unsichtbaren Mail-Nachrichten“ in der Dokumentation:

// Fetch the messages and process each one 
foreach (uint uid in uids) 
{ 
    MailMessage message = client.GetMessage(uid); 
    ProcessMessage(message); 
} 

hier Mein Problem ist, dass ich Ich konnte die Ausnahme nicht lokal reproduzieren, und ich verstehe nicht wirklich, wie sie sich auf den Befehl client.GetMessages (uids) bezieht.

Gibt es eine maximale Anzahl von Nachrichten, die auf diese Weise verarbeitet werden können, oder gibt es eine bessere Möglichkeit, E-Mails zu lesen und zu verarbeiten?

Wenn client.GetMessages (Uids) der beste Weg ist, um diese E-Mails zu bekommen, gibt es eine gute Möglichkeit, dass ich diese Ausnahme fangen und weitermachen könnte, wenn es passiert?

Ich würde mich über jeden Hinweis freuen. Danke,

Antwort

0

Nicht sicher, ob dies jemals jemandem helfen wird, da es so speziell für diese eine Situation ist, wie wir s22 verwenden, um E-Mails zu verarbeiten, aber ich dachte, ich würde die Antwort irgendwie posten.

Das Hauptproblem, das stattfand, war, dass alle E-Mails mit der Syntax client.GetMessages (Uids) als "ungelesen" markiert wurden. Dies markierte alle E-Mails im Posteingang als "gelesen" (wobei ich ungelesene E-Mails zählte, um sicherzustellen, dass jede E-Mail verarbeitet wurde). Das Ändern dieser Methode, um die gesammelte UID pro Zeit zu durchlaufen, verhinderte dieses Problem. Der Fehler passiert immer noch hin und wieder, aber für den Benutzer wird nichts kaputt gemacht. Die Nachricht, die nicht verarbeitet werden konnte, wird gerade beim nächsten Start der App verarbeitet. Im Grunde habe ich nur geändert, wie ich die ungelesenen E-Mails mit S22.Imap abgerufen und die Fehler behoben habe, indem ich sie abgefangen und weitergemacht habe.

//get the message one at a time from uids. catching any rare errors with a message 
try 
{ 
    MailMessage message = client.GetMessage(uid); 
    ProcessMessage(message); 
} 
catch(Exception e) 
{ 
    System.Threading.Thread.Sleep(1000); 
    SendErrorEmail("An exception has been caught: " + e.ToString() + 
        Environment.NewLine + "UID: " + uid.ToString()); 
} 
Verwandte Themen