JavaMail-包含多个搜索词的问题

JavaMail-包含多个搜索词的问题,java,jakarta-mail,Java,Jakarta Mail,我想从我的gmail帐户中获取最近的、未读的、在特定文件夹中有特定主题的电子邮件。我正在使用JavaMail API,如下所示,但它返回0个结果。然而,如果我只使用subjectTerm,我会看到结果。请告诉我哪里出了问题。多谢各位 请注意,为了简化代码,我使用了下面的消息[0],而不是在消息数组中循环,将其粘贴到这里 public void openMailBox(String hostname, String username, String password, String fo

我想从我的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));    
     } 
}
public void openMailBox(字符串主机名、字符串用户名、字符串密码、字符串文件夹名、字符串主题)抛出MessaginException、GeneralSecurityException、IOException{
props=System.getProperties();
props.setProperty(“mail.store.protocol”、“imaps”);
setProperty(“mail.imaps.host”、“imap.gmail.com”);
props.setProperty(“mail.imaps.port”、“993”);
setProperty(“mail.imaps.ssl.enable”、“true”);
put(“mail.imaps.ssl.socketFactory”,new-mailssocketfactory());
session=session.getInstance(道具);
store=session.getStore();
store.connect(用户名、密码);
folder=store.getFolder(folderName);
文件夹。打开(文件夹。只读);
messages=folder.search(getSearchTerm(主题));
if(消息[0].isMimeType(“multipart/*”)){
多部分多部分=(多部分)消息[0]。getContent();

对于(inti=0;i您使用的是什么邮件服务器

某些邮件服务器没有以任何有用的方式实现“最近”标志,因此邮件可能没有标记为“最近”。请尝试省去“最近”一词,然后查看是否获得更多结果

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

还要注意的是,一些IMAP服务器没有完全或正确地实现SEARCH命令,因此无法处理您正在进行的搜索


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

imap.gmail.com是邮件服务器。在我删除最近的标记后,它工作正常。非常感谢。