你是對的,一個標籤重命名似乎是如果導致更新所有重標記受其影響的郵件的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的名稱)。但這可能是矯枉過正。
請記住,IMAP標準討論的是文件夾,而不是標籤。標籤是一個完全基於Gmail的概念,他們的實現完全取決於他們。 GMail試圖將標籤作爲文件夾呈現,但抽象的方式有幾種。 – Max