2013-10-24 53 views
3

我正在使用電子郵件客戶端應用程序並使用GMAIL IMAP condstore功能同步標籤,讀取和未讀取更改。IMAP客戶端如何以編程方式將Gmail標籤重命名爲

我的應用程序流程如下所示。

1)首先選擇 「的Gmail /所有郵件」
2)擷取從服務器因爲與像 最後modseq最後一次同步的變化FETCH 1:*(X-GM-標記)(CHANGEDSINCE highestmodseq)

此處IMAP服務器返回自上次同步以來檢測到的標籤,讀取和未讀更改的消息。

假設我有標籤「A」,它有100封電子郵件。現在,如果標籤A被刪除,則服務器將100條消息作爲更改返回,它按預期工作。

但如果標籤「A」被重命名爲標籤「B」,那麼服務器應該返回100條消息作爲更改,但不會。

能否請你建議如何同步這是下一個標籤之前,結果被重命名爲標籤B航空信息

PS:根據標籤的IMAP服務器標準的獨特性是基於標籤名稱和uid有效性鑑定。

Gmail標籤正在以'LIST「」「*」'檢索。如果標籤被重命名爲一些別的東西那麼如何找到它是否是新創建的標籤或標籤改名

感謝 對於SubBi雷迪

假設

+3

請記住,IMAP標準討論的是文件夾,而不是標籤。標籤是一個完全基於Gmail的概念,他們的實現完全取決於他們。 GMail試圖將標籤作爲文件夾呈現,但抽象的方式有幾種。 – Max

回答

-1

不,你不能與IMAP這樣做語言。 Gmail標籤專門由Google製作的http(s)API處理。
IMAP已被設計爲使用一組命令發送通過TCP端口143

您可以檢查available commands.

+2

這個迴應完全是無稽之談,對不起。 「IMAP被設計爲通過Telnet連接到端口143上的服務器使用。」是完全錯誤的。 –

+0

@JanKundrát:+1並更正。 – user2284570

3

PS的列表:根據獨特標籤的IMAP服務器的標準被確定基於標籤名稱和uid有效性。

這是不正確的。 IMAP協議沒有定義「標籤」。它定義了什麼是「郵箱」,每個郵件都有一組「標誌」或「關鍵字」。

當GMail決定實施IMAP時,他們做出了一個不幸的選擇,即在郵箱頂部標記他們的標籤概念,而不是重複使用現有的標誌元數據。 (他們有一些原因是,他們中的一些是有效的,有些是不,那討論外的餘地計算器。)

但在情況下,如果標籤「A」更名爲標籤「B」然後服務器應該返回100個消息作爲變化,但它不會。

這種理解當然有意義。從IMAP客戶的角度來看,GMail行爲不同的事實令人失望。我建議把這個提交給GMail的開發者;他們確實閱讀了ietf-imapext郵件列表。

1

你是對的,一個標籤重命名似乎是如果導致更新所有重標記受其影響的郵件的MODSEQ。但事實並非如此。所以你將不得不獲取文件夾/標籤列表,並將舊標籤列表與新標籤列表相關聯。

如你所知,你通過發出LIST命令獲取Gmail標籤列表:

A001 LIST "" "*" 

時,該命令的響應從之前設定的,你知道文件夾的不同,會發生什麼?不幸的是,IMAP不會爲您提供文件夾標識符,您可以使用它通過重命名來跟蹤單個文件夾。幸運的是,Gmail還挺不錯。

(注:該解決方案是不認可的是Gmail,但它顯然的作品,所以有這麼)

每一個IMAP文件夾中有一個與之相關的UIDVALIDITY值。通常在那裏可以讓您知道是否在服務器上發生了某些事情,從而導致您緩存的UID到消息映射不再有效。按照RFC IMAP,

 3) If the [folder] is deleted and a new [folder] with the 
     same name is created at a later date, the server must 
     either keep track of unique identifiers from the 
     previous instance of the [folder], or it must assign a 
     new UIDVALIDITY value to the new instance of the 
     [folder]. 

    4) The combination of [folder] name, UIDVALIDITY, and UID 
     must refer to a single immutable message on that server 
     forever. 

通過Gmail的IMAP暴露的每個文件恰好有一個獨特的UIDVALIDITY值。當您重命名文件夾時,其UIDVALIDITY不會更改。因此,如果您發現文件夾集已更改,並且您爲Gmail商店中的每個標籤文件夾抓取UIDVALIDITY,則可以通過查找哪些文件夾與UIDVALIDITY值匹配來匹配舊快照和當前商店中的文件夾。

# before, label "blurdybloop" had UIDVALIDITY 32 

A002 STATUS "mylabel" (UIDVALIDITY) 
* STATUS "mylabel" (UIDVALIDITY 32) 
A002 OK Success 

# this indicates that "blurdybloop" has been renamed to "mylabel" 

如果你想成爲額外小心,你可能要在每個標籤的文件夾STATUS即使在文件夾列表並沒有改變正好趕上圓形改名像A - > B,C - > A,B - > C(這會導致交換標籤A和C的名稱)。但這可能是矯枉過正。

相關問題