web-dev-qa-db-fra.com

Comment obtenir la liste des dossiers disponibles dans un compte de messagerie à l'aide de JavaMail

J'utilise l'API JavaMail pour me connecter à mon compte personnel. J'ai créé une liste de dossiers (libellés) dans mon compte Gmail + les dossiers par défaut tels que Boîte de réception, Brouillons, etc. Comment puis-je répertorier tous les dossiers disponibles (le dossier par défaut et l'utilisateur créé)? 

Je peux accéder au dossier particulier à l'aide de cette API: Folder inbox = store.getFolder("Inbox");. Existe-t-il une autre API pour obtenir la liste des dossiers disponibles dans un compte de messagerie?

36
Jagadesh

Voici le code qui fonctionne. Cela vous permettra de gérer toutes les étiquettes. Pour aller plus loin dans une folder, vous pouvez exécuter folder.list() ou vous pouvez utiliser store.getDefaultFolder().list("*") pour récupérer tous les dossiers et sous-dossiers comme suggéré dans l'autre réponse.

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", "[email protected]", "UR_P@ZZWRD");
System.out.println(store);

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

Sortie:

>> INBOX
>> Personnel
>> Recettes
>> Voyage
>> travail
>> [Gmail]


ANCIENNE RÉPONSE 

S'il vous plaît noter que ce n'est pas correct, c'est à juste titre dans cette réponse par dkarp

Ceux-ci devraient faire:

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 </ strike>

31
Nishant

Sergey est proche, mais par défaut, list() de JavaMail effectue un LIST "" %, qui ne vous donne que les dossiers de niveau supérieur. GMail place ses dossiers système (Tous les courriers, Brouillons, Courriers envoyés, Spam, Favoris et Corbeille) dans le dossier non sélectionnable [Gmail]. Vous devez donc créer un LIST "" * à la place. Sinon, vous récupérerez simplement INBOX, [Gmail] et vos étiquettes.

Voici un exemple de code qui se connecte à GMail, récupère la liste des dossiers, puis affiche le nom et le nombre de messages pour chaque dossier non -\NoSelect (c'est-à-dire ceux qui ne sont pas simplement des espaces réservés de la hiérarchie, comme [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();
}
59
dkarp

Vous pouvez accéder à d'autres dossiers comme celui-ci 

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

etc.

7
user889386

Que diriez-vous de store.getDefaultFolder().list()? Juste une supposition, cependant.

0
Sergei Tachenov