当前位置: 首页 > 知识库问答 >
问题:

java imap、性能问题、获取所有邮件

孙梓
2023-03-14

我将使用java邮件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是不安全的(在某些情况下可以由邮件服务器更改),对于新邮件,我将另外使用一个自定义哈希值,该值是根据标题subject receivedate中的message id生成的,并构建一个md5哈希。仅对于可能的新邮件,我将使用此哈希并捕获新邮件。对于移动的邮件,因为它们的UID将在新文件夹中更改,所以它将在第一个文件夹中被标记为已删除,并在新文件夹中成为新邮件,但邮件将具有相同的自定义哈希值,因为邮件头中的邮件id和其他属性在移动过程中保持不变。

性能问题:每次点击文件夹(文件夹同步)时,我都会将文件夹中的所有uid与数据库中存储的本地uid列表进行比较,以了解已删除的uid。我找不到其他更好的方法来实现这一点。正如您所知,thunderbird会在不重新登录的情况下立即捕获已删除的邮件,即使文件夹很大且已删除的邮件非常旧(5年)。我认为雷鸟还将该文件夹中的所有消息UID与本地存储的列表进行了比较。

如何实现更好的同步机制以获得更好的性能?雷鸟应用了不同的方法吗?雷鸟怎么能这么快完成呢?

如果我们只对新邮件感兴趣,我可以保留上次存储的uid,只在以后比较新邮件,但对于删除的邮件,我已经需要比较完整的文件夹。此外,UIDNEXT值在我的邮件服务器中始终为-1,如果设置正确,将无法帮助再次删除,必须进行完整比较,我想,我错了吗?

注意:我不能使用或添加消息监听器,因为应用程序是基于服务器-客户端的,邮件处理任务在服务器端,我们不支持线程监听器等。事件应该从客户端触发,请求正在服务器上处理,并返回响应,客户端在gui上处理响应。

共有2个答案

艾泉
2023-03-14

如果您不能使用线程从邮件服务器监听这些事件,那么您的选项非常有限。也许你能做的最好的事情就是将重新同步限制在对客户端可见的消息上。

夏骏
2023-03-14

在这两种情况下,您需要的是condstore或quick resync,RFC7162。雷鸟就是这么用的。

这是一对支持命令的扩展,比如“给我上一次连接后更改的所有UID”、“告诉我删除了什么”等等。

 类似资料:
  • 问题内容: 有没有一种方法可以通过sql语句或vba代码从访问文件中返回所有表?“我不知道桌子的名字” 例如,当您希望表中包含所有字段时,无论字段名称如何,都使用“ *”。 但是如何获得所有表? 问题答案: 这将带回MS Access数据库中的所有表(包括链接表) 它还包含Sys表,因此您可能要排除以 MSys 开头的表 __ 看一下 使用MSysObjects 选择“表” AS [表],MSys

  • 与1/10比例的实时数据库相比,我在检索存储在文档中的基本数据时,Firestore的性能问题很慢。 使用FiRecovery,第一次通话平均需要3000毫秒 使用实时数据库,第一次通话平均需要300毫秒 这是网络控制台的屏幕截图: 我正在使用AngularFire2 v5.0 rc运行Javascript SDK v4.50。2. 有没有人遇到过这个问题?

  • 问题内容: 如何在此页面上获取此“ h2”标题的所有“ href”属性? 我尝试过的没有得到href的是: 这没有获得“ a”标签的链接。如果我在“ a”标签上找到了所有元素,它将返回页面上的每个href(这不是我想要的)。我只想返回上述标题,但能够获取其url“ href”属性。 问题答案: 这是从所有页面获取所有书籍的代码:

  • 问题内容: 我想获得所有可能的可用货币。 Java 7提供了这样的功能。 但是,我仍在使用Java 6进行开发和部署。我可以知道如何获得所有可能的货币吗?代码示例是最受欢迎的。 问题答案: 在研究了ISO表和Currency类文档之后,您似乎可以将货币作为代码或语言环境了。并且Locale类有一个方法。 因此,代码为: 希望这可以帮助。

  • 问题内容: 我在Java2D方面表现有些古怪。我知道sun.java2d.opengl VM参数可以为2D启用3D加速,但是即使使用该参数也有一些奇怪的问题。 这是我运行的测试结果: 在JComponent上绘制具有32x32像素图块的25x18地图, 图像1 = .bmp格式,图像2 = .png格式 没有-Dsun.java2d.opengl = true 使用.BMP图像1的120 FPS使

  • 最近,我们将数据库从11g更新为19c。 在新数据库版本中测试应用程序时,我们遇到了一个特定视图的性能问题,该视图工作得非常好,但在19c中会导致性能问题。 在分析计划时,我们看到执行计划发生了巨大变化,这导致了19c中视图的性能非常差。 令人惊讶的是,其他观点的效果很好。 如果你能对这个问题有所了解,那就太好了。 谢谢你,JD