我想知道从一个邮箱(例如:INBOX,OUTBOX)获取邮件的最佳方式(从服务器快速加载邮件)是什么。我找到了文件夹feth()方法和getMessages()方法,但我不明白这两种方法之间哪个更好。
我当前的代码使用getMessages()方法,但它仍然很慢:
public static void fetch(String Host, String storeType, String user,
String password) {
try {
// create properties field
Properties properties = new Properties();
properties.put("mail.store.protocol", "imaps");
properties.put("mail.imaps.host", Host);
properties.put("mail.imaps.port", "993");
properties.put("mail.imaps.starttls.enable", "true");
Session emailSession = Session.getDefaultInstance(properties);
// emailSession.setDebug(true);
// create the IMAP store object and connect with the imap server
Store store = emailSession.getStore("imaps");
store.connect(Host, user, password);
// create the folder object and open it
Folder emailFolder = store.getFolder("INBOX");
emailFolder.open(Folder.READ_ONLY);
BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));
// retrieve the messages from the folder in an array and print it
Message[] messages = emailFolder.getMessages();
System.out.println("messages.length---" + messages.length);
for (int i = 0; i < messages.length; i++) {
Message message = messages[i];
System.out.println("---------------------------------");
writePart(message);
String line = reader.readLine();
if ("YES".equals(line)) {
message.writeTo(System.out);
} else if ("QUIT".equals(line)) {
break;
}
}
// close the store and folder objects
emailFolder.close(false);
store.close();
} catch (NoSuchProviderException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
有人可以向我解释什么是正确的,更好的方式!
答案 0 :(得分:3)
fetch方法用于批量预取消息数据。通常它用于获取和缓存消息元数据,标题等。如果您只需要检查少量消息元数据以确定是否处理消息,这将非常有用。
您还可以使用fetch方法来获取和缓存邮件的整个内容。除非您访问每条消息的所有内容,否则您不希望使用fetch方法获取整个消息。当以这种方式使用时,它的行为更像POP3协议,除了它一次获取多个消息。显然,缓存整个消息可能会占用大量内存。
getMessages方法根本不提取任何消息数据。它所做的只是为您提供一个“句柄”,您可以通过该句柄访问消息数据,这些数据将根据需要提取。如果调用getSubject方法,它将获取Subject(它是“envelope”元数据的一部分)。您可能希望使用fetch方法预取和缓存此包络数据,以使后续操作更有效。当您决定需要阅读邮件的正文或附件时,将在此时获取该数据。
也许fetch方法应该被命名为prefetchAndCache。 : - )