我有一个应用程序,是用来归档电子邮件使用imap。此应用程序中还有许多需要存档的imap帐户。
在这一时刻,应用程序时不时地连接到imap帐户,并只下载新的电子邮件。我的问题是,每次连接到imap帐户时,它都会验证所有文件夹中的所有电子邮件,并且只下载尚未下载的电子邮件(我为所有电子邮件存储Message-ID,只下载未存储Message-ID的电子邮件)。所以我想知道是否有替代方案,因为它需要一些时间来验证所有的电子邮件(对于10-20K,需要2-5分钟)。
我使用imap连接到JavaMail帐户。
发布于 2011-01-18 22:26:03
javadoc有助于:
IMAPFolder提供了以下方法:
getMessagesByUID(长开始,长结束)和
getUID(消息消息)
使用getUID()可以获得您已经下载的最后一封邮件的UID。使用getMessagesByUID,您可以将下载的最后一条消息定义为起始范围,并使用getUIDNext()方法查找最后一条消息,这将是范围的结束。
发布于 2011-01-18 22:30:57
只检查标题,当你到达一个已知的(最后一个已知的)时,跳出:
例如(我今天感觉特别好),这是一个来自真实生产代码的例外(一些部分被剪切了,所以它可能无法编译,state.processed是某种集合,最好是LinkedHashMap代理keySet()
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) {}
}
发布于 2011-01-19 01:18:15
根据SEEN标志进行过滤。此标志用于查找新消息。需要注意的是,如果您的用户使用多个阅读器,那么它可能已经在使用另一个阅读器时被看到。
https://stackoverflow.com/questions/4725063
复制相似问题