如何使用 JavaMail 获取邮件帐户中可用文件夹的列表

Posted

技术标签:

【中文标题】如何使用 JavaMail 获取邮件帐户中可用文件夹的列表【英文标题】:How to get the list of available folders in a mail account using JavaMail 【发布时间】:2011-06-15 00:28:32 【问题描述】:

我正在使用 JavaMail API 连接到我的个人帐户。我在我创建的 Gmail 帐户中有文件夹(标签)列表 + 收件箱、草稿等默认文件夹。如何列出所有可用文件夹(默认文件夹和用户创建的文件夹)?

我可以使用此 API 访问特定文件夹:Folder inbox = store.getFolder("Inbox");。是否有任何其他 API 可以获取邮件帐户中可用的文件夹列表?

【问题讨论】:

你到底为什么接受一个没有给你想要的结果的答案? 【参考方案1】:

Sergey 很接近,但默认情况下,JavaMail 的list() 执行LIST "" %,它只为您提供***文件夹。 GMail 将其系统文件夹(所有邮件、草稿、已发送邮件、垃圾邮件、已加星标和已删除邮件)放在不可选择的文件夹 [Gmail] 下,因此您确实需要改为 LIST "" *。否则,您只会取回 INBOX[Gmail] 和您的标签。

这里有一些示例代码连接到 GMail,获取文件夹列表,并打印出每个非\NoSelect 文件夹的名称和消息计数(即不仅仅是层次占位符的那些,例如 [Gmail]) :

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", "<username>@gmail.com", "<password>");
    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(folder.getFullName() + ": " + folder.getMessageCount());
        
    
 catch (MessagingException e) 
    e.printStackTrace();

【讨论】:

【参考方案2】:

这是有效的代码。这将使您能够处理所有标签。要深入了解folder,您可以执行folder.list(),或者您可以使用store.getDefaultFolder().list("*") 来检索其他答案中建议的所有文件夹和子文件夹。

Properties props = System.getProperties();
props.setProperty("mail.store.protocol", "imaps");
Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore("imaps");
store.connect("imap.gmail.com", "YOURMAILID@gmail.com", "UR_P@ZZWRD");
System.out.println(store);

Folder[] f = store.getDefaultFolder().list();
for(Folder fd:f)
    System.out.println(">> "+fd.getName());

输出:

>>收件箱 >> 个人 >> 收据 >> 旅游 >> 工作 >> [邮箱]


老答案

请注意这是不正确的,dkarp 正确指出了 this answer

应该这样做:

http://java.sun.com/products/javamail/javadocs/javax/mail/Store.html#getSharedNamespaces%28%29

http://java.sun.com/products/javamail/javadocs/javax/mail/Store.html#getUserNamespaces%28java.lang.String%29

【讨论】:

Folder[] folders= store.getPersonalNamespaces(); 当我尝试此代码时,folders.length 始终为 1。但我的 gmail 帐户中有 8 个文件夹。同样,如果我尝试使用 Folder[] folders= store.getSharedNamespaces();,长度始终为零。 这个答案是完全错误的。此代码导致 JavaMail 发出 the NAMESPACE command,这有助于发现已验证用户的文件夹、其他用户的文件夹和共享文件夹的前缀。但它肯定不会列出文件夹。 您包含的代码没有给出您列出的输出。您需要在list() 中显式的"*",否则它将只返回INBOX 和不可选择的[Gmail] @dkarp 很奇怪,我看到了带有代码的输出。我刚刚运行了该代码并粘贴了输出,但我没有使用任何“”。如果我不使用“”,我会得到我的所有标签,我刚刚创建了一个新标签,我可以看到它没有 () 出现。这:>>费用>>收件箱>>个人>>收据>>旅行>>工作>>[Gmail]。但是,使用“”,我可以看到所有标签 + 草稿、已发送、所有邮件。 不显示“收件箱”的子文件夹。我有包含“mail1”、“mail2”的收件箱我已经使用你的代码来获取文件夹列表,但它只显示收件箱而不是它的子文件夹。【参考方案3】:

你可以像这样访问其他文件夹

store.getFolder("[Gmail]/Sent Mail");
store.getFolder("[Gmail]/Drafts");

等等

【讨论】:

【参考方案4】:

store.getDefaultFolder().list() 怎么样?不过,只是猜测。

【讨论】:

【参考方案5】:

你可以试试这个:

Folder[] folderList = store.getDefaultFolder().list("*");

【讨论】:

以上是关于如何使用 JavaMail 获取邮件帐户中可用文件夹的列表的主要内容,如果未能解决你的问题,请参考以下文章

在Outlook的已发送文件夹中找不到使用javamail发送的邮件

在 JavaMail 中获取 html 电子邮件内容

javamail: UrlDataSource获取网络文件作为邮件的附件|javamail发送二进制流附件的问题

JavaMail学习笔记帐号激活与忘记密码 实例(zhuan)

使用 JavaMail 阅读电子邮件内容时出现编码问题

将JavaMail与TLS结合使用