Rails Griddler和对话/电子邮件线程

时间:2015-06-11 07:47:11

标签: ruby-on-rails email ruby-on-rails-4 email-threading griddler

我正在努力研究如何最好地连接/连接电子邮件链。这似乎是一个常见的问题,我很惊讶我无法轻易找到其他人如何处理它的信息。我发现的唯一一件事是关于JWZ threading的帖子,它更关注在一封电子邮件中解析一个线程。我想知道是否有人能指出我当前的一些解决方案。

我正在使用思想机器人griddler gem处理传入的电子邮件到模型Message(s)和单独的模型Contact(s),我有第三个用于存储回复的模型,例如Reply

我目前的想法是通过独特的联系方式和主题线来解决它们。但话题再次略有改变。例如来自“这个主题” - > “Re:re:这个主题”我可以使用正则表达式尝试解析“re:”或者我可以使用类似amatch的字符串进行字符串比较吗?

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

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

我对如何做到这一点很粗略,我只是好奇地看到一些当前的实现,我似乎无法找到任何实现。

任何指针都将非常感谢!

2 个答案:

答案 0 :(得分:7)

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

反省电子邮件标题并查找某些特定标题。

您要使用的关键词是Message-IDIn-Reply-ToReferences。这些标题为您提供有关回复哪条消息以及其他哪些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

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