Email in IMAP Verzeichnis löschen mittels VB.NET

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Thunderbolt.

    Email in IMAP Verzeichnis löschen mittels VB.NET

    Hallo,

    ich hoffe ich bin hier richtig. Ich versuche folgende Problemstellung zu lösen:

    Ich bin in der Lage mit nachfolgendem Code die eingegangenen Emails in einer Sammelmailbox auszulesen und in eine Tabelle auf einem SQL Server zu schreiben.:

    VB.NET-Quellcode

    1. Dim con As New SqlConnection(CONSTR)
    2. Dim anzahl As Integer
    3. Dim sel As String = ""
    4. Dim input As String = ""
    5. Dim username As String = "XXX"
    6. Dim password As String = "YYY"
    7. Dim imapServer As String = "imap.XXX.com"
    8. Dim emailMessage
    9. Dim subject As String
    10. Dim imapClient As New ImapClient(New ProtocolLogger("imap.log"))
    11. Dim i As Integer = 0
    12. System.Net.ServicePointManager.ServerCertificateValidationCallback = Function(se As Object, cert As System.Security.Cryptography.X509Certificates.X509Certificate, chain As System.Security.Cryptography.X509Certificates.X509Chain, sslerror As System.Net.Security.SslPolicyErrors) True
    13. imapClient.Connect(imapServer, 143, SecureSocketOptions.StartTls) 'SslOnConnect)
    14. imapClient.Authenticate(username, password)
    15. imapClient.Inbox.Open(FolderAccess.ReadWrite)
    16. Dim uids = imapClient.Inbox.Search(SearchQuery.All)
    17. Dim x As String()
    18. 'Browse through all emails in mailbox "INBOX" of PSAAUTO
    19. For Each uid In uids
    20. i = i + 1
    21. 'Read the email details per email
    22. emailMessage = imapClient.Inbox.GetMessage(uid)
    23. emailMessage.writeTo(String.Format("{0}.eml", uid))
    24. subject = emailMessage.Subject & ""
    25. 'imapClient.Inbox.DeleteMessage(newMessage.IndexOnServer, True)
    26. sel = "Insert into Testemail(UID, Email_From, Email_Subject) Values ('" & uid.ToString & "','" & emailMessage.from.ToString & "','" & subject & "')"
    27. If Get_UID(uid.ToString) = 0 Then 'Check if email is already in database only insert new emails
    28. Try
    29. con.Open()
    30. Dim cmd As New SqlCommand(sel, con)
    31. anzahl = cmd.ExecuteNonQuery()
    32. If (anzahl > 0) Then
    33. Else
    34. 'MsgBox("Speichern fehlgeschlagen")
    35. End If
    36. con.Close()
    37. Catch ex As Exception
    38. 'MsgBox(ex.Message)
    39. End Try
    40. End If
    41. Next


    Das funktioniert supe. Nun möchte ich aber beim Durchlaufen der Schleife bestimmte emails (zum Beispiel Absender "NOREPLY") direkzt in der Inbox LÖSCHEN!. Leider bekomme ich das nicht hin:

    so nach dem Motto: "imapClient.Inbox.Delete(uid)"

    GIBT ES SOWAS?

    Herzlichen Dank für Eure Hilfe

    Christian
    Moin,

    die Aktion „Löschen“ ist in IMAP zweistufig: Erst wird die Nachricht mit dem Flag \Deleted versehen. Anschließend löscht ein EXPUNGE oder CLOSE alle so markierten Nachrichten.

    Wenn ich das richtig sehe, nutzt du MailKit als IMAP-Client. Dort werden die o. g. Befehle über die Methoden IMailFolder.Close oder IMailFolder.Expunge zur Verfügung gestellt (Achtung – die Expunge-Methode bietet einen Parameter für Message-UIDs an, der jedoch nur einschränkt, welche Nachrichten gelöscht werden können, vgl. Source Code).

    Das \Deleted-Flag kann durch eine STORE-Operation gesetzt werden. In MailKit durch IMailFolder.Store, dem z. B. ein StoreFlagsRequest mit einer passenden StoreAction (z. B. Add oder Set) und dem entsprechenden MessageFlags übergeben wird. Ein anschließendes Close oder Expunge, idealerweise eines (1) außerhalb deiner Schleife für die gesamte Operation, löscht dann tatsächlich.
    Mit freundlichen Grüßen,
    Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()