获取已删除邮件的UID

时间:2014-12-19 11:48:03

标签: java javamail imap

我有IMAPFolder MessageCountListener,可以监听从文件夹中添加/删除的邮件。在我的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?我可以浏览所有缓存的消息并检查哪些仍然存在,但是每次删除消息时这都太耗费资源。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

删除后无法获取某些内容的UID。删除正在删除。

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

答案 2 :(得分:1)

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().

我认为你应该在MessageCounterListener删除时缓存消息UID,在你需要之后,你将能够获取并获得UID。