【问题标题】:Getting UID of deleted message获取已删除消息的 UID
【发布时间】:2015-02-18 08:33:52
【问题描述】:

我有一个带有MessageCountListenerIMAPFolder,用于监听从文件夹中添加/删除的消息。在我的messageRemoved(MessageCountEvent ...) 中,我需要获取刚刚删除的消息的 UID,以便我可以在本地缓存中反映这些更改。

问题是,如果我尝试对已删除的消息执行 IMAPFolder.getUID(Message ...),我会得到

    javax.mail.MessageRemovedException
        at com.sun.mail.imap.IMAPMessage.checkExpunged(IMAPMessage.java:220)
        at com.sun.mail.imap.IMAPFolder.getUID(IMAPFolder.java:1949)
        at (...).IdleWatcher$1.messagesRemoved(IdleWatcher.java:64)
        at javax.mail.event.MessageCountEvent.dispatch(MessageCountEvent.java:152)
        at javax.mail.EventQueue.run(EventQueue.java:134)
        at java.lang.Thread.run(Thread.java:856)

如何确定已删除邮件的 UID?我可以浏览所有缓存的消息并检查哪些消息仍然存在,但是这太耗费资源,无法在每次删除消息时执行。

【问题讨论】:

    标签: java jakarta-mail imap


    【解决方案1】:

    如果您为所有消息预取 UID(使用 Folder.fetch 方法),您应该能够在消息被删除/清除后使用 Folder.getUID(Message) 获取该消息的 UID。

    【讨论】:

    • 我有类似的问题。我已经预取了所有消息。但是在 MessageCountListener.messagesRemoved 中来自单独的线程(“JavaMail-EventQueue”)的 MessageCountEvent 和消息没有 UID 但设置了已删除标志。 @İlker-korkut 怎么说,这是记录在案的行为。通过什么我应该在缓存中搜索该消息?正如也只有Message.getMessageNumber() 所说的那样,但文档还指出它在添加/删除消息时不稳定。那么,这意味着没有可靠的方法来了解究竟删除了哪些消息??
    • 文件夹打开时消息编号是稳定的,除非您调用 expunge 方法。如果您在文件夹打开时缓存信息,则消息编号应该足够了。如果您在文件夹未打开时缓存信息,则需要跟踪消息 UID,这意味着您可能希望在打开文件夹时获取消息的 UID。如果您预取 UID,则可以在收到 messagesRemoved 事件时访问它。
    • 我再次调用删除方法!并得到几个 messageRemoved 事件,但无法区分究竟删除了哪些消息。而且我还说明了获取的消息,我有 UID 和所有标题,但有时消息会完全未初始化!
    • messageRemoved 事件中的消息编号应该是您调用删除之前的消息编号。如果您认为您正在为所有消息预取 UID,但 messageRemoved 事件中的消息找不到它们的 UID,我需要查看更多详细信息(例如,协议跟踪)。发生这种情况的一种方法是,如果有新消息到达,您还没有获取它的 UID,然后它就会被删除。如果您需要更多帮助,请通过 javamail_ww@oracle.com 与我联系。
    【解决方案2】:

    Here is IMAPFolder source code.你可以看到getUID方法发生了什么。

    API文档says

    The exception thrown when an invalid method is invoked on an expunged Message. The only valid methods on an expunged Message are isExpunged() and getMessageNumber().

    我认为您应该缓存消息 UID,而在 MessageCounterListener 中删除可能是,当您需要时,您将能够检查并获取 UID。

    【讨论】:

    • 通过什么属性建议您在缓存中搜索该邮件? (请阅读我对上一条消息的评论)
    【解决方案3】:

    删除后,您无法获取某项的 UID。删除就是删除。

    解决这个问题的经典方法是使用 UID 作为缓存键并设计您的程序,以便您可以缓存已删除的消息一段时间而不会产生不良影响。例如,如果您想显示看不见的邮件,请询问服务器现在哪些是看不见的,然后向您的缓存询问这些消息。

    【讨论】:

      猜你喜欢
      • 2021-02-10
      • 2021-03-02
      • 1970-01-01
      • 2021-07-03
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多