通过在 imaps 和 pop3s 协议上使用 JavaMail API 从电子邮件服务器中删除数千甚至数百万封邮件时,我遇到了性能问题。我找到了一种相对快速地批量获取邮件的方法,但是当我想删除获取的邮件时它变得非常慢,例如,大约 2000 封邮件在 5 小时内被标记为已删除(我在不到一分钟的时间内获取了 10.000 封邮件)。
我可以使用某种批量标记的消息吗?我的意思是在本地将消息标记为已删除,然后批量更新/发送所有标题?
通过在 imaps 和 pop3s 协议上使用 JavaMail API 从电子邮件服务器中删除数千甚至数百万封邮件时,我遇到了性能问题。我找到了一种相对快速地批量获取邮件的方法,但是当我想删除获取的邮件时它变得非常慢,例如,大约 2000 封邮件在 5 小时内被标记为已删除(我在不到一分钟的时间内获取了 10.000 封邮件)。
我可以使用某种批量标记的消息吗?我的意思是在本地将消息标记为已删除,然后批量更新/发送所有标题?
你如何准确地标记它们?如果您为每条消息发送一个 STORE 命令,那么它会很昂贵。理想情况下使用一组 UID 序列(例如 1:4,6,8,10:12,15)。但是不要让它变得太长,例如,一旦序列集超过 100 个字符,就发送一个新的 STORE 命令。
(序列集的长度是任意的,你可以试验,但不建议去到服务器可能无法处理的长度。)
谢谢你拯救了我的一天,让我用我所做的来完成答案,也许有人会觉得它有用。
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 循环内递增。