使用javamail API(fetch()或getMessages()获取邮件的最佳方式是什么?

使用javamail API(fetch()或getMessages()获取邮件的最佳方式是什么?,java,jakarta-mail,Java,Jakarta Mail,我想知道从一个邮箱(例如:收件箱、发件箱)获取邮件的最佳方式(从服务器快速加载邮件)是什么。我找到了folder feth()方法和getMessages()方法,但我不明白这两种方法之间有什么更好的地方 我当前的代码使用getMessages()方法,但速度仍然很慢: public static void fetch(String Host, String storeType, String user, String password) { try { // create p

我想知道从一个邮箱(例如:收件箱、发件箱)获取邮件的最佳方式(从服务器快速加载邮件)是什么。我找到了folder 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();
  }
publicstaticvoidfetch(字符串主机、字符串存储类型、字符串用户、,
字符串(密码){
试一试{
//创建属性字段
属性=新属性();
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”);
会话emailSession=Session.getDefaultInstance(属性);
//emailSession.setDebug(true);
//创建IMAP存储对象并连接IMAP服务器
Store Store=emailSession.getStore(“imaps”);
store.connect(主机、用户、密码);
//创建文件夹对象并将其打开
文件夹emailFolder=store.getFolder(“收件箱”);
emailFolder.open(文件夹只读);
BufferedReader reader=新的BufferedReader(新的InputStreamReader(
系统(in),;
//从数组中的文件夹中检索邮件并打印
Message[]messages=emailFolder.getMessages();
System.out.println(“messages.length----”+messages.length);
for(int i=0;i
}


有人能告诉我什么是正确的和更好的方法吗

获取方法用于批量预取消息数据。通常,它用于获取和缓存消息元数据、头等。如果您只需要检查少量消息元数据以确定是否处理消息,则此功能非常有用

您还可以使用fetch方法来获取和缓存消息的全部内容。除非您正在访问每个消息的所有内容,否则您不希望使用fetch方法获取整个消息。当以这种方式使用时,它的行为更像POP3协议,只是它一次获取多条消息。显然,缓存整个消息会占用大量内存

getMessages方法根本不获取任何消息数据。它所做的只是给你一个“句柄”,通过它你可以访问消息数据,这些数据将根据需要获取。如果调用getSubject方法,它将获取主题(它是“信封”元数据的一部分)。您可能希望使用fetch方法预取和缓存此信封数据,以提高后续操作的效率。当您决定需要读取邮件的正文或附件时,将在该点提取该数据


可能fetch方法应该命名为prefetchAndCache.:-)

获取方法用于批量预取消息数据。通常,它用于获取和缓存消息元数据、头等。如果您只需要检查少量消息元数据以确定是否处理消息,则此功能非常有用

您还可以使用fetch方法来获取和缓存消息的全部内容。除非您正在访问每个消息的所有内容,否则您不希望使用fetch方法获取整个消息。当以这种方式使用时,它的行为更像POP3协议,只是它一次获取多条消息。显然,缓存整个消息会占用大量内存

getMessages方法根本不获取任何消息数据。它所做的只是给你一个“句柄”,通过它你可以访问消息数据,这些数据将根据需要获取。如果调用getSubject方法,它将获取主题(它是“信封”元数据的一部分)。您可能希望使用fetch方法预取和缓存此信封数据,以提高后续操作的效率。当您决定需要读取邮件的正文或附件时,将在该点提取该数据


可能fetch方法应该命名为prefetchAndCache.:-)

感谢@Bill Shannon的解释,现在我了解了fetch和getMessages方法的功能。根据您的解释,使用POP3协议比使用IMAP协议更好地使用fetch方法,否则我错了?使用POP3最好的唯一时间是,如果您想下载所有电子邮件,从服务器上删除它,并尽快关闭连接。对于几乎所有的事情,如果可以的话,请使用IMAP。谢谢@Bill Shannon对我的解释,现在我了解了fetch和getMessages方法的功能。根据您的解释,使用POP3协议比使用IMAP协议更好地使用fetch方法,否则我错了?使用POP3最好的唯一时间是,如果您想下载所有电子邮件,从服务器上删除它,并尽快关闭连接。对于几乎所有其他内容,如果可以,请使用IMAP。