【问题标题】:How can I combine multiple IMAP fetch commands?如何组合多个 IMAP 提取命令?
【发布时间】:2015-03-28 16:27:16
【问题描述】:

我正在使用 JavaMail 从 IMAP 帐户获取邮件数据。例如,我使用以下命令检索 uid 为 1 到 4 的消息的正文:

UID FETCH 1:4 BODY[]

有没有办法获取特定消息的特定正文部分?例如,我想使用类似:

UID FETCH (1 BODY[1.3]) (2 BODY[1.1]) (3 BODY[2.1]) (4 BODY[1.4])

PS:我知道我也可以发送 4 个不同的命令,但出于性能原因,我无法为每条消息发出单独的请求。

【问题讨论】:

    标签: java imap fetch jakarta-mail


    【解决方案1】:

    您必须为每条消息检索相同的正文部分。也就是说,如果您希望消息 2 和 4 的第 1 部分和消息 3 的第 2 部分,您不能发送少于两个命令:

    a uid fetch 2,4 (body[1])
    b uid fetch 3 (body[3])
    

    好消息是您可以同时发送它们。只要命令不冲突,您就可以发送第二个,而无需等待第一个的结果。前提是您可以找到使用 Javamail 的方法。

    (或者也许是 body.peek[1],它与 body[] 相同,只是它不设置 \seen 标志。)

    【讨论】:

    • 几小时后发布此类问题,Max 代替我回答 ;) 使用线程是一种可能性,在一个连接上发送多个并发命令是另一种可能性。
    • JavaMail 不支持您正在寻找的那种低级 IMAP 命令。多线程将无济于事,因为 JavaMail 将单线程所有访问发送命令并等待响应的协议对象。您可以考虑使用多个连接,但这有其自身的一系列问题。您也许可以扩展 JavaMail 源代码以支持您的需要。您能否提供更多关于您在更高级别上尝试完成的任务以及您已经完成的性能分析的背景信息?
    • 我已经做到了,而且还不错。你看,没有多少不同的部件号,所以即使你必须为一百条消息检索正确的部件,你仍然可以使用三个命令来完成:大约 30 个需要第 1 部分,另外 30 个需要第 1.2 部分,并且大部分rest need 2. 所需命令的数量呈次线性缩放。 (让我恼火的是,我得到的响应顺序几乎与我想要的完全相反。)
    • 听起来你已经明白了,但我不得不问一个显而易见的问题......当然执行一个命令会比执行多个命令有更好的性能,但你确定了吗?差异实际上对您的应用程序很重要吗?用户真的能看出区别吗?您是否真的一次显示 100 条消息的预览文本?过早的优化等等......
    • 我们都重新学习了关于premature optimization的教训!感谢您的跟进!
    猜你喜欢
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 2022-08-08
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 2012-11-18
    • 2012-06-05
    相关资源
    最近更新 更多