如何使用 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: UrlDataSource获取网络文件作为邮件的附件|javamail发送二进制流附件的问题