2011-01-25 16 views
33

kullanarak bir posta hesabındaki kullanılabilir klasörlerin listesini alma Kişisel hesabıma bağlanmak için JavaMail API kullanıyorum. Gmail hesabımda, Gelen Kutusu, Taslaklar vb. Gibi varsayılan klasörleri oluşturduğum klasörlerin (etiketler) bir listesi var. Tüm kullanılabilir klasörleri nasıl listeleyebilirim (varsayılan ve kullanıcı oluşturulan)?JavaMail

Bu API'yi kullanarak belirli bir klasöre erişebilirim: Folder inbox = store.getFolder("Inbox");. Bir posta hesabında bulunan klasörlerin listesini almak için başka bir API var mı?

+0

Neden yeryüzünde aradığınız sonuçları vermeyen bir cevabı kabul ettiniz? – dkarp

cevap

26

İşte işleyen kod. Bu, tüm Etiketleri ele verir. folder'da daha derine inmek için, folder.list() gerçekleştirebilir veya diğer yanıtta önerildiği gibi tüm klasörleri ve alt klasörleri almak için store.getDefaultFolder().list("*")'u kullanabilirsiniz.

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

Çıktı:

> > POSTALAR
> > Kişisel
> > Makbuzlar
> > Seyahat
> > Çalışma
> > [Gmail]


ESKİ CEVAP

müstakim Bunlar yapmalıyım dkarp

tarafından this answer yılında doğrultuyor, bu doğru değil unutmayın:

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();' bu kodu denediğimde folders.length her zaman 1'dir. Fakat gmail hesabımda 8 klasör var .. Benzer şekilde 'Folder [] folders = ile denediysem store.getSharedNamespaces(); 'uzunluk her zaman sıfırdır. – Jagadesh

+0

Bu cevap sadece yanlıştır. Bu kod, JavaMail'in [NAMESPACE ”komutunu (http://tools.ietf.org/html/rfc2342#section-5) yayınlamasına neden olur; bu, kimliği doğrulanmış kullanıcının klasörleri, diğer kullanıcıların klasörleri için öneklerin bulunmasına yardımcı olur. ve paylaşılan klasörler. Ama kesinlikle bir klasör listesi yapmıyor. – dkarp

+1

Girdiğiniz kod, listelediğiniz çıktıyı vermiyor. "List"() 'de açık olan "*" 'ye ihtiyacınız var, aksi takdirde yalnızca" INBOX "ve seçilemez olmayan [Gmail]' i döndürecektir. – dkarp

0

ne dersiniz store.getDefaultFolder().list()? Yine de bir tahmin.

+0

Bu komut Gmail için çalışıyor, ancak yahoo için değil, örneğin –

53

Sergey yakındadır, ancak varsayılan olarak JavaMail'in list()'u yalnızca üst düzey klasörler sağlayan bir LIST "" % yapar. GMail, sistem klasörlerini (Tüm Postalar, Taslaklar, Gönderilmiş Postalar, Spam, Yıldızlı ve Çöp Kutusu), seçilemeyen klasör olan [Gmail]'un altına koyar, bunun yerine gerçekten LIST "" * yapmalısınız. Aksi takdirde, , [Gmail] ve etiketlerinize geri dönersiniz. İşte

, GMail bağlanan bazı örnek kod klasör listesini getirir ve ( [Gmail] gibi, sadece hiyerarşi yer tutucular değildir yani olanlar) her olmayan \NoSelect klasör için ad ve ileti sayısını yazdırır:

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 evet, haklısınız. Beni düzelttiğin için teşekkürler. – Nishant

7

Bu

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

vb gibi diğer klasörlere erişebilir

+0

gerçekten paylaşım için teşekkürler – user606669

İlgili konular