2013-09-07 5 views
0

imaps 및 pop3s 프로토콜에서 JavaMail API를 사용하여 이메일 서버의 메일을 수천 또는 수 백 만개의 메일을 삭제하는 데 성능 문제가 있습니다. 메일을 비교적 빠르게 가져올 수있는 방법을 발견했습니다. 그러나 가져온 메일을 제거하려면 매우 느려집니다. 약 2000 개의 메일이 5 시간 만에 삭제 된 것으로 표시되었습니다 (1 분 이내에 10.000 개의 메일을 가져옵니다).한 번에 여러 메일 삭제

메시지의 일종의 벌크 마크를 사용할 수 있습니까? 메시지를 로컬에서 삭제 된 것으로 표시 한 다음 대량의 모든 헤더를 업데이트/보냈습니다.

답변

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 루프 내에서 증가됩니다.

+0

예, 정확히 시퀀스 집합이 의미하는 바입니다. 도움이되어 기쁘다. :) – Gigi

1

어떻게 정확하게 표시하고 있습니까? 메시지 당 STORE 명령을 보내면 비용이 많이 듭니다. 이상적으로는 UID의 시퀀스 집합을 사용하십시오 (예 : 1 : 4,6,8,10 : 12,15). 너무 길게하지 마세요. 시퀀스 세트가 100자를 초과하면 새 STORE 명령을 보냅니다.

(설정 순서의 길이는 임의이며 실험 할 수 있지만,이 서버가 처리하지 못할 수도 길이로 이동하지 않는 것이 좋습니다.)

+1

바로, Folder.setFlags 메서드를 사용하여 여러 메시지에 대한 플래그를 한 번에 설정할 수 있습니다. –

+0

메시지 배열에서 플래그 DELETE를 true로 설정하고 있지만 폴더가 READ_WRITE 모드이므로 서버에 플래그를 설정하는 데 약간의 시간이 걸립니다. – Sasa