我将使用java mail api来处理像thunderbird等邮件。我必须获取包含1000条消息的邮件。我的设计将是:当用户对文件夹执行同步时,我将获取文件夹中所有消息的uid:
Message[] msgs = ufolder.getMessagesByUID(1, UIDFolder.LASTUID);
// Use a suitable FetchProfile
FetchProfile fp = new FetchProfile();
fp.add(FetchProfile.Item.ENVELOPE);
fp.add(FetchProfile.Item.FLAGS);
然后我会将uid列表与我的db中存储的列表进行比较。 对于已删除的消息,例如消息不在文件夹中但在数据库中,我将其标记为已删除。 对于新的,例如消息在文件夹中但不在数据库中,我将标记为新的。但是,因为messageuids不安全(在某些情况下可以由邮件服务器更改),对于新邮件,我将使用additioanlly自定义哈希值构建来自标头+ subject + receivedate中的消息id并构建md5哈希。仅对于可能的新邮件,我将使用此哈希并捕获新邮件。 对于移动的消息,因为它们的uid将在新文件夹中更改,它将在第一个中被标记为已删除,并且将是新文件夹中的新消息,但该消息将具有相同的自定义散列值,因为标题中的消息ID运动中的其他属性将保持不变。
关于性能问题的问题:在每次点击文件夹(文件夹同步)时,我将对文件夹中所有uid的比较操作与数据库中存储的本地uid列表进行比较,以了解已删除的文件。我找不到另一种更好的方法来实现这一目标。如您所知,即使文件夹很大且删除的邮件很旧(5年),thunderbird会立即捕获已删除的邮件,而不会重新登录。我认为thunderbird还会将该文件夹中的所有消息uid与本地存储的列表进行比较。
如何实现更好的同步机制以获得更好的性能?雷鸟是否采用了不同的方法?雷鸟怎么样? 很快完成它?
如果我们只对新消息感兴趣,我可以保留最后存储的uid,只比之后比较新消息,但对于已删除的消息,我必须比较完整文件夹。另外,我的邮件服务器中的UIDNEXT值始终为-1,如果设置正确,则无法再次删除,完全比较是我必须考虑的,我错了吗?
注意:我不能使用或添加消息监听器,因为appliaction是基于服务器客户端的,而邮件处理任务是在服务器端,我们不支持线程监听器等。事件应该从客户端触发,正在服务器上处理请求,并返回响应,客户端处理gui上的响应。
答案 0 :(得分:3)
在这两种情况下,您想要的是condstore或快速重新同步,RFC7162。这就是Thunderbird使用的。
这是一对扩展支持命令,例如“给我自上次连接以来所有已更改的UID”,“告诉我删除了什么”等等。
答案 1 :(得分:0)
如果您无法使用线程从邮件服务器侦听这些事件,那么您的选项非常有限。您可以做的最好的事情是将重新同步限制为客户端可见的消息。