2011-01-25 13 views
33

Tôi đang sử dụng API JavaMail để kết nối với tài khoản cá nhân của mình. Tôi có danh sách các thư mục (nhãn) trong tài khoản Gmail mà tôi đã tạo + các thư mục mặc định như Hộp thư đến, Thư nháp, v.v. Làm cách nào để liệt kê tất cả các thư mục có sẵn (mặc định và người dùng đã tạo)?Cách lấy danh sách các thư mục có sẵn trong tài khoản thư bằng cách sử dụng JavaMail

Tôi có thể truy cập thư mục cụ thể bằng API này: Folder inbox = store.getFolder("Inbox");. Có API nào khác để lấy danh sách các thư mục có sẵn trong tài khoản thư không?

+0

Tại sao bạn chấp nhận câu trả lời không cung cấp cho bạn kết quả mà bạn đang tìm kiếm? – dkarp

Trả lời

26

Đây là mã hoạt động. Điều này sẽ giúp bạn xử lý tất cả các Nhãn. Để đi sâu hơn trong một số folder, bạn có thể thực hiện folder.list() hoặc bạn có thể sử dụng store.getDefaultFolder().list("*") để truy xuất tất cả thư mục và thư mục con như được đề xuất trong câu trả lời khác.

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

Output:

> > INBOX
> > cá nhân
> > biên nhận
> > Travel
> > làm việc
> > [Gmail]


OLD ĐÁP

Xin lưu ý đây là không đúng, nó đúng chỉ trong this answer bởi dkarp

Những nên làm:

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

'Thư mục [] thư mục = store.getPersonalNamespaces();' khi tôi thử mã này các thư mục.length luôn là 1. Nhưng tôi có 8 thư mục trong tài khoản gmail của mình .. Tương tự như vậy nếu tôi đã thử với thư mục 'Thư mục [] = store.getSharedNamespaces(); 'độ dài luôn bằng 0. – Jagadesh

+0

Câu trả lời này chỉ đơn giản là sai. Mã này làm cho JavaMail phát hành [lệnh 'NAMESPACE'] (http://tools.ietf.org/html/rfc2342#section-5), hỗ trợ phát hiện các tiền tố cho các thư mục của người dùng đã được xác thực, các thư mục của người dùng khác, và các thư mục được chia sẻ. Nhưng nó chắc chắn không làm một danh sách thư mục. – dkarp

+1

Mã bạn đã đưa vào không cung cấp cho kết quả bạn đã liệt kê. Bạn cần rõ ràng '" * "' trong 'list()', nếu không nó sẽ chỉ trả về 'INBOX' và không thể chọn' [Gmail] '. – dkarp

0

Làm thế nào về store.getDefaultFolder().list()? Chỉ cần một đoán, mặc dù.

+0

Lệnh này hoạt động cho Gmail, nhưng không phải cho yahoo ví dụ –

53

Sergey đã đóng, nhưng theo mặc định, list() của JavaMail thực hiện LIST "" %, chỉ cung cấp cho bạn các thư mục cấp cao nhất. Gmail đặt các thư mục hệ thống của nó (Tất cả thư, thư nháp, thư đã gửi, thư rác, gắn dấu sao và thùng rác) trong thư mục không thể chọn [Gmail], vì vậy bạn thực sự cần phải thay đổi LIST "" *. Nếu không, bạn sẽ chỉ nhận lại , [Gmail] và nhãn của bạn.

Dưới đây là một số mẫu mã kết nối với GMail, lấy về danh sách thư mục, và in ra tên và thông điệp đếm cho mỗi thư mục \NoSelect phi (tức là những người mà không phải là placeholders chỉ hệ thống phân cấp, giống như [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 vâng, bạn nói đúng. Cảm ơn vì đã sửa tôi. – Nishant

7

Bạn có thể truy cập vào các thư mục khác như thế này

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

, vv

+0

cảm ơn vì đã chia sẻ thực sự đã giúp – user606669