我想从我的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));
}
}
答案 0 :(得分:1)
您使用的是哪种邮件服务器?
某些邮件服务器没有以任何有用的方式实现RECENT标志,因此邮件可能不会标记为RECENT。尝试省略最近的术语,看看你是否得到更多结果。
如果这没有帮助,请添加代码以转储所有消息的标志,然后发布显示所有消息标志的JavaMail debug output以及搜索请求和响应。
另请注意,某些IMAP服务器未完全或正确实现SEARCH命令,因此无法处理您正在进行的搜索。
最后,请注意,您不需要设置socketFactory属性,除非您以比上面示例代码中显示的更有趣的方式使用MailSSLSocketFactory。