如何使用MailKit POP3客户端通过邮件ID删除邮件?

4
我想使用MailKit的Pop3Client从POP3邮箱中检索邮件,并在处理完这些邮件后将其删除。检索代码类似于:
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

我的问题是,在删除一条消息时,我需要一个索引,但一旦退出GetMessages,索引就不存在了。我只能使用MimeMessage对象上可用的信息,但它没有索引属性,只有MessageId,但在我的删除方法中,我必须重新读取所有邮件,以查找索引值。
现在,Pop3Client有一个GetMessageUid(int index)方法,返回一个神秘的字符串(看起来像int),与Mime MessageID似乎没有任何明显的关系,但这似乎是我所拥有的全部。然后,我必须使用每个消息存储MailKit Uid,使我的检索代码类似于以下内容,使用字典存储uid-消息对:
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

我真的希望我漏掉了什么,这个本来应该是非常简单的过程,但我自己找不到其他任何信息。

1个回答

3

消息UID是在连接之间跟踪消息的唯一方式。

由于其他消息被删除,消息的索引可能会发生变化。

您的选项包括:

  • 在下载消息时删除它们。

  • 保存UID,以便稍后返回并删除特定消息。

如果您浏览POP3 RFC,则可能更容易理解。


谢谢。我曾经错误地认为像GetMessageUid这样的东西,特别是在使用MailKit这样的高级客户端时,会返回消息的message-id值,但现在我需要重新考虑。 - ProfK
但是您如何通过MessageID删除邮件呢?POP3.DeleteMessage()只接受索引作为参数。folder.AddFlags只适用于IMAP,对吧? - MrCalvin
也许唯一的方法就是迭代所有消息并比较MessageID和删除索引,没有捷径,对吗? - MrCalvin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接