2014-01-29 31 views
5

我正在构建一个需要访问邮件特定文件夹的工具(例如'[Gmail] /垃圾邮件','[Gmail] /发送')。看起来这些名称已根据用户本地化设置进行了本地化,因此,例如,[Gmail] /“垃圾”显示为“[Gmail]/Papelera”。IMAP List extension JAVA

我阅读了有关XLIST命令的内容,但现在不推荐使用IMAP LIST扩展(https://developers.google.com/gmail/imap_extensions#special-use_extension_of_the_list_command)。

我试图这样做javax.mail.Folder.list(“\ Trash”)但没有返回。

如何在JAVA中使用IMAP列表扩展名?

PS:使用多个电子邮件提供商,而不仅仅是Gmail。

+0

有可能的是,Java不支持或分析的扩展字段。你能以某种方式手动发出命令吗?或者分叉javamail源来添加你需要的支持? – Max

回答

0

这应有助于:

Properties props = System.getProperties(); 
    props.setProperty("mail.store.protocol", "imaps"); 
    try { 
     Session session = Session.getDefaultInstance(props, null); 
     javax.mail.Store store = session.getStore("imaps"); 
     store.connect("imap.gmail.com", "[email protected]", "mypassword"); 
     javax.mail.Folder[] folders = store.getDefaultFolder().list("*"); 
     for (javax.mail.Folder folder : folders) { 
      if ((folder.getType() & javax.mail.Folder.HOLDS_MESSAGES) != 0) { 
       System.out.println("foldername->"+folder.getFullName() + " folder msg count->" + folder.getMessageCount()); 
      } 
     } 
    } catch (MessagingException e) { 
     e.printStackTrace(); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
+1

谢谢,但这是为了探索文件夹,它不是垃圾回收独立语言识别的解决方案。 – Ydrojen

+0

不知道我是否理解你。你是什​​么意思的垃圾独立语言。 – aryann

+0

在“旧代码”中,我按照用户的要求重复了查找垃圾的工作,但现在我已根据用户的语言设置对多语言支持和gmail垃圾桶的名称进行了更改,因为可以以不同的方式调用查找垃圾。 – Ydrojen

0

你说你试过这样:

javax.mail.Folder.list("\Trash") 

尝试没有斜杠:

javax.mail.Folder.list("Trash") 

看看怎么回事。现在假设文件夹实际上被称为“垃圾箱”。如果它以某种其他语言本地化,那么您可能需要列出所有文件夹(“*”),逐个遍历它们,并找到为您提供\ Trash属性的文件夹。我对JavaMail并不是很熟悉,所以我不知道它是否会/如何让您恢复文件夹属性。

0

也许你可以检查(一旦你有一个文件夹的文件夹),如果

if ((folder.getType() & Folder.HOLDS_MESSAGES) != 0) { 

,然后检查该文件夹中的邮件有此标志:

Flags.Flag.DELETED 

如果是这样,那将意味着这个是垃圾?我不记得如果一个消息被删除,它会被移动到垃圾箱,或者它可以保留在文件夹中......如果它被移动,那可能会造成诡计。

+0

废纸篓文件夹中的消息通常不会标记为\已删除。在他们被清除之前,这只是一个过渡性的标志。 – Max

4

如Bill Shannon said,您可以使用Gmail属性获取special folders,如垃圾箱。但这只适用于Gmail。

javax.mail.Folder[] folders = store.getDefaultFolder().list("*"); 

如果打印这一点,它应该看起来像下面按Gmail

a004 LIST "" "*" 
* LIST (\HasNoChildren) "/" "INBOX" 
* LIST (\Noselect \HasChildren) "/" "[Gmail]" 
* LIST (\HasNoChildren \All) "/" "[Gmail]/All Mail" 
* LIST (\HasNoChildren \Drafts) "/" "[Gmail]/Drafts" 
* LIST (\HasNoChildren \Important) "/" "[Gmail]/Important" 
* LIST (\HasNoChildren \Sent) "/" "[Gmail]/Sent Mail" 
* LIST (\HasNoChildren \Junk) "/" "[Gmail]/Spam" 
* LIST (\HasNoChildren \Flagged) "/" "[Gmail]/Starred" 
* LIST (\HasNoChildren \Trash) "/" "[Gmail]/Trash" 
a004 OK Success 

一旦你有你的文件夹,你可以重复你所寻找的属性。对于[Gmail]/All Mail,mailFolder = "\\All"。同样,对于[Gmail]/Trash这将是mailFolder = "\\Trash"

private static IMAPFolder getLocalisedFolder(IMAPStore store, String mailFolder) throws MessagingException { 
Folder[] folders = store.getDefaultFolder().list("*"); 
for (Folder folder : folders) { 
    IMAPFolder imapFolder = (IMAPFolder) folder; 
    for (String attribute : imapFolder.getAttributes()) { 
    if (mailFolder.equals(attribute)) { 
     return imapFolder; 
    } 
    } 
} 
return null; 
}