一次删除多封邮件

时间:2013-09-07 11:04:38

标签: java performance javamail imap pop3

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

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

2 个答案:

答案 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循环内递增。