0

imaps および pop3s プロトコルで JavaMail API を使用して電子メール サーバーから数千、場合によっては数百万のメールを消去する際にパフォーマンスの問題があります。メールを比較的迅速に大量に取得する方法を見つけましたが、取得したメールを削除しようとすると、非常に遅くなります。たとえば、5 時間で約 2000 件のメールが削除済みとしてマークされました (1 分未満で 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 に答える