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

IMAP客户端如何以编程方式删除Gmail标签重命名,gmail,imap,Gmail,Imap,我正在开发电子邮件客户端应用程序,并使用GMAIL IMAP condstore功能同步标签、已读和未读更改 我的应用程序流程如下所示 1) 最初选择“Gmail/所有邮件” 2) 从服务器获取自上次与上次modseq同步以来的更改,如 取1:*(X-GM-LABELS)(从最高位开始更改ModSeq) 在这里,IMAP服务器返回自上次同步以来检测到标签、已读和未读更改的消息 假设我有标签“A”,它有100封电子邮件。现在,若标签A被删除,那个么服务器将返回100条消息作为更改,它将按预期工作

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

我的应用程序流程如下所示

1) 最初选择“Gmail/所有邮件”
2) 从服务器获取自上次与上次modseq同步以来的更改,如 取1:*(X-GM-LABELS)(从最高位开始更改ModSeq)

在这里,IMAP服务器返回自上次同步以来检测到标签、已读和未读更改的消息

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

但若将标签“A”重命名为标签“B”,那个么服务器应该返回100条消息作为更改,但不会返回

您能否建议如何同步以前位于标签A下并已重命名为标签B的邮件

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

Gmail标签正在使用“列表”“*”进行检索

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

谢谢
Subbi Reddy

不,不能使用IMAP语言执行此操作。Gmail标签仅由谷歌生产的http(s)API处理。
IMAP设计用于通过TCP端口143发送一组命令

您可以查看

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

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

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

但若将标签“A”重命名为标签“B”,那个么服务器应该返回100条消息作为更改,但不会返回


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

标签重命名似乎会导致其标签集受重命名影响的所有邮件的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
值。重命名文件夹时,其
uidvality
不会更改。因此,如果您注意到文件夹集已更改,并且您为Gmail存储中的每个标签文件夹获取了
uidvality
,您可以通过查找哪些文件夹具有匹配的
uidvality
值来匹配旧快照和当前存储中的文件夹

# 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"

如果您想格外小心,可能需要对每个标签文件夹执行
状态
,即使文件夹列表没有更改,只是为了捕获循环重命名,如a->B,C->a,B->C(这会导致标签a和C的名称互换)。但这可能有些过分。

请记住,IMAP标准谈论的是文件夹,而不是标签。标签是一个完全特定于gmail的概念,它们的实现完全取决于它们。GMail试图以文件夹的形式呈现标签,但抽象在几个方面出现了问题。这个回答完全是胡说八道,对不起。“IMAP被设计为由telnet连接到端口143上的服务器使用。”完全错误。@JanKundrát:+1并更正。