2017-03-29 13 views
0

Gmailのアカウントから、特定のフォルダ内の特定の件名を持つ最近の未読メールを取得したいと考えています。私は以下のようにJavaMail APIを使用していますが、結果は0です。しかし、subjectTermだけを使用すると、結果が表示されます。どこに間違っているのか教えてください。ありがとうございました。JavaMail - 複数の検索用語の問題

コードを簡単に貼り付けるためにメッセージ配列をループするのではなく、メッセージ[0]を使用しました。

 public void openMailBox(String hostname, String username, String password, String folderName, String subject) throws MessagingException, GeneralSecurityException, IOException{ 
     props = System.getProperties(); 
     props.setProperty("mail.store.protocol", "imaps"); 
     props.setProperty("mail.imaps.host", "imap.gmail.com"); 
     props.setProperty("mail.imaps.port", "993"); 
     props.setProperty("mail.imaps.ssl.enable", "true"); 
     props.put("mail.imaps.ssl.socketFactory", new MailSSLSocketFactory()); 
     session = Session.getInstance(props); 
     store = session.getStore(); 
     store.connect(username, password); 
     folder = store.getFolder(folderName); 
     folder.open(Folder.READ_ONLY); 
     messages = folder.search(getSearchTerm(subject)); 
     if (messages[0].isMimeType("multipart/*")){ 
      Multipart multipart = (Multipart) messages[0].getContent(); 
      for(int i=0;i<multipart.getCount();i++) { 
       BodyPart bodyPart = multipart.getBodyPart(0); 
       if (bodyPart.isMimeType("text/*")) { 
        msg = msg+bodyPart.getContent().toString(); 
       } 
      } 
     }else{ 
      msg = messages[0].getContent().toString(); 
     } 
     System.out.println(msg); 
     folder.close(true); 
     store.close(); 
    } 

    public SearchTerm getSearchTerm(String subject){ 
     subjectTerm = new SubjectTerm(subject); 
     unseenFlagTerm = new FlagTerm(new Flags(Flags.Flag.SEEN), false); 
     recentFlagTerm; = new FlagTerm(new Flags(Flags.Flag.RECENT), true); 
     return new AndTerm(subjectTerm, new AndTerm(unseenFlagTerm, recentFlagTerm));  
    } 
} 

答えて

1

どのメールサーバーを使用していますか?

一部のメールサーバーでは、RECENTフラグが有効な方法で実装されていないため、メッセージに「RECENT」と表示されないことがあります。 RECENT用語を省略して、より多くの結果が得られるかどうかを確認してください。

それでも問題が解決しない場合は、すべてのメッセージのフラグをダンプするコードを追加し、すべてのメッセージのフラグと検索要求および応答を示すJavaMail debug outputを投稿してください。

一部のIMAPサーバーはSEARCHコマンドを完全には正しく実装していないため、実行している検索の種類を処理できません。

最後に、MailSSLSocketFactoryを上のサンプルコードで示したよりも興味深い方法で使用しない限り、socketFactoryプロパティを設定する必要はありません。

+0

imap.gmail.comはメールサーバーです。 RECENTフラグを削除した後、正常に動作します。どうもありがとうございます。 – newuser

関連する問題