Check only the headers, and when you reach the famous (last known), release it:
for example (today I feel good) and that besides the real production code (some parts were cut out, so it cannot be compiled, state.processed is some set more preferable than LinkedHashMap surrogate [keySet ()] (and w / some maximum border boolean removeEldestEntry ())
try { store = mailSession.getStore("imap"); try { store.connect(); Folder folder = store.getFolder("INBOX"); folder.open(Folder.READ_ONLY); int count = folder.getMessageCount(); for(int localProc=0, chunk=49;localProc<10 && count>0; count -=chunk+1){ Message messages[] = folder.getMessages(Math.max(count-chunk, 1), count); FetchProfile fp = new FetchProfile(); fp.add(FetchProfile.Item.ENVELOPE); fp.add("Message-ID"); //add more headers, if need be folder.fetch(messages,fp); for (int i=messages.length;--i>=0;) { //can check abort request here Message message = messages[i]; String msgId = getHeader(message,"Message-ID"); if (msgId!=null && !state.processed.add(msgId)){ if (++localProc>=10){ break; } continue; } ///process here, catch exception, etc.. } } folder.close(false); } catch (MessagingException e) { logger.log(Level.SEVERE, "Mail messaging exception", e); } } catch (NoSuchProviderException e) { logger.log(Level.SEVERE, "No mail provider", e); } if(store != null) { try { store.close(); } catch (MessagingException e) {} }
bestsss
source share