Java 是否可以使用IMAP+;寻呼?

Java 是否可以使用IMAP+;寻呼?,java,web-applications,email,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 message

我需要将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;
        }
    });
//userFolder是IMAPFolder的对象
Message[]messages=userFolder.getMessages();
sort(消息,新的Comparator()
{
公共整数比较(消息message1、消息message2)
{
int返回值=0;
尝试
{
如果(sortCriteria==排序\发送\日期)
{
returnValue=message1.getSentDate().compareTo(message2.getSentDate());
}
}捕获(例外e)
{
System.out.println(e.getMessage());
e、 printStackTrace();
}
if(sortType==排序类型)
{
returnValue=-returnValue;
}
返回值;
}
});
代码片段不完整,只是很简短 排序\发送\日期、排序\类型\降序是我自己的常量

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

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

我听说有一个叫做FetchProfile的类,它能帮我吗?(我猜它仍然会加载所有消息,但只加载所需的信息) 有没有其他方法可以做到这一点

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

对于ref,我在以下网站上提出了同样的问题:

您需要一个带有扩展名的服务器,甚至可能不需要。然后,对特定邮箱发出SORT命令,并仅获取属于您视图的邮件编号

根据评论更新:

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

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


Java上有两个IMAP API—正式的JavaMail API和。Risoretto更低级,应该允许实现上面描述的任何东西,JavaMail也可以这样做,但我没有太多的经验。

BTW,我从来没有尝试过使用JavaMail API实现它,但是开源的Risoretto()库应该支持它。+1对于这个建议,我的服务器不支持排序扩展(我目前正在使用GMAIL进行测试),纯粹用IMAP术语来说,排序扩展之后的第二个最佳方法是获取1:*BODY.PEEK[HEADER.FIELDS(SUBJECT)],它将返回排序键。然后,您可以对其进行排序,并获得与从sort接收到的消息编号列表相同的消息编号列表。不幸的是,这可能不是在实践中实施它的最佳方式我们在out应用程序中所做的是获取所有信封(在信封的IMAP定义中)并缓存它。然后我们同步缓存(RFC4549-)并将其用于排序和显示。显然,FetchProfile类支持获取单个标题字段——但我自己从未使用过它。@Salvin Francis,是的,但没有排序扩展,就IMAP而言,没有更好的方法。不过,您可以进行服务器端缓存。