【问题标题】:Is it possible to use IMAP + paging?是否可以使用 IMAP + 分页?
【发布时间】:2010-11-26 03:46:43
【问题描述】:

我需要将 IMAP 客户端作为 Web 应用程序

我实现了Sorting as的功能:

   //userFolder is an Object of IMAPFolder
   Message[] messages = userFolder.getMessages();

   Arrays.sort(messages, new Comparator<Message>()
    {
        public int compare(Message message1, Message message2)
        {
            int returnValue = 0;
            try
            {
                if (sortCriteria == SORT_SENT_DATE)
                {
                    returnValue = message1.getSentDate().compareTo(message2.getSentDate());
                }
            } catch (Exception e)
            {
                System.out.println(e.getMessage());
                e.printStackTrace();
            }

            if (sortType == SORT_TYPE_DESCENDING)
            {
                returnValue = -returnValue;
            }

            return returnValue;
        }
    });

代码 sn-p 不完整,只是简短 SORT_SENT_DATE,SORT_TYPE_DESCENDING 是我自己的常量。

实际上这个解决方案工作正常,但它在分页逻辑上失败 作为一个基于 Web 的应用程序,我不能期望服务器为每个用户加载所有消息并对其进行排序 (我们确实有 > 1000 个同时用户的邮箱有 > 1000 条消息的情况)

Web 服务器加载全部、排序、只返回一小部分(比如 1-20)也是没有意义的, 并在下一个请求中,再次加载所有排序并返回(21-40)。可以缓存,但保证用户实际上会提出请求吗?

我听说有一个名为 FetchProfile 的类,这对我有帮助吗? (我想它仍然会加载所有消息,但只加载所需的信息) 有没有其他方法可以实现这一目标?

我需要一个也适用于搜索操作(使用分页搜索)的解决方案, 我已经建立了一个架构来创建一个 SearchTerm,但在这里我也需要分页。

对于参考,我在以下位置提出了同样的问题: http://www.coderanch.com/t/461408/Other-JSE-JEE-APIs/java/it-possible-use-IMAP-paging

【问题讨论】:

    标签: java web-applications email


    【解决方案1】:

    您需要一个扩展名为SORT 的服务器,即使它可能不是enough。然后,您对特定邮箱发出 SORT 并仅 FETCH 那些落在您视图中的邮件编号。

    基于 cmets 的更新:

    对于 SORT 扩展不可用的服务器,下一个最好的方法是获取代表所有项目排序键的 FETCH 标头字段(例如,FETCH 1:* BODY[HEADER.FIELDS(SUBJECT)] 用于主题或FETCH 1:* BODY[HEADER.FIELDS(DATA)] 用于发送日期),然后根据钥匙。通过这种方式,您将获得排序后的消息编号列表,该列表应该等同于 SORT 命令返回的内容。

    如果允许服务器端缓存,那么最好的方法是保留信封缓存(在 IMAP ENVELOPE 意义上),然后使用RFC 4549 中描述的技术对其进行更新。有了这个缓存,很容易排序和分页。

    Java 上有两个 IMAP API - 官方 JavaMail API 和 Risoretto。 Risoretto 更底层,应该允许实现上述任何内容,JavaMail 可能也可以这样做,但我没有太多经验。

    【讨论】:

    • 顺便说一句,我从未尝试使用 JavaMail API 来实现这一点,但开源 Risoretto (columba.sourceforge.net/ristretto-1.0-docs) 库应该支持它。
    • +1 建议,我的服务器不支持排序扩展(我目前正在使用 GMAIL 进行测试)
    • 纯粹用 IMAP 术语来说,SORT 扩展之后的第二个最佳方法是执行 FETCH 1:* BODY.PEEK[HEADER.FIELDS(SUBJECT)],它将返回排序键。然后您可以对其进行排序,并获得与从 SORT 接收到的消息编号列表等效的消息编号列表。不幸的是,这可能不是在实践中实现它的最佳方式。 -- 我们在应用程序中所做的是获取所有信封(在信封的 IMAP 定义中)并缓存它们。然后我们同步缓存(RFC4549 - isi.edu/in-notes/rfc4549.txt)并将其用于排序和显示。
    • 显然 FetchProfile 类支持获取单个标题字段 - ermalaev.spb.ru/products/javamail/javadocs/javax/mail/… - 但我自己从未使用过。
    • @Salvin Francis,是的,但是如果没有 SORT 扩展,就 IMAP 而言没有更好的方法。你可以做服务器端缓存。
    猜你喜欢
    • 1970-01-01
    • 2012-06-16
    • 2011-02-27
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多