2009-05-15 5 views
7

javax.mail 패키지를 사용하는 IMAP 폴더에서 java를 사용하여 이메일을 가져 오는 것을 배우고 있습니다. 폴더의 마지막 n 개의 메시지를 성공적으로 검색 할 수 있었지만 지정된 날짜 이후에 메시지를 검색하는 예제를 만들려고합니다. 어떤예요?java imap은 날짜 이후로 메일을 가져옵니다.

+0

관련 : http://stackoverflow.com/questions/6963256/javamail-search-by-receiveddate-doesnt-work-down-to- 두 번째 – kevinarpe

답변

22

Java 메일 패키지의 SearchTerm 클래스를 사용할 수도 있습니다.

위의 일부 조합은 특정 범위 내에서 날짜를 얻는 더 좋은 방법임을 입증해야합니다. 지난 달에

+1

receivedDateTerm을 사용하려고하는데 정확한 결과를 돌려주지 않는 것 같다. 필자는 지난 1 분 동안받은 모든 메일을 검색하거나 테스트가 시작된 시점부터받은 모든 메일을 검색하려고합니다. 그것은 예상대로 작동하지 않습니다. 이것은 내가하고있는 일입니다. 'SearchTerm st = new AndTerm (새 SubjectTerm (subjectSearchPhrase), 새 BodyTerm (bodySearchPhrases));st = new AndTerm (st, new ReceivedDateTerm (ComparisonTerm.GE, searchMailReceivedDateGE));'또한 YoungerTerm (80)을 사용해 보았는데 이것도 작동하지 않습니다. 어느 누구도 문제를 알고 있습니까? 감사! – OverrockSTAR

+0

주목할 점 : IMAP은 시간 만 아닌 상태로만 검색 할 수 있으므로 마지막 업데이트 이후에 새로운 메일을 모두 가져 오려면 비교 날짜를 자정으로 설정하고 추가 확인을해야합니다 클라이언트에서 중복. – Tobl

0

다음은 내가 생각해 낸 것입니다. 이것은 나를 위해 작동하지만 아마 그것에 대해 갈 수있는 가장 좋은 방법은 아닙니다. 이것을 개선하기위한 제안이 있습니까?

 Date from; //assume initialized 
     Store store; //assume initialized 
     Folder inbox = store.getFolder("INBOX"); 
     inbox.open(Folder.READ_ONLY); 
     int end = inbox.getMessageCount(); 
     long lFrom = from.getTime(); 
     Date rDate; 
     long lrDate; 
     int start = end; 
     do { 
     start = start - 10; 
     Message testMsg = inbox.getMessage(start); 
     rDate = testMsg.getReceivedDate(); 
     lrDate = rDate.getTime(); 
     } while (lrDate > lFrom); 
     Message msg[] = inbox.getMessages(start, end); 
     for (int i=0, n=msg.length; i<n; i++) { 
     lrDate = msg[i].getReceivedDate().getTime(); 
     if (lrDate > lFrom) { 
      System.out.println(i + ": " 
      + msg[i].getFrom()[0] 
      + "\t" + msg[i].getSubject()); 
     } 
     } 
+2

IMAP 기능을 사용하여 전자 메일을 필터링하지 않고 먼저 전자 메일을 가져 오는 좋은 방법은 아닙니다. 나는 10 배 증가가 그것을 훨씬 좋게하지 않는다고 믿는다. (상자에 10k 개의 이메일을 상상해 보라.) – Konstantin

2

모든 메시지를 가져 오는 대신 서버 측 검색을 활용 해보십시오. 검색 메서드를 사용하여이 작동합니다. javax.mail.Folder. 아마도 Message.getReceivedDate()에 대한 기준에 따라 자체 SearchTerm을 작성해야합니다.

서버 측 검색이 작동하지 않으면 가져 오기 프로필을 사용해 볼 수 있습니다. 즉, inbox.getMessages() 대신 inbox.fetch (Message [] msgs, FetchProfile fp)를 사용합니다. 가져 오기 용 javadoc의 메시지 : 클라이언트는이 메소드를 사용하여 지정된 항목이 주어진 메시지 범위에 대해 한꺼번에 필요하다는 것을 표시합니다. 구현은 주어진 메시지 범위에 대해 이러한 항목을 효율적으로 검색 할 것으로 예상됩니다. 이 메소드는 원하는 항목을 프리 페치 (prefetch)하기위한 구현에 대한 힌트 일뿐입니다.

5
public class CheckDate { 
    public void myCheckDate(Date givenDate) { 
     SearchTerm st = new ReceivedDateTerm(ComparisonTerm.EQ,givenDate); 

     Message[] messages = inbox.search(st); 
    } 

    // in main method 

    public static void main(String[] args) throws ParseException{ 
     SimpleDateFormat df1 = new SimpleDateFormat("MM/dd/yy"); 
     String dt="06/23/10"; 
     java.util.Date dDate = df1.parse(dt); 
     cd.myCheckDate(dDate); 
    } 
} 
0

모든 메일 :

Calendar cal = Calendar.getInstance(); 
    cal.roll(Calendar.MONTH, false); 
    Message[] search = folder.search(new ReceivedDateTerm(ComparisonTerm.GT, cal.getTime())); 
관련 문제