2009-05-15 21 views
7

javax.mail packageを使用しているIMAPフォルダからjavaを使用して電子メールを取得するよう書いています。私は正常にフォルダ内の最後のn個のメッセージを取得することができましたが、指定された日付以降にメッセージを取得するための例を構築しようとしています。どんな例?java imapは日付以降のメッセージを取得します

+0

関連:http://stackoverflow.com/questions/6963256/javamail-search-by-receiveddate-doesnt-work-down-to-第二に – kevinarpe

答えて

22

また、JavaメールパッケージのSearchTermクラスを使用することもできます。

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

上記のいくつかの組み合わせは、特定の範囲内で日付を取得するより良い方法であることがわかります。

+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)を使用すると、フェッチプロファイルを使用できます。 fetchのためのjavadocのメッセージ:クライアントはこのメソッドを使用して、指定された項目が指定されたメッセージ範囲に対してen-masseする必要があることを示します。実装は、指定されたメッセージ範囲に対してこれらの項目を効率的に検索することが期待されます。このメソッドは、目的の項目をプリフェッチするための実装のヒントに過ぎないことに注意してください。

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())); 
関連する問題