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

47

我正在使用JavaMail API连接到我的个人账号。 我在我的Gmail账户中创建了一些文件夹(标签)列表,以及像收件箱、草稿等默认文件夹。如何列出所有可用的文件夹(包括默认和用户创建的)?

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


1
你到底为什么接受一个没有给你想要的结果的答案? - dkarp
6个回答

71

Sergey在接近正确,但默认情况下JavaMail的list()方法执行的是LIST "" %操作,只显示最高级别的文件夹。Gmail将其系统文件夹(All Mail、Drafts、Sent Mail、Spam、Starred和Trash)放置在不可选择的文件夹[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();
}

48

以下是可用的代码。这将为您提供所有标签的句柄。要更深入地进入文件夹,您可以执行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());

输出:

>> 收件箱
>> 个人
>> 收据
>> 旅行
>> 工作
>> [Gmail]


旧回答

请注意,这是不正确的,在这个答案中由dkarp指出。

这些应该可以做到:

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();,长度总是为零。 - Jagadesh
这个答案是完全错误的。这段代码会导致JavaMail发出NAMESPACE命令,以帮助发现经过身份验证的用户文件夹、其他用户文件夹和共享文件夹的前缀,但它肯定不会列出文件夹。 - dkarp
2
你所包含的代码并没有给出你列出的输出。你需要在list()中加上明确的 "*",否则它只会返回INBOX和不可选择的[Gmail] - dkarp
@dkarp 奇怪,我用这段代码看到了输出。我刚刚运行了这段代码并粘贴了输出,我没有使用任何“”。如果我不使用“”,我可以看到我所有的标签,我刚刚创建了一个新的标签,我可以看到它出现在没有(*)的情况下。这样:>>支出
收件箱 个人 收据 旅行 工作 [Gmail]。然而,如果使用“*”,我会看到所有标签+草稿、已发送、所有邮件等。
- Nishant
它没有显示“Inbox”的子文件夹。我的收件箱里有“mail1”、“mail2”。 我已经使用了您的代码来获取文件夹列表,但它只显示了收件箱,而不是其子文件夹。 - Mister X

8
你可以像这样访问其他文件夹
store.getFolder("[Gmail]/Sent Mail");
store.getFolder("[Gmail]/Drafts");

etc.


0

store.getDefaultFolder().list() 怎么样?虽然只是猜测。


0
你可以尝试这个:
Folder[] folderList = store.getDefaultFolder().list("*");

-1
您可以在邮箱侧边栏上右键单击不同的按钮,并检查用于不同邮件中使用的不同文件夹的名称。
这适用于每个电子邮件客户端。列表命令有效,但我觉得这样可以加快过程。

2
这是一个关于如何以编程方式完成而不是手动完成的问题。 - Klapsa2503

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接