是否可以使用IMAP +分页?

时间:2009-09-07 07:22:52

标签: java web-applications email

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

我实现了排序功能:

   //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;
        }
    });

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

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

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

我听说有一个叫做FetchProfile的课,能帮到我吗? (我想它仍会加载所有消息,但只是加载所需的信息) 有没有其他方法来实现这一目标?

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

对于ref,我问过同样的问题: http://www.coderanch.com/t/461408/Other-JSE-JEE-APIs/java/it-possible-use-IMAP-paging

1 个答案:

答案 0 :(得分:2)

您需要一个SORT扩展名的服务器,甚至可能不是enough。然后在特定邮箱上发出SORT,并仅对那些落入视图的消息号进行FETCH。

根据评论进行更新:

对于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也可以这样做,但我没有太多经验。