您是正确的,标签重命名似乎应该导致其标签集受重命名影响的所有消息的 MODSEQ 更新。但事实并非如此。因此,您将不得不获取文件夹/标签列表并将旧标签列表与新标签列表相关联。
如您所知,您可以通过发出以下LIST
命令获取 Gmail 标签列表:
A001 LIST "" "*"
如果对该命令的响应与您之前知道的一组文件夹不同,会发生什么情况?不幸的是,IMAP 没有为您提供文件夹标识符,您可以使用该标识符通过重命名来跟踪单个文件夹。幸运的是,Gmail 有点像。
(注意:此解决方案不受 GMAIL 批准,但它显然有效,所以就是这样。)
每个 IMAP 文件夹都有一个UIDVALIDITY
与之关联的值。它通常会让您知道服务器上是否发生了某些事情,以至于您缓存的 UID 到消息的映射不再有效。根据 IMAP RFC,
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
不会更改。因此,如果您注意到文件夹集发生了变化,并且您UIDVALIDITY
在 Gmail 商店中获取了每个标签文件夹,您可以通过查找具有匹配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 ,即使文件夹列表没有更改只是为了捕获循环重命名,如 A -> B、C -> A、B -> C(导致交换标签 A 和 C) 的名称。但这可能是矫枉过正。