3

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

我的申请流程如下所示。

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

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

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

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

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

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

正在使用“LIST """*"' 检索 Gmail 标签。

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

谢谢 Subbi Reddy

4

3 回答 3

3

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

这不是真的。IMAP 协议没有定义“标签”。它定义了“邮箱”是什么,并且每条消息都有一组“标志”或“关键字”。

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

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

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

于 2013-10-30T15:29:34.497 回答
2

您是正确的,标签重命名似乎应该导致其标签集受重命名影响的所有消息的 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) 的名称。但这可能是矫枉过正。

于 2015-05-27T20:18:10.303 回答
-2

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

您可以检查可用命令的列表。

于 2013-10-29T12:25:18.347 回答