首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何只从imap下载新邮件?

如何只从imap下载新邮件?
EN

Stack Overflow用户
提问于 2011-01-18 22:14:51
回答 4查看 13K关注 0票数 8

我有一个应用程序,是用来归档电子邮件使用imap。此应用程序中还有许多需要存档的imap帐户。

在这一时刻,应用程序时不时地连接到imap帐户,并只下载新的电子邮件。我的问题是,每次连接到imap帐户时,它都会验证所有文件夹中的所有电子邮件,并且只下载尚未下载的电子邮件(我为所有电子邮件存储Message-ID,只下载未存储Message-ID的电子邮件)。所以我想知道是否有替代方案,因为它需要一些时间来验证所有的电子邮件(对于10-20K,需要2-5分钟)。

我使用imap连接到JavaMail帐户。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-18 22:26:03

javadoc有助于:

IMAPFolder提供了以下方法:

getMessagesByUID(长开始,长结束)和

getUID(消息消息)

使用getUID()可以获得您已经下载的最后一封邮件的UID。使用getMessagesByUID,您可以将下载的最后一条消息定义为起始范围,并使用getUIDNext()方法查找最后一条消息,这将是范围的结束。

票数 6
EN

Stack Overflow用户

发布于 2011-01-18 22:30:57

只检查标题,当你到达一个已知的(最后一个已知的)时,跳出:

例如(我今天感觉特别好),这是一个来自真实生产代码的例外(一些部分被剪切了,所以它可能无法编译,state.processed是某种集合,最好是LinkedHashMap代理keySet()

代码语言:javascript
运行
复制
 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) {}
    }
票数 3
EN

Stack Overflow用户

发布于 2011-01-19 01:18:15

根据SEEN标志进行过滤。此标志用于查找新消息。需要注意的是,如果您的用户使用多个阅读器,那么它可能已经在使用另一个阅读器时被看到。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4725063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档