Как скачать только новые письма от imap? - PullRequest
7 голосов
/ 18 января 2011

У меня есть приложение, которое используется для архивирования электронных писем с помощью imap. Также в этом приложении много учетных записей imap, которые необходимо архивировать.

В этот момент время от времени приложение подключается к учетным записям imap и загружает только новые электронные письма. Моя проблема заключается в том, что каждый раз, когда он подключается к учетной записи imap, он проверяет все электронные письма из всех папок и загружает только электронные письма, которые еще не загружены (я сохраняю Message-ID для всех электронных писем и загружаю только те сообщения, которые имеют Message-ID, не хранится). Поэтому я хочу знать, есть ли альтернатива для этого, потому что проверка всех электронных писем занимает некоторое время (для 10-20K это занимает 2-5 минут).

Я использую JavaMail API для подключения к учетным записям imap.

Ответы [ 4 ]

6 голосов
/ 18 января 2011

javadoc помогает:

IMAPFolder предоставляет методы:

getMessagesByUID (длинный старт, длинный конец) и

getUID (Сообщение сообщения)

С помощью getUID () вы можете получить UID последнего сообщения, которое вы уже скачали. С помощью getMessagesByUID вы можете определить это последнее сообщение, которое вы загрузили, в качестве начального диапазона и просмотреть метод getUIDNext (), чтобы найти последнее сообщение, которое будет концом диапазона.

3 голосов
/ 18 января 2011

проверяйте только заголовки и, когда вы достигнете известного (последнего известного), выручите:

например (я чувствую себя очень хорошо сегодня), и это исключение из реального производственного кода (некоторые части были вырезаны, поэтому он может не компилироваться, state.processed - это некоторый набор, предпочтительно LinkedHashMap surrogate [keySet ()] (и некоторая максимальная граница логический 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) {}
    }
1 голос
/ 18 января 2011

Фильтр на флаге SEEN. Этот флаг предназначен для поиска новых сообщений. Единственное предостережение в том, что если ваш пользователь использует несколько считывателей, то, возможно, его видели с помощью другого считывателя.

0 голосов
/ 10 июня 2013

идентификатор сообщения, который входит в заголовок, всегда уникален, даже если вы установили его вручную. Я проверил его с помощью gamil и racksoace.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...