2011-01-25 4 views
33

JavaMail API를 사용하여 개인 계정에 연결하고 있습니다. 내 Gmail 계정에받은 편지함, 임시 보관함 등의 기본 폴더 + 폴더 목록 (라벨)이 있습니다. 사용 가능한 모든 폴더 (기본값 및 사용자 생성)를 나열하려면 어떻게해야합니까?JavaMail을 사용하여 메일 계정에서 사용 가능한 폴더 목록을 얻는 방법

이 API를 사용하여 특정 폴더에 액세스 할 수 있습니다 : Folder inbox = store.getFolder("Inbox");. 메일 계정에 사용할 수있는 폴더 목록을 가져 오는 다른 API가 있습니까?

+0

왜 당신이 찾고 있던 결과를주지 않은 대답을 수락 했습니까? – dkarp

답변

26

다음은 작동하는 코드입니다. 이렇게하면 모든 레이블을 처리 할 수 ​​있습니다. folder으로 이동하려면 folder.list()을 수행하거나 store.getDefaultFolder().list("*")을 사용하여 다른 답변에서 제안 된대로 모든 폴더 및 하위 폴더를 검색 할 수 있습니다.

Properties props = System.getProperties(); 
props.setProperty("mail.store.protocol", "imaps"); 
Session session = Session.getDefaultInstance(props, null); 
Store store = session.getStore("imaps"); 
store.connect("imap.gmail.com", "[email protected]", "[email protected]"); 
System.out.println(store); 

Folder[] f = store.getDefaultFolder().list(); 
for(Folder fd:f) 
    System.out.println(">> "+fd.getName()); 

출력 :

> > INBOX
> > 개인
> > 영수증
> > 여행
> > 일
> >을 [Gmail]


OLD 답변

이 바로이 무엇을해야 dkarp

에 의해 this answer에서 지적이야,이 올바르지 않습니다주의 사항 :

http://java.sun.com/products/javamail/javadocs/javax/mail/Store.html#getSharedNamespaces%28%29

http://java.sun.com/products/javamail/javadocs/javax/mail/Store.html#getUserNamespaces%28java.lang.String%29

+0

'Folder [] folders = store.getPersonalNamespaces();'이 코드를 시도했을 때 folders.length는 항상 1입니다. 그러나 내 Gmail 계정에 8 개의 폴더가 있습니다 .. 마찬가지로'Folder [] folders = store.getSharedNamespaces(); '길이는 항상 0입니다. – Jagadesh

+0

이 답변은 간단합니다. 이 코드는 JavaMail이 인증 된 사용자의 폴더, 다른 사용자의 폴더, 다른 사용자의 폴더에 대한 접두사 검색을 돕는 [NAMESPACE 명령] (http://tools.ietf.org/html/rfc2342#section-5) 및 공유 폴더. 그러나 확실히 폴더 목록을 작성하지는 않습니다. – dkarp

+1

포함 된 코드가 나열한 결과를 제공하지 않습니다. 'list()'에 명시 적으로''* ''가 필요합니다. 그렇지 않으면''INBOX'와 선택 불가능한'[Gmail]'만 반환합니다. – dkarp

0

방법에 대한 store.getDefaultFolder().list()를? 그래도.

+0

이 명령은 Gmail에서 작동하지만 yahoo에서는 작동하지 않습니다. 예를 들어 –

53

세르게이가 가깝지만 기본적으로 JavaMail의 list()LIST "" %이며 최상위 수준의 폴더 만 제공합니다. Gmail은 선택 폴더 인 [Gmail] 아래에 시스템 폴더 (모든 메일, 임시 보관함, 보낸 편지함, 스팸 함, 별표 편지함 및 휴지통)를 저장하므로 실제로는 LIST "" *해야합니다. 그렇지 않으면 , [Gmail] 및 라벨을 다시 가져올 수 있습니다. 여기

은 Gmail로 연결하는 몇 가지 예제 코드의 폴더 목록을 가져옵니다, 그리고 ( [Gmail]처럼, 단지 계층 자리하지 않은 즉, 사람) 각 비 \NoSelect 폴더의 이름과 메시지 수를 출력한다 :

Properties props = System.getProperties(); 
props.setProperty("mail.store.protocol", "imaps"); 
try { 
    Session session = Session.getDefaultInstance(props, null); 
    javax.mail.Store store = session.getStore("imaps"); 
    store.connect("imap.gmail.com", "<username>@gmail.com", "<password>"); 
    javax.mail.Folder[] folders = store.getDefaultFolder().list("*"); 
    for (javax.mail.Folder folder : folders) { 
     if ((folder.getType() & javax.mail.Folder.HOLDS_MESSAGES) != 0) { 
      System.out.println(folder.getFullName() + ": " + folder.getMessageCount()); 
     } 
    } 
} catch (MessagingException e) { 
    e.printStackTrace(); 
} 
+0

+1 예, 맞습니다. 나를 고쳐 주셔서 고마워요. – Nishant

7

당신이

store.getFolder("[Gmail]/Sent Mail"); 
store.getFolder("[Gmail]/Drafts"); 

등과 같은 다른 폴더에 액세스 할 수 있습니다

+0

정말 도움을 공유해 주셔서 감사합니다. – user606669