最近在写一个收件功能,由于收件箱里面的邮件太多导致收件时间比较长,2000封左右耗时30分钟左右,后来采用了javaMail 提供的筛选类 SearchTerm ,但是发现,这个类也是需要先把收件箱所有的邮件拿到之后再进行筛选的,期望大佬有新的解决方案,邮箱协议采用的时pop3
由于代码拷贝不出来,就简单写一下
// 连接会话......
// 获得收件箱 只能获取一个月内的邮件
Folder folder = store.getFolder("INBOX");
// 如果要读写的话可以选择READ_WRITE
folder.open(Folder.READ_ONLY);
// 筛选收件箱中指定时间段的邮件并将文件保存到本地
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date start = sdf.parse("2021-08-10");
Date end = sdf.parse("2021-08-11");
SearchTerm comparisonTermGe = new SentDateTerm(ComparisonTerm.GE, start);
SearchTerm comparisonTermLe = new SentDateTerm(ComparisonTerm.LE, end);
SearchTerm st = new AndTerm(comparisonTermGe, comparisonTermLe);
Message[] messages = folder.search(st);
//Message[] messages = folder.getMessages();
//以下为获取邮件后的业务处理
Map<String, List<String>> excelFilePaths = parseFileMessage(messages);
1、从源头解决,,去邮箱里面把一些 邮件给屏蔽了,,广告、无用的通知等,一下子少个一千多吧?
2、多线程拉邮件,,一个线程拉比较慢的话,100个呢?对于这种IO型任务,搞个 100个线程跑应该没问题;
Future & Callback接口 了解下,还有更多;
3、增加你 客户端的带宽;
FYI
纯代码层面的话,考虑多线程,拉取实际邮件分成一个个任务去拉取