【问题标题】:IMAP - How to search for all messages in a conversation thread?IMAP - 如何搜索对话线程中的所有消息?
【发布时间】:2013-05-24 20:42:55
【问题描述】:

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

【问题讨论】:

  • 您的服务器是否支持 THREADING 扩展?
  • 是的,我相信我可以假设......
  • 我不知道任何细节,但tools.ietf.org/html/rfc5256 定义的 THREAD 扩展可以帮助您将消息关联在一起。
  • 原来有一些需要使用的客户端不支持 THREAD 扩展,所以如果可能的话,我必须找到另一种方法。不过感谢您的建议。

标签: email search imap


【解决方案1】:

您的搜索查询错误 - 您应该从那里删除 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 条消息的硬限制、非标准线程关联等.

好吧,选择你的毒药。

【讨论】:

  • 感谢您的反馈....我在搜索参考资料时尝试了您的变体,但我仍然没有收到任何其他消息,即使我知道它们在同一个邮箱中并且包含我的目标消息 ID 在他们的参考列表中......但这里有很多信息,我将进一步研究......
  • 看起来像您的 IMAP 服务器中的错误。试试这个,例如带有您可以控制的邮箱的 Dovecot(并通过 grep 验证标题真的匹配。
  • 我正在测试它的电子邮件服务器是 Gmail IMAP 服务器....我没有机会在其他任何东西上测试它(合同工作)...感谢您的帮助!
  • FWIW,原始查询是有效的,只是不是最优的。添加顶级“全部”术语就像添加'true ||'在 c/c++/java if() 中。
猜你喜欢
  • 2015-01-11
  • 2016-09-10
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
相关资源
最近更新 更多