Java Mail IMAP需要花费大量时间才能在邮箱中获取消息,25秒才能获取20条消息

Java Mail IMAP需要花费大量时间才能在邮箱中获取消息,25秒才能获取20条消息,java,jakarta-mail,imap,Java,Jakarta Mail,Imap,有没有一种方法可以提高从Javamail IMAP服务器获取消息的性能? 我找到了一些提示,但无法提高性能。 这个方法将从一个文件夹中获取大约20条消息,并将格式化的消息返回到DTO。我尝试对行进行注释以获取附件,并获取收件人,但它不会改变任何性能 /** * Get all the emails that are inside the param folder * * @param folderId folder to return the emails from the infor

有没有一种方法可以提高从Javamail IMAP服务器获取消息的性能? 我找到了一些提示,但无法提高性能。 这个方法将从一个文件夹中获取大约20条消息,并将格式化的消息返回到DTO。我尝试对行进行注释以获取附件,并获取收件人,但它不会改变任何性能

/**
 * Get all the emails that are inside the param folder
 *
 * @param folderId   folder to return the emails from the informed folder.
 * @param pageToken  pageToken to be used as pagination
 * @param maxResults maxResults to create a limit to the number of registers
 * @return {@link EmailsDTO} with all the messages
 */
public EmailsDTO getMessages(final String folderId, final String pageToken, final Integer maxResults) {
    final Properties properties = getServerInputProperties();
    final Session session = Session.getDefaultInstance(properties);
    try {
        final EmailsDTO emailsDTO = new EmailsDTO();
        final List<EmailDTO> emailDTOList = new ArrayList<>();

        // connects to the message store
        final Store store = session.getStore(IMAP);
        store.connect(email, password);

        // opens the folder to search the messages
        final Folder folder = store.getFolder(folderId);
        folder.open(Folder.READ_ONLY);

        //set a pagination used to get the results in JavaMail
        final int pageStart = nonNull(pageToken) ? Integer.valueOf(pageToken) : 1;
        final int pageEnd = (pageStart + maxResults) > folder.getMessageCount() ? folder.getMessageCount() : pageStart + maxResults;


        // fetches new messages from server, starts with 1
        final Message[] messages = folder.getMessages(pageStart, pageEnd);

        final FetchProfile fetchProfile  = new FetchProfile();
        fetchProfile.add(FetchProfile.Item.ENVELOPE);
        folder.fetch(messages, fetchProfile); // Load the profile of the messages in 1 fetch.

        for (final Message msg : messages) {
            final EmailDTO emailDTO = new EmailDTO();
            emailDTO.setId(msg.getHeader(MESSAGE_ID)[0]);
            emailDTO.setCc(this.parseAddresses(msg.getRecipients(Message.RecipientType.CC)));
            emailDTO.setTo(this.parseAddresses(msg.getRecipients(Message.RecipientType.TO)));
            emailDTO.setBcc(this.parseAddresses(msg.getRecipients(Message.RecipientType.BCC)));

            emailDTO.setFrom(this.getFrom(msg.getFrom()));
            emailDTO.setRead(msg.getFlags().contains(Flags.Flag.SEEN));
            emailDTO.setHasAttachments(this.hasAttachments(msg));
            emailDTO.setSubject(msg.getSubject());
            emailDTO.setMessage(this.getMessageContent(msg));

            emailDTO.setAttachments(this.getAttachements(msg));
            emailDTO.setDate(msg.getReceivedDate().toString());
            emailDTO.setParentFolder(msg.getFolder().getName());
            //TODO: see what need to put here emailDTO.setLabels();
            emailDTOList.add(emailDTO);
        }

        // disconnect
        folder.close(false);
        store.close();

        emailsDTO.setEstimatedNumberOfMessages(folder.getMessageCount());
        emailsDTO.setNextPageToken(String.valueOf(emailDTOList.size()));
        emailsDTO.setMessages(emailDTOList);
        return emailsDTO;
    } catch (final MessagingException | IOException e) {
        throw new RuntimeException(String.format("couldn't get messages from the folder with id: %s", folderId), e);
    }
}
/**
*获取param文件夹中的所有电子邮件
*
*@param folderId文件夹返回通知文件夹中的电子邮件。
*@param pageToken pageToken用作分页
*@param maxResults maxResults创建对寄存器数量的限制
*@return{@link EmailsDTO}和所有邮件
*/
public EmailsTo getMessages(最终字符串folderId、最终字符串pageToken、最终整数maxResults){
最终属性=getServerInputProperties();
最终会话=Session.getDefaultInstance(属性);
试一试{
final EmailsTo EmailsTo=新的EmailsTo();
最终列表emailDTOList=新的ArrayList();
//连接到消息存储
最终存储=session.getStore(IMAP);
存储连接(电子邮件、密码);
//打开文件夹以搜索邮件
最终文件夹=store.getFolder(folderId);
文件夹。打开(文件夹。只读);
//设置用于在JavaMail中获取结果的分页
final int pageStart=nonNull(pageToken)?整数。valueOf(pageToken):1;
final int pageEnd=(pageStart+maxResults)>folder.getMessageCount()?folder.getMessageCount():pageStart+maxResults;
//从服务器获取新邮件,从1开始
最终消息[]消息=文件夹.getMessages(pageStart,pageEnd);
final FetchProfile FetchProfile=新的FetchProfile();
添加(fetchProfile.Item.信封);
folder.fetch(messages,fetchProfile);//在1 fetch中加载消息的配置文件。
用于(最终消息消息消息:消息){
最终EmailDTO EmailDTO=新的EmailDTO();
emailDTO.setId(msg.getHeader(MESSAGE_ID)[0]);
emailDTO.setCc(this.parseAddresses(msg.getRecipients(Message.RecipientType.CC));
emailDTO.setTo(this.parseAddresses(msg.getRecipients(Message.RecipientType.TO));
emailDTO.setBcc(this.parseAddresses(msg.getRecipients(Message.RecipientType.BCC));
emailDTO.setFrom(this.getFrom(msg.getFrom());
setRead(msg.getFlags().contains(Flags.Flag.SEEN));
emailDTO.sethasaattachments(this.hasaattachments(msg));
emailDTO.setSubject(msg.getSubject());
emailDTO.setMessage(this.getMessageContent(msg));
emailDTO.setAttachments(this.getAttachments(msg));
emailDTO.setDate(msg.getReceivedDate().toString());
emailDTO.setParentFolder(msg.getFolder().getName());
//TODO:查看需要在此处放置的内容emailDTO.setLabels();
emailDTOList.add(emailDTO);
}
//断开
文件夹。关闭(false);
store.close();
emailsDTO.setEstimatedNumberOfMessages(folder.getMessageCount());
emailsDTO.setNextPageToken(String.valueOf(emailDTOList.size());
emailsDTO.setMessages(emailDTOList);
返回电子邮件至;
}捕获(最终消息异常| IOE异常){
抛出新的RuntimeException(String.format(“无法从id为%s的文件夹中获取消息”,folderId),e);
}
}

store.getFolder()
folder.open()
的调用可能非常慢,通常与文件夹中的邮件数量成正比。尽量保留打开的文件夹对象,以便您下次可以重用它并分摊获取它的成本。我尝试保持它的打开状态,性能只发生了一点变化,大约两秒钟,但感谢您的评论:)在这种情况下,您需要找出需要花费的时间,因为每条消息一秒钟是非常不寻常的。请查看,并找到一种方法将时间戳与每行输出关联起来。这将帮助您确定时间的去向。您使用的是IMAP还是POP3?您是否正在应用程序服务器中运行?尝试将
getDefaultInstance
更改为
getInstance
。如果调试输出仍然太慢,请发布调试输出。我正在使用IMAP并在应用程序服务器中运行,我使用javamail调试更改了一些行,但是将getDefaultInstance更改为getInstance可以大大提高性能,感谢大家的帮助!