JavaMail - 多个和搜索词的问题

时间:2017-03-29 20:02:05

标签: java javamail

我想从我的Gmail帐户中获取特定主题中特定主题的最近未读电子邮件。我正在使用JavaMail API,但它返回0结果。但是,如果我只使用subjectTerm,我会看到结果。请告诉我哪里出错了。谢谢。

请注意,我使用下面的消息[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 个答案:

答案 0 :(得分:1)

您使用的是哪种邮件服务器?

某些邮件服务器没有以任何有用的方式实现RECENT标志,因此邮件可能不会标记为RECENT。尝试省略最近的术语,看看你是否得到更多结果。

如果这没有帮助,请添加代码以转储所有消息的标志,然后发布显示所有消息标志的JavaMail debug output以及搜索请求和响应。

另请注意,某些IMAP服务器未完全或正确实现SEARCH命令,因此无法处理您正在进行的搜索。

最后,请注意,您不需要设置socketFactory属性,除非您以比上面示例代码中显示的更有趣的方式使用MailSSLSocketFactory。