7

我正在使用 IMAP 客户端,并且希望能够找到对话线程中引用的所有消息的列表。

我知道“参考”标题包含对话中引用的消息列表,所以我尝试像这样搜索它:

TAG1 UID SEARCH all HEADER References "<CAOZnC-Nr+Q+bS_Nn5XiZ6A-kw=ZRBYrNbdoRfgZ65OjGA4_BKg@mail.gmail.com>"

但它什么也不返回。我已经使用“Message-ID”标头成功搜索了一条消息,如下所示:

TAG2 UID SEARCH all HEADER Message-ID "<918171f1-8822-4869-afb4-de76b05b850b@xtnvmta101.xt.local>"

无论如何使用IMAP 4来做到这一点?

注意:我知道搜索一次只能在 1 个邮箱上工作,但这些邮件中至少有一半位于我搜索的目标文件夹中,并且它们不会显示在我的搜索结果中。

4

1 回答 1

11

您的搜索查询错误 - 您应该ALL从那里删除令牌 - 您发送的内容在语法上无效。正确的形式是这个,例如:

1 UID SEARCH HEADER references "<CAOZnC-Nr+Q+bS_Nn5XiZ6A-kw=ZRBYrNbdoRfgZ65OjGA4_BKg@mail.gmail.com>"

那会让你继续前进。

但是,请记住,References嵌套消息的标头可能包含线程中前面的消息将包含的所有内容 - 通用行长度限制适用,这意味着标头的总大小是有限的,并且一些“中间”项目可能会被删除

有一些方法可以克服这个限制,例如在Dovecot 支持的实验扩展INTHREAD中定义的操作符(并且没有其他 IMAP 服务器,AFAIK)。使用它,您可以简单地询问存在特定消息的线程中的所有 UID,如下所示:

1 UID SEARCH INTHREAD REFS HEADER Message-Id "something"

我实际上已经用 Dovecot 测试过它并且它有效(并且已经工作了多年)。但请注意,Dovecot 不支持搜索MESSAGEID键,并且其语法INTHREAD REFS与标准草案所说的不同。不过,上面的命令有效。

如果您需要在没有任何扩展的情况下工作,那么您似乎没有其他机会,只能:

  • 立即获取HEADER.FIELDS[Message-Id References In-Reply-To]并分析客户端的消息,
  • 每当您SEARCH HEADER References返回一个新的 UID 时, fetch HEADER.FIELDS[References In-Reply-To],从那里提取“新”消息 ID,将它们添加到队列的末尾并继续进行。

最后,如果您主要针对 Gmail 用户,您也可以依赖 GMail X-GM-THRID,但请注意,它们的实现相当有限,包括每个线程最多 100 条消息的硬性限制、非标准线程关联等。

好吧,选择你的毒药。

于 2013-05-31T17:25:23.740 回答