2011-01-25 10 views
33

Używam JavaMail API do łączenia się z moim osobistym kontem. Mam listę folderów (etykiet) na moim koncie Gmail, które utworzyłem + domyślne foldery, takie jak Skrzynka odbiorcza, Wersje robocze itp. Jak mogę wyświetlić wszystkie dostępne foldery (domyślne i utworzone przez użytkownika)?Jak uzyskać listę dostępnych folderów na koncie pocztowym za pomocą JavaMail

Mogę uzyskać dostęp do określonego folderu przy użyciu tego interfejsu API: Folder inbox = store.getFolder("Inbox");. Czy istnieje inny interfejs API, aby uzyskać listę folderów dostępnych na koncie pocztowym?

+0

Dlaczego, na litość boską, zaakceptowałeś odpowiedź, która nie przyniosła rezultatów, których szukałeś? – dkarp

Odpowiedz

26

Oto kod, który działa. Umożliwi to obsługę wszystkich etykiet. Aby przejść głębiej w folder, można wykonać folder.list() lub można użyć store.getDefaultFolder().list("*"), aby pobrać wszystkie foldery i podfoldery zgodnie z sugestią w drugiej odpowiedzi.

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()); 

wyjściowa:

> > SKRZYNKA
> > Prywatne
> > Wpływy
> > Travel
> > Pracuj
> > [Gmail]


OLD ODPOWIEDŹ

Pamiętaj, to nie jest poprawna, to słusznie wskazał w this answer przez dkarp

Powinny zrobić:

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();' gdy próbowałem tego kodu foldery.length jest zawsze 1. Ale mam 8 folderów na moim koncie Gmail .. Podobnie, jeśli próbowałem z 'Folder [] folders = store.getSharedNamespaces(); 'długość jest zawsze równa zero. – Jagadesh

+0

Ta odpowiedź jest po prostu błędna. Ten kod powoduje, że JavaMail wydaje polecenie [NAMESPACE'] (http://tools.ietf.org/html/rfc2342#section-5), które pomaga w odnajdywaniu prefiksów dla folderów uwierzytelnionych użytkowników, folderów innych użytkowników, i udostępnione foldery. Ale na pewno nie robi listy folderów. – dkarp

+1

Dołączony kod nie podaje danych wyjściowych wymienionych na liście. Potrzebujesz '' * "' w 'list()', w przeciwnym razie zwróci on tylko 'INBOX' i niewybierane' [Gmail] '. – dkarp

0

Jak o store.getDefaultFolder().list()? Tylko zgadnij.

+0

To polecenie działa dla Gmaila, ale nie dla Yahoo, na przykład –

53

Siergiej jest blisko, ale domyślnie JavaMail's list() ma LIST "" %, który daje tylko foldery najwyższego poziomu. GMail umieszcza swoje foldery systemowe (cała poczta, kopie robocze, wysłane wiadomości, spam, oznaczono gwiazdką i kosz) pod niezmiennym folderem [Gmail], więc naprawdę musisz zrobić LIST "" * zamiast tego. W przeciwnym razie odzyskasz tylko , [Gmail] i swoje etykiety.

Oto niektóre przykładowy kod, który łączy się z GMail, pobiera listę folderów, a drukuje się nazwę i wiadomość licznik dla każdego nie- \NoSelect folderu (czyli te, które nie są tylko hierarchia zastępcze, jak [Gmail]):

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 tak, masz rację. Dzięki za poprawienie mnie. – Nishant

7

można uzyskać dostęp do innych folderów tak

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

etc.

+0

dzięki za dzielenie naprawdę pomogło – user606669

Powiązane problemy