【问题标题】:JavaMail API - Reading a large outlook mailbox (>3000) for message contentJavaMail API - 为邮件内容读取大型 Outlook 邮箱 (>3000)
【发布时间】:2018-04-23 00:07:18
【问题描述】:

我需要阅读一个包含 3000 多封邮件的邮箱。我需要阅读这些邮件,获取它们的邮件内容并将正文输入另一个 api。用几封邮件很容易(对我来说大约是 250 封),但在那之后它的速度明显变慢了。在这个link 中被接受的答案是什么? 唯一的选择,还是有其他替代方法。

注意:我故意没有粘贴任何 sn-p,因为我使用了直接的方法,是的,我也使用了 FetchProfile。

【问题讨论】:

    标签: java email outlook jakarta-mail


    【解决方案1】:

    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 命令,如你提到的链接。

    【讨论】:

    • 我对代码做了三处改动: 1. mail.imap.partialfetch = false 2. 向 FetchProfile 对象添加 IMAPFolder.FetchProfileItem.MESSAGE 3. 在每封邮件被解析后使用 invalidateHeaders() 方法.这显着提高了性能,但是我很想知道这个部分提取是如何工作的,我没有很好地解释它从一个缓冲区到下一个缓冲区的控制流。
    • 当您请求更多数据(例如,从 getInputStream 返回的流中读取)并且缓冲区为空时,它会请求更多数据。
    猜你喜欢
    • 2017-11-09
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 2014-05-20
    • 2021-12-29
    相关资源
    最近更新 更多