2014-12-19 75 views
4

我有一个IMAPFolderMessageCountListener,它侦听正在添加/从文件夹中删除的邮件。在我的messageRemoved(MessageCountEvent ...)内部,我需要获取刚删除的消息的UID,以便我可以在本地缓存中反映这些更改。获取已删除邮件的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?我可以查看所有缓存的消息,并检查哪些消息仍然存在,但是这样消耗资源太多,无法在每次消息被删除时进行。

回答

1

删除后无法获取某些东西的UID。删除正在删除。

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

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

我想你应该缓存消息UID而缺失的MessageCounterListener可能,以后当你需要,你就可以再检查一下,并获得UID。

+0

通过什么属性,你是建议搜索缓存中的邮件? (请阅读我对以前消息的评论) – Hubbitus 2015-02-08 22:24:23

2

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

+0

我有类似的问题。我已经预取了所有消息。但是在MessageCountListener.messagesRemoved中,MessageCountEvent从单独的线程(“JavaMail-EventQueue”)中获取,并且消息没有UID但已设置了删除标志。如何@İlker-korkut说,这是记录的行为。通过我应该在缓存中搜索该消息?也如上所述,只有[Message.getMessageNumber()](https://javamail.java.net/nonav/docs/api/javax/mail/Message.html#getMessageNumber()),但文档也声明它不稳定在消息添加/删除。所以,这意味着没有强大的方式来明白究竟是什么信息被删除? – Hubbitus 2015-02-08 22:21:18

+0

文件夹处于打开状态时,邮件号码保持稳定,除非您调用清除方法。如果您在文件夹打开时缓存信息,则消息编号应该足够。如果您在文件夹未打开时缓存信息,则需要跟踪消息UID,这意味着您打开文件夹时可能需要为消息获取UID。如果预取UID,则可以在收到messagesRemoved事件时访问它。 – 2015-02-09 05:25:41

+0

再次,我打电话删除方法!并获取几个messageRemoved事件,但无法区分究竟删除了哪些消息。我还说明了什么样的消息,我有UID和所有头文件,但是消息有时会完全未初始化! – Hubbitus 2015-02-09 20:45:05