0

通过在 imaps 和 pop3s 协议上使用 JavaMail API 从电子邮件服务器中删除数千甚至数百万封邮件时,我遇到了性能问题。我找到了一种相对快速地批量获取邮件的方法,但是当我想删除获取的邮件时它变得非常慢,例如,大约 2000 封邮件在 5 小时内被标记为已删除(我在不到一分钟的时间内获取了 10.000 封邮件)。

我可以使用某种批量标记的消息吗?我的意思是在本地将消息标记为已删除,然后批量更新/发送所有标题?

4

2 回答 2

1

你如何准确地标记它们?如果您为每条消息发送一个 STORE 命令,那么它会很昂贵。理想情况下使用一组 UID 序列(例如 1:4,6,8,10:12,15)。但是不要让它变得太长,例如,一旦序列集超过 100 个字符,就发送一个新的 STORE 命令。

(序列集的长度是任意的,你可以试验,但不建议去到服务器可能无法处理的长度。)

于 2013-09-08T21:05:23.507 回答
0

谢谢你拯救了我的一天,让我用我所做的来完成答案,也许有人会觉得它有用。 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 循环内递增。

于 2013-09-11T23:37:33.037 回答