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

时间:2013-05-29 14:19:53

标签: email search imap

我正在使用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个邮箱,但这些邮件中至少有一半位于我的搜索目标文件夹中,并且它们不会显示在我的搜索结果中。

1 个答案:

答案 0 :(得分:9)

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

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

那会让你前进。

但是,请记住,嵌套邮件的References标题可能包含线程中早期邮件将包含的内容 - 适用通用行长度限制,这意味着total size of the header is limited and some of the "middle" items might get removed

有一些方法可以克服这种限制,例如an experimental extension中定义的INTHREAD运算符,它由Dovecot支持(并且没有其他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时,请抓取HEADER.FIELDS[References In-Reply-To],从中提取“新”消息ID,将其添加到队列末尾并继续。

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

好吧,选择你的毒药。