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
Wäre für Hilfe wirklich dankbar
0belixx
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 239154
Url: https://administrator.de/contentid/239154
Ausgedruckt am: 22.11.2024 um 15:11 Uhr
3 Kommentare
Neuester Kommentar
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:
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.
Grüße Uwe
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
While Ordner.items.count > 0
Ordner.items(0).Delete()
Wend
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:
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
For Each mail As MailItem In Ordner.Items.Restrict("@SQL=""http://schemas.microsoft.com/mapi/proptag/0x0037001f"" like '%" & line & "%'")
...
....
...
Next
Grüße Uwe