2013-04-08 213 views
1

我有以下代码,我想通过批量检索(例如:获取前50封邮件,处理它,然后获取下一个50)。目前它提取所有消息并将其存储在一个数组中。Javamail是否支持该消息?如果不是如何批量检索?使用javamail批量读取电子邮件

感谢您的回答。

Properties props = System.getProperties(); 
props.setProperty("mail.store.protocol", "imaps"); 

Session session = Session.getDefaultInstance(props, null); 
Store store = session.getStore("imaps"); 
store.connect(host, userName, password); 

Folder inbox = null; 
inbox = store.getFolder("Inbox"); 
inbox.open(Folder.READ_WRITE); 
Message[] messages = inbox.search(new FlagTerm(
     new Flags(Flag.SEEN), false)); 
FetchProfile fp = new FetchProfile(); 
fp.add(FetchProfile.Item.ENVELOPE); 
fp.add(FetchProfile.Item.CONTENT_INFO); 
inbox.fetch(messages, fp); 
for (int i = 0; i < messages.length; i++) 
{ 
    //Process a message 
} 

UPDATE:

我试图实现配料如下,但预期它不工作。

的问题是:

  • 假设有24的电子邮件收件箱中,然后totalUnread正显示出正确的,但Message[] messages = inbox.search(new FlagTerm(new Flags(Flag.SEEN), false), inbox.getMessages(batchStart, batchEnd));正在返回的只有5个而不是10个记录为BATCH_SIZE为10

  • 另一个问题被处理的电子邮件没有标记为已读,即使调用getContent()

    private static final int BATCH_SIZE = 10; 
    Properties props = System.getProperties(); 
    props.setProperty("mail.store.protocol", "imaps"); 
    AuthenticationService authenticationService = null; 
    Session session = Session.getDefaultInstance(props, null); 
    Store store = session.getStore("imaps"); 
    store.connect(host, userName, password); 
    Folder inbox = null; 
    inbox = store.getFolder("Inbox"); 
    int totalUnread = inbox.getUnreadMessageCount(); 
    if (totalUnread != 0) 
    { 
        inbox.open(Folder.READ_WRITE); 
        int batchStart = 1; 
        int batchEnd = (totalUnread > BATCH_SIZE ? BATCH_SIZE 
          : totalUnread); 
        int batchCount = 0; 
        while (true) 
        { 
         processABatch(inbox, batchStart, batchEnd, batchCount); 
         batchStart = batchEnd + 1; 
         if (batchStart > totalUnread) 
         { 
          break; 
         } 
         batchEnd = ((batchEnd + BATCH_SIZE) < totalUnread ? (batchEnd + BATCH_SIZE) 
           : totalUnread); 
         batchCount++; 
        } 
    
    } 
    inbox.close(true); 
    store.close(); 
    } 
    
    private void processABatch(Folder inbox, int batchStart, int batchEnd, int batchCount) 
         throws MessagingException 
    { 
        Message[] messages = inbox.search(new FlagTerm(new Flags(Flag.SEEN), 
          false), inbox.getMessages(batchStart, batchEnd)); 
        FetchProfile fp = new FetchProfile(); 
        fp.add(FetchProfile.Item.ENVELOPE); 
        fp.add(FetchProfile.Item.CONTENT_INFO); 
        inbox.fetch(messages, fp); 
        for (int i = 0; i < messages.length; i++) 
        { 
         processMessage(messages[i], inbox); 
        } 
    } 
    

回答

2

而不是做inbox.search(new FlagTerm(...)),你可能想要做inbox.search(new FlagTerm(...), getMessages(start, end))。它使用getMessages(int, int)方法,它允许您检索当前Folder中所有消息的子集。

事实上getMessages(start, end)适用于完整的Folder。根据该方法的Javadoc,Message对象预计会提供轻量级,因为它们只是对实际消息的引用。

因此,也许你可以写一个返回第一50未读邮件,通过不断获取消息,并把它们放在一个List或类似的东西的方法,直到您有它的50条短信或你已经达到结束Folder。该消息的结果将是“批次”。

之后,您可以对消息进行常规处理。

+0

由于'getMessages(start,end)'应用于完整的收件箱,而不是只检索未读邮件的当前过滤器,所以它看起来像建议的方法不起作用。除阅读全部(阅读和未阅读)电子邮件并批量阅读外,还有其他任何可能性吗? – Mahendran 2013-04-09 11:41:06

+0

我已根据您的其他问题更新了原始答案。 – mthmulders 2013-04-09 12:06:07