2017-04-05 65 views
3

我們已經實現了一個使用JavaMail API的郵件客戶端,它連接到郵件服務器以處理IMAP協議中的消息。該implemenetation適用於衆多的客戶和郵件服務器很好,但一個客戶,我們有一個問題,IMAP :(JavaMail)UIDVALIDTY值總是改變一些文件夾

UIDVALIDTY:,以確定我們是否可以在文件夾中依靠消息的UID值,我們店最近的每個文件夾的UIDVALIDTY。在下一個過程中,我們將最近存儲的值與當前值進行比較。如果它們相同,我們可以依靠UID。 IMAP規範要求服務器盡最大努力避免對此值進行不必要的更改。 (除郵件服務器崩潰,重啓,升級等)

在這個特定的客戶郵件服務器上,某些文件夾的UIDVALIDTY值每次都會改變。測試帳戶有300個文件夾,其中15個總是具有相同的特定定義文件夾,總是有不同的UIDVALIDTY值。

這是什麼原因?是否有郵件服務器設置?我認爲它超出了Java郵件API的範圍,它與郵件服務器有關。客戶說我們的郵件服務器沒有問題,我們可以通過我們的網絡界面使用它。我如何說服客戶並說服他們的郵件服務器存在問題?

回答

3

某些郵箱格式沒有空間存儲UID,我認爲一些仍在使用的服務器支持這種格式。 Dovecot特別支持許多存儲格式,IIRC包括一個不支持UID的格式。

如果一個服務器必須,它會send you a UIDNOTSTICKY response code when you open the mailbox,從這一點上它將無形地喚起新的UIDS。您可能會檢測到UIDNOTSTICKY並拒絕播放,或者只是將其視爲測試您的有效性更改處理的機會。

+0

我們可以使用java郵件API檢測UIDNOTSTICKY嗎? – benchpresser

+1

似乎如此。我不確定,但看起來您可能會收到[您可以聽取]的StoreEvent(http://docs.oracle.com/javaee/6/api/javax/mail/Store.html#addStoreListener(javax .mail.event.StoreListener))。如果由於缺乏人類可讀的文本而被抑制,則可以總是繼承IMAPStore,重新實現'handleResponseCode()',檢查UIDNOTSTICKY並調用'super.handleResponseCode()'。但是聽StoreEvent更好。 – arnt

+1

您可以啓用[JavaMail調試輸出](http://www.oracle.com/technetwork/java/javamail/faq/index.html#debug)來查看您是否獲得該響應代碼,但即使您目前還不清楚你可以做任何不同的事情。您必須假設每次看到郵箱時郵箱都是不同的,或者您必須發明自己的啓發式方法來嘗試確定任何緩存的信息是否仍然有效。我假設這些郵箱實際上並沒有被刪除,每當你看到它們時都會被重新創建,對吧?客戶使用什麼類型的郵件服務器? –