none
per VBA geöffnete Mails korrekt schließen und Fehler mit max. Anzahl zu vermeiden RRS feed

  • Frage

  • Hallo zusammen,

    ich brauche mal einen Tipp in Sachen VBA und Outlook.

    Wir haben in unserer Software ein Programm, welches die Mails aus Outlook (verbunden mit Exchange-Server) einliest und anzeigt. Dieses Programm löst ab einer bestimmten Menge gelesener Mails den Fehler des Exchange-Server aus, dass die Anzahl der gleichzeitig geöffnete Elemente überschritten sein (250 Mailitems).

    Es liegt also auf der Hand, dass unser Programm die Mails zwar öffnet, aber nicht korrekt schließt. Das ganze wird noch erschwert, weil wir "late-binding" benutzen.

    Der Code schaut aber IMHO richtig aus. KAnn mal einer gucken, wo mein Denkfehler sitzt?

    Code: Die relevanten Zeilen sind fett, die Close-Methode ist fett+kursiv. Der Code iteriert mit einer While-Schleife durch alle "Items" eines "Folders" (wahlweise Posteingang oder Gesendete Elemente). Unmittelbar bevor am Ende der While-Schleife mit "GetNext" das nächste Mailitem geholt wird, wird das aktuelle Item"geclost". Aber offenbar setzt dieses Close den Zähler nicht zurück...


    object firstMail = GlobalFunctions.InvokeMethod(folder, "GetFirst", new object[] { });
    
                    if (firstMail != null)
                    {
                        OutlookEMail firstOutlookEMail = GetOutlookEMailFromObject(firstMail);
    
                        if (firstOutlookEMail != null)
                        {
                            lstEMails.Add(firstOutlookEMail);
                        }
    
                        object nextMail = GlobalFunctions.InvokeMethod(folder, "GetNext", new object[] { });
    
                        while (nextMail != null)
                        {
                            anzMails++;
                            myFrm.SetHinweistext("lese E-Mail..." + anzMails.ToString());
    
                            OutlookEMail nextOutlookEMail = GetOutlookEMailFromObject(nextMail);
    
                            if (nextOutlookEMail != null)
                            {
                                lstEMails.Add(nextOutlookEMail);
                            }
    
                            GlobalFunctions.InvokeMethod(nextMail, "Close", new object[1] { 0 });
    
                            nextMail = GlobalFunctions.InvokeMethod(folder, "GetNext", new object[] { });
                        }
                    }

    Donnerstag, 11. Mai 2017 11:51

Antworten

  • Ich antworte mir mal selber, das Problem ist gelöst. In meiner Liste der eingelesenen Mails hatte ich die originale Mail als "object" für spätere Zwecke mitgeführt. Dadurch blieb die Mail für den Server allerdings offen, daran hat auch die Close-Methode nichts geändert. Ich musste die originale Mail wieder sauber verwerfen und bei den "späteren " Zwecken eben extra nochmal holen.
    • Als Antwort markiert Atlan Gonozal Mittwoch, 17. Mai 2017 14:04
    Mittwoch, 17. Mai 2017 14:04