2013-04-28 84 views
1

使用JavaMail API和IMAP,我想知道消息已經從文件夾a移動到b。我怎麼可以做到這一點,而無需添加監聽器?我的意思是當我登錄到帳戶並打開文件夾時,我想發現消息的變化。郵寄IMAP:如何檢測郵件已從一個文件夾移動到另一個文件夾?

問題是,如果在文件夾a中有3條消息,並帶有ID 1 2和3,並且將帶有ID 3的消息移動到文件夾B,則消息的ID會發生變化,並且我們在文件夾中會出現ID爲1的消息B.

我的目標是在同步郵件服務器的消息結構用我自己的本地服務器。我必須自己保留所有的消息信息,標誌等。因此,在每次登錄時,我都必須發現對郵件服務器中存儲的郵件所做的所有更改。

我可以得到新的或者未讀郵件:

Message messages[] = inbox.search(new FlagTerm(new Flags(Flag.RECENT), true)); 

Message messages[] = inbox.search(new FlagTerm(new Flags(Flag.SEEN), false)); 

,但我不感興趣的只是新郵件,我也想知道老所做的更改例如郵件我想了解的是:

已讀2個月前郵件,已被移動到另一個文件夾。

我的想法是,

因爲UID的改變,我無法使用用於識別郵件。 我想我必須使用郵件信息,如主題發件人接收日期,構建它們的哈希值並比較每個登錄信息的哈希值。但會造成性能問題。

回答

2

你可以嘗試使用它包含了一個消息ID喜歡[email protected]當郵件被移動到文件夾中不應改變RFC822報頭信息。但你會抓取用戶的所有郵件頭同步此,至少我不知道的方式來檢索感動消息

+1

準確地回答了這個問題。消息ID正好是正確的字段使用...當然,必須考慮郵件被複制到多個文件夾,並不是所有的郵件都有郵件ID(草稿...?) – rolfl 2013-04-28 18:27:59

+0

並非所有的郵件有''Message-Id''標頭,可悲的是,這個標頭不能保證是唯一的。談到互聯網協議和RFC,你不能依賴「SHOULD」措辭。 – 2013-04-30 08:47:54

+0

但本頁說: http://stackoverflow.com/questions/219343/get-uid-for-message-from-gmail-using-javax-mail-with-imap?rq=1 消息ID是大多數情況下都是獨一無二的,但不是所有情況下都是如此特別是自動發件人通常會生成相同的ID,或者根本沒有(我也看到空的 - 發件人ID:) – benchpresser 2013-04-30 11:02:03

4

你不能這樣做,在IMAP。跟蹤Message-Id頭可能讓你成功了一半,但你必須添加各種檢查的拐角情況下,像重複消息ID(是的,他們是應該是唯一的)等。另外請記住,什麼基線IMAP給你一個同步的視圖到一個單一的郵箱,而不是一組郵箱上的原子視圖。這意味着即使用戶已經在文件夾A和B之間「移動」了一條消息,對於您的腳本而言,它在A和B中都可以在較長時間內看到。

有些IMAP服務器添加,你可以FETCH包含消息有效載荷的加密哈希非標準領域。雖然這些仍然是非標準的。

+0

當使用thunderbird時,當我從另一個工具創建文件夾並移動一個很老的消息傳遞到新文件夾,thunderbird在單擊文件夾時立即獲取新文件夾和新消息。 Thunderbird是否知道通過從開始提取所有消息並應用某種比較,或者郵件服務器是否提供了特定的信息,如x從a移動到b? – benchpresser 2013-04-29 07:34:40

+0

我用2000郵件的郵件帳戶測試了它。當我將一個非常舊的消息從其文件夾移動到另一個文件夾(除了thunderbird之外的其他郵件客戶端工具,基於web的qmail引擎,松鼠郵件),以及當我點擊雷鳥上的文件夾時,移動的消息消失。雷鳥如何才能學會如此快捷? – benchpresser 2013-04-29 09:07:40

+1

您問及如何檢測「移動」。 IMAP僅提供有關「郵箱A從郵箱X中消失」和「郵箱B出現在郵箱Y中」的信息。沒有簡單可靠的方法來檢測A == B。有一些UIDPLUS擴展可以在某些情況下提供幫助,但它遠非一個完整的解決方案。 – 2013-04-29 17:10:47

相關問題