IMAP - 如何在对话线程中搜索所有消息?

Bra*_*rks 7 email search imap

我正在开发一个IMAP客户端,并希望能够找到会话线程中引用的所有消息的列表.

我知道"引用"标题包含对话中引用的消息列表,所以我尝试搜索它:

TAG1 UID SEARCH all HEADER References "<CAOZnC-Nr+Q+bS_Nn5XiZ6A-kw=ZRBYrNbdoRfgZ65OjGA4_BKg@mail.gmail.com>"
Run Code Online (Sandbox Code Playgroud)

但它什么也没有回报.我已经使用"Message-ID"标头成功搜索了一条消息,如下所示:

TAG2 UID SEARCH all HEADER Message-ID "<918171f1-8822-4869-afb4-de76b05b850b@xtnvmta101.xt.local>"
Run Code Online (Sandbox Code Playgroud)

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

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

Jan*_*rát 9

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

1 UID SEARCH HEADER references "<CAOZnC-Nr+Q+bS_Nn5XiZ6A-kw=ZRBYrNbdoRfgZ65OjGA4_BKg@mail.gmail.com>"
Run Code Online (Sandbox Code Playgroud)

那会让你前进.

但是,请记住,References嵌套消息的标题可能包含线程中较早的消息将包含的内容 - 通用行长度限制适用,这意味着标题总大小是有限的,并且"中间"项可能会被删除.

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

1 UID SEARCH INTHREAD REFS HEADER Message-Id "something"
Run Code Online (Sandbox Code Playgroud)

我实际上已经用Dovecot进行了测试并且它可以工作(并且已经工作了多年).请注意,达夫科特不支持MESSAGEID搜索键,不过,该语法INTHREAD REFS比标准草案说什么不同.但是上面的命令可行.

如果您需要在没有任何扩展的情况下工作,那么看起来您没有其他机会可以:

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

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

好吧,选择你的毒药.