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
Раскрытие информации: Я являюсь одним из участников драгоценного камня.