Rails Griddler и цепочка разговора/электронной почты

Я пытаюсь понять, как лучше всего подключиться/направить цепочку писем. Это кажется такой общей проблемой, что я был удивлен, что я не мог легко найти информацию о том, как другие люди справились с этим. Единственное, что я нашел, это сообщение о JWZ threading, которое больше заботило синтаксический анализ потока в одном письме. Мне было интересно, может ли кто-нибудь указать мне на некоторые текущие решения.

Я использую мысленный кусок griddler gem для обработки входящих писем в модель Message(s) и отдельную модель Contact(s), и у меня есть третья модель для сохранение ответов, например Reply.

Мое современное мышление заключается в том, чтобы натолкнуть их на уникальный контакт и тему темы. Но опять же строка темы изменится незначительно. например от "Этот вопрос" → "Re: re: Этот вопрос" Я мог бы использовать регулярное выражение, чтобы попытаться разобрать "re:" или я мог бы использовать что-то вроде amatch выполнить сравнения строк?

Но опять же, что делать с тем же вопросом, появляющимся для того же пользователя через 2 месяца? Также добавьте некоторую логику относительно текущей даты, чтобы потоки использовали только последние электронные письма. Тогда может быть что-то еще полезное в самом заголовке электронной почты?

  • Пользователь (по уникальному адресу электронной почты)
  • Уникальная строка темы (regex re: вопросы обработки?)
  • Текущая дата (электронная почта должна быть датой относительно друг друга)
  • Некоторые другие подсказки, которые нужно искать в заголовке электронной почты?

У меня есть грубое представление о том, как это сделать, мне просто любопытно увидеть некоторые текущие реализации, я просто не могу найти их.

Любые указатели будут очень благодарны!

Ответы

Ответ 1

Потоки электронной почты являются связанным списком, информация в заголовках содержит достаточно информации для восстановления списка из его составных частей.

Взгляните на заголовки электронной почты и найдите некоторые определенные заголовки.

Ключевыми, которые вы будете использовать, являются Message-ID, In-Reply-To и References. Эти заголовки предоставляют вам информацию о том, какое сообщение было отправлено, и какие другие значения имеют значение для самой электронной почты.

Самый простой способ найти информацию об заголовках электронной почты - открыть "Исходное сообщение" в gmail (из большего меню).

Ответ 2

Существует новый камень с именем Msgthr, который является алгоритмом JWZ реализации. Это не соответствует темам, отправителям или датам, так что это не совсем то, что вы ищете, но я думаю, что это хорошее начало.

Самая сложная вещь о Msgthr заключается в том, что она является агентом-агностиком, поэтому вам не нужно устанавливать такие требования, как TMail, как в рубиновом порту Frederik Dietz. Это также означает, что он может использоваться для других типов связи.

Вот пример кода, заданного списком сообщений, позволяет группировать их в потоки:

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

Раскрытие информации: Я являюсь одним из участников драгоценного камня.