我遇到了一个性能问题,即在imaps和pop3s协议上使用JavaMail API从电子邮件服务器中删除数千封,有时甚至数百封邮件。我发现了一种以批量方式相对快速地获取邮件的方法,但是当我想要删除所提取的邮件时,它变得非常慢,例如,大约2000封邮件在5小时内被标记删除(我在不到一分钟内收到了10.000封邮件)。
我可以使用某种批量标记的邮件吗?我的意思是在本地将邮件标记为已删除,然后更新/发送批量中的所有邮件头?
答案 0 :(得分:1)
你是如何准确地标记它们的?如果您为每条消息发送一个STORE命令,那么它将会很昂贵。理想情况下使用一组UID(例如1:4,6,8,10:12,15)。不要让它变得太长,例如序列集超过100个字符后,发送新的STORE命令。
(序列集的长度是任意的,您可以尝试,但不建议使用服务器可能无法处理的长度。)
答案 1 :(得分:0)
Thanx Gigi你救了我的一天,
让我用我所做的完成答案,也许有人会觉得它很有用。
在我的案例中,STORE <<startScope>>:<<endScope>> +FLAGS (\Delete)
是真正的解决方案。我现在正在使用这样的东西:
private Object storeDeletion(IMAPProtocol protocol, int startID, int endID)
throws ProtocolException{
String args = Integer.toString(startID) + ":"
+ Integer.toString(endID)
+ " +FLAGS" + " (\\Deleted)";
Response[] r = protocol.command("STORE " + args, null);
int notDeleted = 0;
for (Response res : r) {
// do something here with each response, but avoid last one (summary response)
}
// dispatch remaining untagged responses
protocol.notifyResponseHandlers(r);
protocol.handleResult(r[r.length-1]);
return "" + (r.length - notDeleted - 1);
}
如果您不想查看所有回复,可以使用+FLAGS.SILENT
代替+FLAGS
。对于因某些原因无法标记为已删除的所有有问题的邮件,notDeleted在for循环内递增。