4

I want to use the MailKit Pop3Client to retrieve messages from a POP3 mailbox, and then delete these messages after processing. The retrieval code is something like:

Public Function GetMessages(Optional logPath As String = Nothing) As List(Of MimeMessage)

    Dim client As Pop3Client
    Dim messages = New List(Of MimeMessage)()

    Using client
        ConnectPop3(client)
        Dim count = client.GetMessageCount()
        For i As Integer = 0 To count - 1
            Dim msg = client.GetMessage(i)
            messages.Add(msg)
        Next
    End Using

    Return messages

End Function

My problem here is in order to delete a message in another message, I need an index, but that is long gone once I exit GetMessages. All I have is the info available on a MimeMessage object, but that has no index property, only MessageId, but in my Delete method, I would have to read all mails again, in order to look up an index value.

Now Pop3Client has a GetMessageUid(int index) method, which returns a mysterious string (looks like int) value with no apparent relation at all to the Mime MessageID, but it seems this is all I have. Then I have to store the MailKit Uid with each message, making my retrieval code something like this, using a dictionary to store uid-message pairs:

Public Function GetMessages(Optional delete As Boolean = False, Optional logPath As String = Nothing) As List(Of MimeMessage)

    Dim client As Pop3Client
    Dim messages = New Dictionary(Of String, MimeMessage)

    Using client
        ConnectPop3(client)
        Dim count = client.GetMessageCount()
        For i As Integer = 0 To count - 1
            Dim msg = client.GetMessage(i)
            Dim u = client.GetMessageUid(i)
            messages.Add(u, msg)
        Next
        client.Disconnect(True)
    End Using

    Return messages

End Function

I am really hoping I'm missing something here and what should be a really simple process is indeed simple, but I can't find anything else on my own.

ProfK
  • 49,207
  • 121
  • 399
  • 775

1 Answers1

3

The message UID is the only way to track a message between connections.

The index for a message can change as other messages are deleted.

Your options are:

  • Delete messages as you're downloading them.

  • Save the UID so you can come back and delete specific messages later.

It may make more sense if you skim through the POP3 RFC.

  • Thanks. I had a, mistaken, impression that something like `GetMessageUid`, especially with a shiny client like MailKit, would return the `message-id` value for the message, but I'm heading back to the drawing board. – ProfK May 10 '15 at 05:06
  • But how do you delete a message by MessageID? `POP3.DeleteMessage()` only take index as argument. `folder.AddFlags` is only for imap, right? – MrCalvin May 30 '18 at 19:30
  • Maybe the only way is to iterate all messages and compare MessageID and the delete with the index, no shortcut, right? – MrCalvin May 30 '18 at 19:56