我有要求将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
答案 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也可以这样做,但我没有太多经验。