2009-05-15 65 views
7

Tôi đang viết/học cách tìm nạp email bằng java từ thư mục IMAP bằng gói javax.mail. Tôi đã có thể truy xuất thành công các thư n cuối cùng trong một Thư mục, tuy nhiên tôi đang tìm cách xây dựng một ví dụ để truy xuất thư từ một ngày cụ thể. Bất kỳ ví dụ nào?java imap tìm nạp thư kể từ ngày

+0

liên quan: http://stackoverflow.com/questions/6963256/javamail-search-by-receiveddate-doesnt-work-down-to- thứ hai – kevinarpe

Trả lời

22

Bạn cũng có thể sử dụng các lớp SearchTerm trong gói thư java.

SearchTerm olderThan = new ReceivedDateTerm(ComparisonTerm.LT, someFutureDate); 
SearchTerm newerThan = new ReceivedDateTerm(ComparisonTerm.GT, somePastDate); 
SearchTerm andTerm = new AndTerm(olderThan, newerThan); 
inbox.search(andTerm); 

Một số kết hợp ở trên phải chứng minh là cách tốt hơn để có được ngày trong một phạm vi nhất định.

+1

Tôi đang cố gắng sử dụng receiveDateTerm nhưng có vẻ như nó không trả lại cho tôi kết quả chính xác. Tôi chỉ muốn lấy tất cả các thư nhận được trong 1 phút cuối cùng hoặc tất cả các thư nhận được từ thời gian thử nghiệm của tôi bắt đầu. Nó không hoạt động như mong đợi .. đây là những gì tôi đang làm. 'SearchTerm st = new AndTerm (new SubjectTerm (subjectSearchPhrase), new BodyTerm (bodySearchPhrases)); st = new AndTerm (st, new ReceivedDateTerm (CompareTerm.GE, searchMailReceivedDateGE)); 'Tôi cũng đã thử sử dụng' YoungerTerm (80) 'và điều này cũng không hoạt động. ai biết được vấn đề? cảm ơn! – OverrockSTAR

+0

Một điều cần lưu ý: IMAP chỉ có thể tìm kiếm theo thời gian, không phải thời gian, vì vậy nếu bạn muốn nhận tất cả thư mới kể từ lần cập nhật cuối cùng, họ sẽ cần đặt thời gian của ngày so sánh của họ trở lại nửa đêm và kiểm tra thêm trùng lặp trên máy khách. – Tobl

0

Đây là những gì tôi nghĩ ra. Điều này làm việc cho tôi, nhưng có lẽ không phải là cách tốt nhất để đi về nó. Bất kỳ đề xuất để cải thiện điều này?

 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

Chắc chắn không phải là một cách tiếp cận tốt vì nó tìm nạp các email đầu tiên mà không lọc chúng với khả năng IMAP. Tôi tin rằng sự gia tăng gấp mười lần không làm cho nó đẹp hơn nhiều (tưởng tượng 10k email trong hộp) – Konstantin

2

Thay vì tìm nạp tất cả thư bạn nên thử tận dụng tìm kiếm phía máy chủ. Tính năng này hoạt động bằng cách sử dụng phương thức tìm kiếm của javax.mail.Folder. Bạn có thể sẽ phải viết SearchTerm của riêng bạn dựa trên một tiêu chí trên Message.getReceivedDate().

Nếu tìm kiếm phía máy chủ không hoạt động, bạn có thể thử sử dụng hồ sơ tìm nạp, tức là thay vì inbox.getMessages() sử dụng inbox.fetch (Message [] msgs, FetchProfile fp). javadoc cho tìm nạp nói: Khách hàng sử dụng phương pháp này để cho biết rằng các mục được chỉ định là cần thiết cho toàn bộ dải tin nhắn đã cho. Việc triển khai dự kiến ​​sẽ truy xuất các mục này cho phạm vi tin nhắn đã cho một cách hiệu quả. Lưu ý rằng phương pháp này chỉ là một gợi ý cho việc triển khai để tìm nạp trước các mục mong muốn.

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

Tất cả các mail trong tháng vừa qua:

Calendar cal = Calendar.getInstance(); 
    cal.roll(Calendar.MONTH, false); 
    Message[] search = folder.search(new ReceivedDateTerm(ComparisonTerm.GT, cal.getTime())); 
Các vấn đề liên quan