2013-07-10 1 views
0

게으른 다운로드 이메일입니다. 기본적으로 문제는 내 이메일이 무겁다는 것입니다. 따라서 주제와 메시지 ID 만 다운로드하고 필요한 경우에만 나머지 이메일을 다운로드합니다. 이 필요한 경우, LazyEmail에서ID로 이메일을 다운로드하는 방법?

public void downloadInBackground(EmailAccount emailAccount, String folderName) { 
    List<Email> emails = new ArrayList<Email>(); 
    Message[] message = null; 

    Properties props = System.getProperties(); 
    props.setProperty("mail.store.protocol", "imaps"); 
    Session session = Session.getDefaultInstance(props, null); 

    Store store = null; 
    Folder folder = null; 
    try { 
     Log.getInstance().d("xxx", "starting dowanloading"); 
     store = session.getStore("imaps"); 
     store.connect(emailAccount.getImapServer(), emailAccount.getUsername(), 
       emailAccount.getPassword()); 

     folder = store.getFolder(folderName); 
     folder.open(Folder.READ_ONLY); 

     message = folder.getMessages(); 
     FetchProfile fp = new FetchProfile(); 
     fp.add(FetchProfile.Item.ENVELOPE); 
     fp.add("Subject"); fp.add("From"); fp.add("To"); fp.add("Cc"); fp.add("Bcc"); fp.add("ReplyTo"); fp.add("Date"); 
     folder.fetch(message, fp); 

     for (int i = 0; i < message.length; i++) { 
      Message m = message[i]; 

      String emailId = null; 

      m.getHeader("Message-Id"); 
      Enumeration<Header> headers = m.getAllHeaders(); 
      while (headers.hasMoreElements()) { 
       Header h = headers.nextElement(); 
       String mID = h.getName(); 
       if (StringUtils.containsIgnoreCase(mID, "Message-ID")) { 
        emailId = h.getValue(); 
       } 
      } 

      if (emailId != null) { 
       Email newMail = new LazyEmail(m, emailAccount, folderName, emailId); 
       emails.add(newMail); 
      } 
     } 
    } catch (MessagingException e) { 
     ... 
    } finally { 
     if (folder != null) { 
       folder.close(false); 
     } 
     if (store != null) { 
       store.close(); 
     } 
    } 

    update(emails); 
} 

다음 :

첫 번째 단계는 제목과 메시지-ID를 다운로드하는 것입니다. 이메일 나머지를 다운로드 중입니다.

public void updateContentText() { 
    Properties props = System.getProperties(); 
    props.setProperty("mail.store.protocol", "imaps"); 
    Session session = Session.getDefaultInstance(props, null); 

    Store store = null; 
    Folder folder = null; 
    try { 
     store = session.getStore("imaps"); 
     store.connect(mEmailAccount.getImapServer(), mEmailAccount.getUsername(), 
       mEmailAccount.getPassword()); 

     folder = store.getFolder(mFolderName); 
     folder.open(Folder.READ_ONLY); 

     // finding email 
     SearchTerm searchTerm = new MessageIDTerm(mEmailId); 
     Message[] messages = folder.search(searchTerm); 
     assert messages.length == 1; 

     // setting context text 
     Part mail = messages[0]; 
     if (mail.getContent() instanceof Multipart) { 
      setContentText((Multipart) mail.getContent()); 
     } else { 
      setContentText((String) mail.getContent()); 
     } 

     updateState = UpdateState.CONTENT_TEXT_DOWNLOADED; 
    } catch (IOException e) { 
     ... 
    } finally { 
     if (folder != null) { 
       folder.close(false); 
     } 
     if (store != null) { 
       store.close(); 
     } 
    } 
} 

코드는 괜찮아 보입니다. 하지만 Android 애플리케이션을 실행할 때 Message [] messages = folder.search (searchTerm);

javax.mail.MessagingException: A4 BAD Execute(): Error in command received; 

답변

0

어떤 서버를 사용하고 있습니까? JavaMail protocol trace은 무엇을 보여줍니까?

봉투 이외에 모든 헤더를 가져 오는 것은 꽤 낭비입니다. 원시 헤더에 직접 액세스하지 않는 한 JavaMail은 봉투에서 모든 정보를 가져옵니다.

마지막으로, "mail.store.protocol"속성을 설정할 필요가 없습니다. 그리고 these common JavaMail mistakes을 참조하십시오.

관련 문제