2012-04-24 34 views
6

Tôi muốn nhận danh sách những người đã từng được đưa vào bất kỳ thư nào trong hộp thư đến của tôi. Ngay bây giờ tôi có thể sử dụng API javax mail cho kết nối thông qua IMAP và tải các thông điệp:Đọc nhanh hơn hộp thư đến trong Java

Folder folder = imapSslStore.getFolder("[Gmail]/All Mail"); 
folder.open(Folder.READ_ONLY); 
Message[] messages = folder.getMessages(); 

for(int i = 0; i < messages.length; i++) { 
    // This causes the message to be lazily loaded and is slow 
    String[] from = messages[i].getFrom(); 
} 

Các thông điệp dòng [i] .getFrom() là chậm hơn so với tôi muốn vì là gây ra thông báo để được lười biếng nạp vào. Tôi có thể làm gì để tăng tốc độ này không? Ví dụ. có loại tải hàng loạt nào mà tôi có thể thực hiện thay vì tải các tin nhắn từng cái một không? Điều này có tải toàn bộ thông điệp và có điều gì tôi có thể làm để chỉ tải các trường đến/từ/cc hoặc tiêu đề thay thế không? POP có nhanh hơn IMAP không?

Trả lời

5

Bạn có thể sử dụng fetch -method trong Thư mục. Theo Javadocs:

Khách hàng sử dụng phương pháp này để chỉ ra rằng các mục được chỉ định là cần thiết cho một loạt thông báo đã cho. Triển khai được dự kiến ​​sẽ truy xuất các mục này cho dải tin nhắn nhất định theo cách hiệu quả . Lưu ý rằng phương pháp này chỉ là một gợi ý cho việc triển khai để tìm nạp trước các mục mong muốn.

Để tìm nạp TỪ FetchProfile phù hợp là ENVELOPE. Tất nhiên nó vẫn còn để thực hiện và máy chủ mail nào thực sự giúp đỡ.

6

Bạn muốn thêm những điều sau đây trước khi vòng lặp for

FetchProfile fetchProfile = new FetchProfile(); 
fetchProfile.add(FetchProfile.Item.ENVELOPE); 
folder.fetch(messages, fetchProfile); 

này sẽ prefetch "phong bì" cho tất cả các tin nhắn, trong đó bao gồm các từ/đến các lĩnh vực/chủ đề/cc.

Các vấn đề liên quan