【发布时间】:2015-07-20 17:50:18
【问题描述】:
我将使用 java mail api 来处理雷鸟等邮件。我必须获取包含 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 列表与存储在我的数据库中的列表进行比较。 对于已删除的,例如一条消息不在文件夹中但在数据库中,我会将其标记为已删除。 对于新的,例如一条消息在文件夹中但不在数据库中,我将标记为可能是新的。但是,因为 messageuid 不安全(在某些情况下可以由邮件服务器更改),对于新邮件,我将使用额外的自定义散列值,从标头中的消息 id + 主题 + receivedate 构建并构建 md5 散列。仅对于可能的新邮件,我将使用此哈希并捕获新邮件。 对于被移动的消息,由于它们的uid在新文件夹中会发生变化,它会在第一个被标记为已删除,并且将是新文件夹中的新消息,但是由于消息头中的消息ID,该消息将具有相同的自定义哈希值移动期间其他属性将保持不变。
关于性能问题的问题:在每次点击文件夹(文件夹同步)时,我都会将文件夹中的所有 uid 与存储在数据库中的本地 uid 列表进行比较操作,以了解已删除的.我找不到另一种更好的方法来实现这一点。如您所知,即使文件夹很大并且已删除的邮件很旧(5 年),Thunderbird 也会立即捕获已删除的邮件而无需重新登录。我认为 Thunderbird 还会将该文件夹中的所有消息 uid 与本地存储的列表进行比较。
如何实现更好的同步机制以获得更好的性能?雷鸟是否采用不同的方法?雷鸟怎么可能 这么快就完成了?
如果我们只对新消息感兴趣,我可以保留最后存储的 uid 并且只比较晚于新消息,但对于已删除的消息,我已经必须比较完整文件夹。此外,我的邮件服务器中的 UIDNEXT 值始终为 -1,如果设置正确,再次删除将无济于事,我认为必须进行完整比较,我错了吗?
注意:我不能不使用或添加消息监听器,因为应用程序是基于服务器客户端的,邮件处理任务在服务器端,我们不支持线程监听器等。事件应该从客户端触发,请求正在服务器上处理并返回响应,客户端在 gui 上处理响应。
【问题讨论】:
标签: email jakarta-mail imap fetch uid