IMAP客户端如何以编程方式检测Gmail标签重命名

时间:2013-10-24 16:25:50

标签: gmail imap

我正在使用电子邮件客户端应用程序并使用GMAIL IMAP condstore功能来同步标签,已读取和未读更改。

我的申请流程如下所示。

1)最初选择“Gmail / All Mail”
2)从上次与上一次modseq同步后获取服务器的更改    FETCH 1:*(X-GM-LABELS)(CHANGEDSINCE highestmodseq)

此处IMAP服务器返回自上次同步以来检测到的标签,读取和未读更改的消息。

假设我有标签“A”,它有100封电子邮件。现在,如果标签A被删除,那么服务器返回100条消息作为更改,它按预期工作。

但是如果标签“A”被重命名为Label“B”,那么服务器应该返回100条消息作为更改,但不会。但

您能否建议如何同步以前在标签A下面的消息并重命名为标签B

PS:根据IMAP服务器标准,标签的唯一性基于标签名称和uid有效性来识别。

Gmail标签正在使用“LIST”“”*“'进行检索。

假设Label被重命名为其他东西,那么如何查找它是新创建的标签还是重命名的标签

由于 Subbi Reddy

3 个答案:

答案 0 :(得分:3)

  

PS:根据IMAP服务器标准,标签的唯一性基于标签名称和uid有效性进行识别。

事实并非如此。 IMAP协议没有定义“标签”。它定义了“邮箱”的内容,并且每条消息都有一组“标志”或“关键字”。

当GMail决定实施IMAP时,他们做出了一个不幸的选择,即在邮箱之上窃取他们的标签概念,而不是重复使用现有的标志元数据。 (他们有一些原因,其中一些是有效的,其中一些不是,而且讨论超出了stackoverflow的范围。)

  

但是如果标签“A”被重命名为Label“B”,那么服务器应该返回100条消息作为更改,但不会。但

这种理解当然有道理。从IMAP客户的角度来看,GMail表现不同的事实令人失望。我建议把这个提交给GMail的开发人员;他们确实阅读了ietf-imapext邮件列表。

答案 1 :(得分:1)

您正确认为标签重命名似乎应该导致其标签集受重命名影响的所有邮件的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 不会更改。因此,如果您发现该组文件夹已更改,并且您为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的名称)。但那可能有点过头了。

答案 2 :(得分:-2)

不,你不能用IMAP语言做到这一点。 Gmail标签仅由Google生产的http(s)API处理 IMAP设计用于通过TCP端口143发送的一组命令。

您可以查看available commands.

的列表