You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by "Tran Hong Quan (Jira)" <se...@james.apache.org> on 2021/04/05 04:42:00 UTC
[jira] [Comment Edited] (JAMES-3516) [GSOC-2021] Implement Thread
support for JMAP
[ https://issues.apache.org/jira/browse/JAMES-3516?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17314667#comment-17314667 ]
Tran Hong Quan edited comment on JAMES-3516 at 4/5/21, 4:41 AM:
----------------------------------------------------------------
Hello guys, I have some ideas. Please have a look at it.
*How do we implement the Spec?*
Whenever we do email/set, we need to decide which thread that email belong to.
We had MailboxChangeListener subscribing to a saving email event. My idea is that I will modify this MailboxChangeListener, whenever there is a saving email event, I will do some algorithm to classify email then call ThreadManager (a storage APIs) . If the new email is not related to any before emails, I create a new thread. If the new email sastifies two Spec conditions:
“1. An identical message id [@!RFC5322] appears in both messages in any of the Message-Id, In-Reply-To, and References header fields.
2. After stripping automatically added prefixes such as “Fwd:”, “Re:”, “[List-Tag]”, etc., and ignoring white space, the subjects are the same.” then that email’s Id will be put in related threadId.
*What information do I need?*
Create a table “Thread”in database have these field:
- accountId
- threadId
- emailIds (a list of email ids which belong to upon threadId)
Primary key: (accountId, threadId)
*What Storage API do I need?*
ThreadManager:
- createThread(accountId AccountId, messageId MessageId)
- updateThread(accountId AccountId, threadId ThreadId, messageId MessageId): put messageId into existed thread
- getEmailIds(accountId AccoundId, threadId ThreadId) return Optional<List<MessageId>>
- getThreadId(accountId AccountId, messageId MessageId)
- …
*What algorithm do I need?*
This will check if the email is related to user’s another emails
Input: AccountId, MessageId, Subject
Output: Optional<ThreadId>
Idea:
- Create a POJO object MessageIdWithSubject(MessageId, Subject)
- Using accountId get a List<MessageIdWithSubject> of that user
- Check if two Spec conditions is satisfied: compare MessageId and Subject(after stripping).
- If the conditions are sastisfied, stop algorithm, return threadId of the existed email using getThreadId. Then updateThread
- If the conditions are not satisfied, return Optional.empty. Then create a new Thread using createThread(accountId AccountId, messageId MessageId)
*What happen when?*
_- I receive a mail (Email/set)_
Publish email save event, then MailboxChangeListener will listen to this event, then call some ThreadManager API
_- I read a mail (email/get)_
This method required email’s metadata – which have “threadId” property. Now implementation for this property is naive implementation. Following the changes, we need to call ThreadManager API getThreadId(accountId AccountId, messageId MessageId).
_- I read a thread (thread/get)_
Using ThreadManager API getEmailIds(accountId AccountId, threadId ThreadId) to get email List if present, else return Optional.empty
- ...
was (Author: quanth):
Hello guys, I have some ideas. Please have a look at it.
*How do we implement the Spec?*
Whenever we do email/set, we need to decide which thread that email belong to.
We had MailboxChangeListener subscribing to a saving email event. My idea is that I will modify this MailboxChangeListener, whenever there is a saving email event, I will do some algorithm to classify email then call ThreadManager (a storage APIs) . If the new email is not related to any before emails, I create a new thread. If the new email sastifies two Spec conditions:
“1. An identical message id [@!RFC5322] appears in both messages in any of the Message-Id, In-Reply-To, and References header fields.
2. After stripping automatically added prefixes such as “Fwd:”, “Re:”, “[List-Tag]”, etc., and ignoring white space, the subjects are the same.” then that email’s Id will be put in related threadId.
*What information do I need?*
Create a table “Thread”in database have these field:
- accountId
- threadId
- emailIds (a list of email ids which belong to upon threadId)
Primary key: (accountId, threadId)
*What Storage API do I need?*
ThreadManager:
- createThread(accountId AccountId, messageId MessageId)
- updateThread(accountId AccountId, threadId ThreadId, messageId MessageId): put messageId into existed thread
- getEmailIds(accountId AccoundId, threadId ThreadId) return Optional<List<MessageId>>
- getThreadId(accountId AccountId, messageId MessageId)
- …
*What algorithm do I need?*
This will check if the email is related to user’s another emails
Input: AccountId, MessageId, Subject
Output: Optional<ThreadId>
Idea:
- Create a POJO object MessageIdWithSubject(MessageId, Subject)
- Using accountId get a List<MessageIdWithSubject> of that user
- Check if two Spec conditions is satisfied: compare MessageId and Subject(after stripping).
- If the conditions are sastisfied, stop algorithm, return threadId of the existed email using getThreadId. Then updateThread
- If the conditions are not satisfied, return Optional.empty. Then create a new Thread using createThread(accountId AccountId, messageId MessageId)
*What happen when?*
_- I receive a mail (Email/set)_
Publish email save event, then MailboxChangeListener will listen to this event, then call some ThreadManager API
_- I read a mail (email/get)_
This method required email’s metadata – which have “threadId” property. Now implementation for this property is naive implementation. Following the changes, we need to call ThreadManager API getThreadId(messageId) to return a ThreadId string.
_- I read a thread (thread/get)_
Using ThreadManager API getEmailIds(accountId AccountId, threadId ThreadId) to get email List if present, else return Optional.empty
- ...
> [GSOC-2021] Implement Thread support for JMAP
> ---------------------------------------------
>
> Key: JAMES-3516
> URL: https://issues.apache.org/jira/browse/JAMES-3516
> Project: James Server
> Issue Type: New Feature
> Components: elasticsearch, JMAP, mailbox
> Reporter: Benoit Tellier
> Assignee: Antoine Duprat
> Priority: Major
> Labels: gsoc, gsoc2021, mentor
>
> h3. Why ?
> Mail user agents generally allow displaying emails grouped by conversations (replies, forward, etc...).
> As part of JMAP RFC-8621 implementation, there is a dedicated concepts: threads. We did implement JMAP Threads in a rather naive way: each email is a thread of its own.
> This naive implementation is specification compliant but defeat the overall purposes of threads.
> I propose myself to mentor the implementation of Threads as part of the James JMAP implementation.
> See: https://jmap.io/spec-mail.html#threads
--
This message was sent by Atlassian Jira
(v8.3.4#803005)
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org