2014-12-19 73 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