2010-03-29 6 views
4

Я использовал javamail для извлечения писем с сервера IMAP (в настоящее время GMail). Javamail извлекает список сообщений (только ids) в определенной папке с сервера очень быстро, но когда я на самом деле получаю сообщение (только конверт даже не содержимого), для каждого сообщения требуется около 1-2 секунд. Какие методы следует использовать для быстрого извлечения?Javamail performance

вот мой код:

try { 
     IMAPStore store = null; 
     if(store!=null&&store.isConnected())return; 
     Properties props = System.getProperties(); 
     Session sessionIMAP = Session.getInstance(props, null); 
     try { 
      store = (IMAPStore) sessionIMAP.getStore("imaps"); 
      store.connect("imap.gmail.com",993,"[email protected]","password"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     IMAPFolder folder = (IMAPFolder) store.getFolder("INBOX"); 
     folder.open(Folder.READ_ONLY); 
     System.out.println("start"); 
     Message[] msgs = folder.getMessages(1,10); 
     long ftime = System.currentTimeMillis(); 
     FetchProfile fp=new FetchProfile(); 
     fp.add(FetchProfile.Item.ENVELOPE); 
     folder.fetch(msgs, fp); 
     long time = System.currentTimeMillis(); 
     System.out.println("fetch: "+(time-ftime)); 
     for (Message message : msgs) { 
      System.out.println(message.getSubject()); 
      Address[] from = message.getFrom(); 
      for (Address address : from) { 
       System.out.println(address); 
      } 
      Address[] recipients = message.getAllRecipients(); 
      for (Address address : recipients) { 
       System.out.println(address); 
      } 

     } 
     long newTime = System.currentTimeMillis(); 
     System.out.println("convert: "+(newTime-time)); 
    }catch (Exception e) { 
     e.printStackTrace(); 
    } 


} 

ответ

1

Я не уверен, если это вопрос JavaMail, насколько это может быть проблемой Gmail. У меня есть приложение, которое извлекает почту из нескольких источников, включая Gmail, и Gmail, безусловно, является самым медленным. Javamail api довольно прост, но было бы трудно сделать предложения, не видя, что вы сейчас делаете.

4

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

1

Я сталкиваюсь с тем же. После профилирования я заметил, что getBody вызывается каждый раз, когда я пытаюсь выполнить message.getFrom(), как вы, хотя я только обращался к полям, которые должны быть покрыты флагом Envelope. См. https://java.net/projects/javamail/forums/forum/topics/107956-gimap-efficiency-when-only-reading-headers