我有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?我可以浏览所有缓存的消息并检查哪些仍然存在,但是每次删除消息时这都太耗费资源。
答案 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。