0belixx
Goto Top

Fehler beim Löschen von E-Mails über VB.NET

Hallo Leute,

ich brauche mal bitte Hilfe.

Folgendes. Ich möchte über VB unteranderem E-Mails in einem bestimmtem Ordner, erst auf "gelesen" setzen und dann löschen. Dabei löscht er aber immer die Hälfte der Mail. Also zb wenn ich 20 habe löscht er 10, beim zweitem Aufruf löscht er dann 5 usw

For Each line As String In File.ReadLines("C:\Temp\Test.txt")  
            For Each Mails In Ordner.Items
                If Mails.Subject.contains(line) Then
                    Mails.Unread = False
                    Mails.Delete()
                End If
            Next
        Next

Wäre für Hilfe wirklich dankbar
0belixx

Content-ID: 239154

Url: https://administrator.de/contentid/239154

Ausgedruckt am: 22.11.2024 um 15:11 Uhr

colinardo
Lösung colinardo 26.05.2014 aktualisiert um 10:23:09 Uhr
Goto Top
Moin obelixx,
das liegt daran das du die Mails innerhalb von der Schleife löschst, aber diese Änderung in Ordner.Items währendessen nicht reflektiert wird. Am besten ist es wenn du alle zutreffenden Mails als Objekte in einer Collection oder einer List(Of MailItem) zwischenspeicherst und nach deiner Schleife für alle Objekte in der Collection die Löschmethode aufrufst.
Also etwa so:
Dim mailCollection As new Collection
For Each line As String In File.ReadLines("C:\Temp\Test.txt")   
  For Each mail As MailItem In Ordner.Items
      If mail.Subject.Contains(line) Then
          ' Mailitem zur Collection hinzufügen  
          mailCollection.Add(mail)
      End If 
  Next
Next

' Für alle Mailitems in der Collection die entsprechenden Aktionen durchführen  
For Each itm As MailItem In mailCollection
    itm.Unread = False
    itm.Delete()
Next
Will man anders herum alle Mails eines Ordners löschen, lässt sich das mit einer While-Schleife machen, die so lange die erste Mail eines Ordners löscht bis sich keine Mails mehr im Ordner befinden.
While Ordner.items.count > 0
  Ordner.items(0).Delete()
Wend
Grüße Uwe
0belixx
0belixx 26.05.2014 um 10:23:05 Uhr
Goto Top
Hallo Uwe,

super Idee, habe ich ganz übersehen das der Ordner das ja nicht mitbekommt, vielen Dank, es funktioniert.
0belixx
colinardo
colinardo 26.05.2014 aktualisiert um 10:47:52 Uhr
Goto Top
Noch als Info für eine effizientere Filterung von Ordnern in denen mehr als nur ein "paar" Mails liegen. Du kannst die Items in einem Ordner bereits mit einer Outlook-Funktion einschränken, so dass nicht für jeden Suchbegriff alle Mails durchlaufen werden müssen. Dies macht man mit der Restrict-Methode der Items-Collection. Hier ein Beispiel wie so was aussieht:
For Each mail As MailItem In Ordner.Items.Restrict("@SQL=""http://schemas.microsoft.com/mapi/proptag/0x0037001f"" like '%" & line & "%'")  
...
....
...
Next
Hier werden sogenannte MAPI-Property-Tags verwendet (der obige verweist auf das Subject) und mit SQL Syntax gefiltert. So wird schon im Vornherein die Menge an Mails eingeschränkt die in Frage kommen und der ganze Vorgang beschleunigt.

Grüße Uwe