pop3协议收取邮件inbox.getMessages()是一次性读取所有邮件,如果邮箱邮件过多的话,会非常耗时。
还有一个方法是Folder.getMessages(int start, int end),这里的start和end是闭区间。
在redis中存储已收邮件的uid,收件时先给收件邮箱加锁,然后取出已收的uid,倒序取出邮件。
代码如下:
List<String> uidList=JedisUtil.lrange("mail_"+mailAddress, 0, -1);
int count= inbox.getMessageCount();
String[] uidArr=new String[]{};
List<ReceivedEmail> msgList=new ArrayList<ReceivedEmail>();
for(int i=0;i<count;i++){
//倒序取出邮件
Message[] messages=inbox.getMessages(count-i, count-i);
if(!inbox.isOpen()){
inbox.open(Folder.READ_ONLY);
}
Message msg= messages[0];
MimeMessage mimeMessage = (MimeMessage) msg;
String uid = inbox.getUID(mimeMessage);
if(!uidList.contains(uid)){
try {
ReceivedEmail remail = session.message2Email(msg);
msgList.add(remail);
} catch (MessagingException|IOException e) {
log.error(mailAddress+"邮件解析异常!");
e.printStackTrace();
}
}else{
break;
}
}
代码中用的ReceivedEmail是jodd中的,jodd是项目开始就引进来的,虽然bug不少,只能修修补补接着用了。