我要求阅读邮件超过3000封的邮箱。我需要阅读这些邮件,获取他们的邮件内容并将身体送入另一个api。它很容易用一些邮件(对我来说它大约250),但之后它显着减慢。这是link中接受的答案 唯一的选择,还是有其他替代方式。
注意:我故意不粘贴任何片段,因为我使用了直接的方法,是的,我确实也使用了FetchProfile。
答案 0 :(得分:3)
JavaMail IMAP性能通常由服务器的速度,所需的网络往返次数以及正在读取的数据量来控制。使用FetchProfile对于减少往返次数至关重要。不要忘记考虑IMAP-specific FetchProfile items。
JavaMail将一次获取缓冲区内的消息内容。大消息显然需要许多缓冲区提取,因此需要多次往返。您可以通过设置mail.imap.fetchsize
属性来更改缓冲区的大小(默认为16K)。或者,您可以通过将mail.imap.partialfetch
属性设置为false来禁用这些部分提取并要求它在一个操作中获取整个内容。显然,如果正在读取大量消息,后者将需要在客户端上有大量内存。
JavaMail IMAP提供程序(通常;见下文)不会在客户端上缓存消息内容,但它会缓存消息头。处理大量消息时,通过调用IMAPMessage.invalidateHeaders方法处理消息完成后,有时会使标头缓存无效。使用IMAPFolder.FetchProfileItem.MESSAGE时,消息内容为缓存,并且上述调用也将使其无效。
除此之外,您应该检查JavaMail debug output以确保只发出预期的IMAP命令,并且您在程序中没有做任何会导致它发出不必要的IMAP命令的事情。您还可以查看协议命令的时间戳,以确定是在服务器还是客户端上花费时间。
只有在所有这些都未能产生可接受的性能之后,并且您确定性能问题不在服务器上(您无法修复),您是否需要按照建议的方式查看自定义IMAP命令链接你提到的。