Rails Griddler и обсуждение / переписка по электронной почте
Я пытаюсь выяснить, как лучше всего подключить / организовать цепочку писем. Это кажется такой распространенной проблемой, что я был удивлен, что не мог легко найти информацию о том, как другие люди справились с этим. Единственной вещью, которую я нашел, был пост о потоках JWZ, который больше интересовался анализом потока в одном письме. Мне было интересно, если кто-нибудь может указать мне некоторые текущие решения.
Я использую Gem Grid ThinkBot для обработки входящих писем в модель Message(s)
и отдельная модель Contact(s)
и у меня есть третья модель для хранения ответов, например Reply
,
В настоящее время я думаю о том, чтобы связать их уникальным контактом и темой. Но опять же сюжетная линия немного изменится. например, из "Эта тема" -> "Re: re: Эта тема" Я мог бы использовать регулярное выражение, чтобы попытаться разобрать "re:"s, или я мог бы использовать что-то вроде amatch для сравнения строк?
Но опять же, что делать с тем же предметом, появляющимся у того же пользователя через 2 месяца? Также добавьте некоторую логику относительно текущей даты, чтобы темы использовали только последние электронные письма. Тогда может быть что-то еще полезное хранится в самом заголовке письма?
- Пользователь (по уникальному адресу электронной почты)
- Уникальная тема (regex re: проблемы с обработкой?)
- Текущая дата (электронные письма должны быть датами относительно друг друга)
- Какие-то другие подсказки искать в заголовке письма?
У меня есть приблизительное представление о том, как это сделать, мне просто любопытно увидеть некоторые текущие реализации, я просто не могу их найти.
Любые указатели будут с благодарностью!
2 ответа
Потоки электронной почты представляют собой связанный список, информация в заголовках содержит достаточно информации для восстановления списка из его составных частей.
Рассмотрите заголовки электронной почты и найдите некоторые конкретные заголовки.
Ключевые из них вы будете использовать Message-ID
, In-Reply-To
а также References
, Эти заголовки дают вам информацию о том, на какое сообщение было дано ответ и какие другие идентификаторы имеют значение для самой цепочки сообщений.
Самый простой способ найти информацию о заголовках письма - открыть "Оригинальное сообщение" в Gmail (из меню "Больше").
Существует новый гем под названием Msgthr, который является алгоритмом реализации JWZ. Это не соответствует темам, отправителям или датам, так что это не совсем то, что вы ищете, но я думаю, что это хорошее начало.
Самое интересное о Msgthr
является то, что он не зависит от контейнера, поэтому вам не нужно устанавливать требования, такие как 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
Раскрытие: я один из участников жемчужины.