17

我正在尝试找出如何最好地连接/串接一连串电子邮件。这似乎是一个常见的问题,令我惊讶的是我无法轻松找到其他人如何处理它的信息。我唯一发现的是一篇关于JWZ 线程的帖子,它看起来更关心在一封电子邮件中解析一个线程。我想知道是否有人可以向我指出一些当前的解决方案。

我正在使用thoughtbot griddler gem将传入的电子邮件处理成一个模型Message(s)和一个单独的模型Contact(s),我还有第三个模型用于存储回复,例如Reply

我目前的想法是通过独特的联系人和主题行将它们串联起来。但话又说回来,主题行会略有变化。例如,从“这个主题”->“回复:回复:这个主题”我可以使用正则表达式来尝试解析出“回复:”或者我可以使用类似amatch的东西来进行字符串比较?

但是话又说回来,两个月后同一用户出现的同一主题该怎么办?还添加一些关于当前日期的逻辑,以便线程只使用最近的电子邮件。那么电子邮件标头本身中可能存储了其他有用的东西吗?

  • 用户(通过唯一的电子邮件地址)
  • 唯一主题行(正则表达式:处理问题?)
  • 当前日期(电子邮件必须是相对于彼此的日期)
  • 在电子邮件标题中寻找其他一些线索?

我对如何做有一个粗略的想法,我只是想看看一些当前的实现,我似乎找不到任何实现。

任何指针将不胜感激!

4

2 回答 2

7

电子邮件线程是一个链接列表,标题中的信息包含足够的信息来从其组成部分重建列表。

内省电子邮件标题并寻找一些特定的标题。

您将使用的关键是Message-ID,In-Reply-ToReferences。这些标头为您提供有关回复了哪条消息以及其他哪些 ID 对电子邮件线程本身很重要的信息。

查找有关电子邮件标题的信息的最简单方法是在 gmail 中打开“原始消息”(从更多菜单中)。

于 2015-06-19T05:45:08.653 回答
0

有一个名为Msgthr的新 gem ,它是 JWZ 算法的实现。它不匹配主题、发件人或日期,所以它不完全是您正在寻找的东西,但我认为这是一个好的开始。

最巧妙的Msgthr是它与容器无关,因此您不必TMail像 Frederik Dietz 的 ruby​​ 端口那样安装要求。这也意味着它可以用于其他类型的通信。

这是一些示例代码,给定消息列表,让我们将它们分组为线程:

thr = Msgthr.new
threads = {}
[1, 11, 12, 2, 21, 211].each{ |id| threads[id] = [id]}
my_add = lambda do |id, refs, msg|
  thr.add(id, refs, msg) do |parent, child|
    threads[child.mid] = threads[parent.mid]
  end
end
# Create the following structure
# 1
#  \
#  | 1.1
#  \
#    1.2
# 2
#   \
#    2.1
#       \
#         2.1.1
my_add.call(1, nil, '1')
my_add.call(11, [1], '1.1')
my_add.call(12, [1], '1.2')
my_add.call(2, nil, '2')
my_add.call(21, [2], '2.1')
my_add.call(211, [21], '2.1.1')

thr.thread!
thr.rootset.each do |cnt|
  threads[cnt.mid][0] = cnt.msg
end

披露:我是宝石的贡献者之一。

于 2018-01-27T22:24:28.337 回答