Java Mail IMAP需要花费大量时间才能在邮箱中获取消息,25秒才能获取20条消息
有没有一种方法可以提高从Javamail IMAP服务器获取消息的性能? 我找到了一些提示,但无法提高性能。 这个方法将从一个文件夹中获取大约20条消息,并将格式化的消息返回到DTO。我尝试对行进行注释以获取附件,并获取收件人,但它不会改变任何性能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
/**
* 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可以大大提高性能,感谢大家的帮助!