我正在努力研究如何最好地连接/连接电子邮件链。这似乎是一个常见的问题,我很惊讶我无法轻易找到其他人如何处理它的信息。我发现的唯一一件事是关于JWZ threading的帖子,它更关注在一封电子邮件中解析一个线程。我想知道是否有人能指出我当前的一些解决方案。
我正在使用思想机器人griddler gem处理传入的电子邮件到模型Message(s)
和单独的模型Contact(s)
,我有第三个用于存储回复的模型,例如Reply
。
我目前的想法是通过独特的联系方式和主题线来解决它们。但话题再次略有改变。例如来自“这个主题” - > “Re:re:这个主题”我可以使用正则表达式尝试解析“re:”或者我可以使用类似amatch的字符串进行字符串比较吗?
但话又说回来,2个月后为同一个用户出现的同一主题该怎么办?还添加一些关于当前日期的逻辑,以便线程仅使用最近的电子邮件。那么电子邮件标题本身可能还有其他有用的东西吗?
我对如何做到这一点很粗略,我只是好奇地看到一些当前的实现,我似乎无法找到任何实现。
任何指针都将非常感谢!
答案 0 :(得分:7)
电子邮件线程是一个链接列表,标题中的信息包含足够的信息,可以从其组成部分重建列表。
反省电子邮件标题并查找某些特定标题。
您要使用的关键词是Message-ID
,In-Reply-To
和References
。这些标题为您提供有关回复哪条消息以及其他哪些ID对电子邮件线程本身很重要的信息。
查找有关电子邮件标题信息的最简单方法是打开“原始邮件”。在gmail中(来自更多菜单)。
答案 1 :(得分:0)
有一个名为Msgthr的新宝石,它是一个实现JWZ的算法。这不是主题,发件人或日期的匹配,所以它不是你想要的,但我认为这是一个好的开始。
关于Msgthr
的最重要的事情是它与容器无关,因此您不必像Frederik Dietz的ruby端口那样安装诸如TMail
之类的要求。这也意味着它可以用于其他类型的通信。
这是一些示例代码,给定一个消息列表,让我们将它们分组到线程中:
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
披露:我是宝石的贡献者之一。