JavaMail - 多个和搜索词的问题
JavaMail - Issue with Multiple And Search Terms
我想从我的 gmail 帐户的特定文件夹中获取最近未读的具有特定主题的电子邮件。我正在使用 JavaMail API 如下,但结果为 returns 0。但是,如果我只单独使用 subjectTerm,我会看到结果。请让我知道我哪里出错了。谢谢。
请注意,为了代码简单,我在下面使用了 messages[0] 而不是遍历 messages 数组以将其粘贴到此处。
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));
}
}
您使用的是什么邮件服务器?
一些邮件服务器没有以任何有用的方式实现 RECENT 标志,因此邮件可能不会被标记为 RECENT。尝试省略最近的字词,看看是否能得到更多结果。
如果这没有帮助,请添加代码以转储所有消息的标志,然后 post JavaMail debug output 显示所有消息的标志以及搜索请求和响应。
另请注意,某些 IMAP 服务器没有完全或正确地执行 SEARCH 命令,因此无法处理您正在进行的搜索。
最后,请注意您不需要设置 socketFactory 属性 除非您以比上面示例代码中显示的更有趣的方式使用 MailSSLSocketFactory。
我想从我的 gmail 帐户的特定文件夹中获取最近未读的具有特定主题的电子邮件。我正在使用 JavaMail API 如下,但结果为 returns 0。但是,如果我只单独使用 subjectTerm,我会看到结果。请让我知道我哪里出错了。谢谢。
请注意,为了代码简单,我在下面使用了 messages[0] 而不是遍历 messages 数组以将其粘贴到此处。
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));
}
}
您使用的是什么邮件服务器?
一些邮件服务器没有以任何有用的方式实现 RECENT 标志,因此邮件可能不会被标记为 RECENT。尝试省略最近的字词,看看是否能得到更多结果。
如果这没有帮助,请添加代码以转储所有消息的标志,然后 post JavaMail debug output 显示所有消息的标志以及搜索请求和响应。
另请注意,某些 IMAP 服务器没有完全或正确地执行 SEARCH 命令,因此无法处理您正在进行的搜索。
最后,请注意您不需要设置 socketFactory 属性 除非您以比上面示例代码中显示的更有趣的方式使用 MailSSLSocketFactory。