2012-02-13 4 views
20

J'essaie d'accéder aux courriels des comptes Gmail via IMAP à l'aide de l'API JavaMail. Je me demandais pourquoi le code fonctionne pour un compte de messagerie mais ne fonctionne pas pour un autre.Accéder aux courriels de Gmail en utilisant IMAP (API javamail)

Je peux accéder au dossier Inbox des deux comptes de messagerie. Mais pour l'un des comptes de messagerie, d'autres dossiers tels que SPAM([Gmail]/Spam) ne peuvent pas être accédés et il génère une exception FolderNotFoundException. Quelqu'un pourrait-il expliquer ce qui ne va pas?

Merci d'avance.

Voici le code:

import java.io.*; 
import java.util.*; 
import javax.mail.*; 
import javax.mail.Flags.Flag; 
import javax.mail.internet.*; 

import com.sun.mail.imap.IMAPFolder; 
import com.sun.mail.imap.IMAPMessage; 


public class FolderFetchIMAP { 


    public static void main(String[] args) throws MessagingException, IOException { 
     IMAPFolder folder = null; 
     Store store = null; 
     String subject = null; 
     Flag flag = null; 
     try 
     { 
      Properties props = System.getProperties(); 
      props.setProperty("mail.store.protocol", "imaps"); 

      Session session = Session.getDefaultInstance(props, null); 

      store = session.getStore("imaps"); 
      store.connect("imap.googlemail.com","[email protected]", "password"); 

      folder = (IMAPFolder) store.getFolder("[Gmail]/Spam"); // This doesn't work for other email account 
      //folder = (IMAPFolder) store.getFolder("inbox"); This works for both email account 


      if(!folder.isOpen()) 
      folder.open(Folder.READ_WRITE); 
      Message[] messages = folder.getMessages(); 
      System.out.println("No of Messages : " + folder.getMessageCount()); 
      System.out.println("No of Unread Messages : " + folder.getUnreadMessageCount()); 
      System.out.println(messages.length); 
      for (int i=0; i < messages.length;i++) 
      { 

      System.out.println("*****************************************************************************"); 
      System.out.println("MESSAGE " + (i + 1) + ":"); 
      Message msg = messages[i]; 
      //System.out.println(msg.getMessageNumber()); 
      //Object String; 
      //System.out.println(folder.getUID(msg) 

      subject = msg.getSubject(); 

      System.out.println("Subject: " + subject); 
      System.out.println("From: " + msg.getFrom()[0]); 
      System.out.println("To: "+msg.getAllRecipients()[0]); 
      System.out.println("Date: "+msg.getReceivedDate()); 
      System.out.println("Size: "+msg.getSize()); 
      System.out.println(msg.getFlags()); 
      System.out.println("Body: \n"+ msg.getContent()); 
      System.out.println(msg.getContentType()); 

      } 
     } 
     finally 
     { 
      if (folder != null && folder.isOpen()) { folder.close(true); } 
      if (store != null) { store.close(); } 
     } 

    } 



} 
+0

Wow. Cela marche! :-) –

+0

Merci l'homme. :-) – kukis

Répondre

12

est l'un des comptes en utilisant l'interface utilisateur non-anglais par hasard?

Les noms de dossier Gmail sont localisés en fonction des paramètres de localisation de l'utilisateur.

Actuellement, le seul moyen d'obtenir le nom du dossier localisé est d'utiliser la commande XLIST.

+0

@ Pawel Lesnikowski Pourriez-vous préciser ce qu'est la commande XLIST et comment puis-je l'utiliser pour obtenir un nom de dossier localisé? Merci .. – Ragini

+0

XLIST est l'une des extensions ajoutées au protocole IMAP par Google. C'est très similaire à la commande LIST. Sa réponse inclut des drapeaux supplémentaires qui permettent au client d'identifier l'objectif du dossier. Vous pouvez trouver un exemple de réponse ici: http://www.limilabs.com/blog/localized-gmail-imap-folders Je ne suis pas un développeur Java, donc je ne peux pas vous montrer comment lancer cette commande en utilisant java. mail –

+0

@ Pawel Lesnikowski Merci encore ... Le lien que vous avez fourni est très utile ... J'ai obtenu des noms de répertoires corrects et ils fonctionnent bien ... – Ragini

0

Im incertain si cela aide, mais j'ai vu des cas où les comptes gmail ont différentes boîtes aux lettres .. à savoir

compte Gmail 1: -

[[Google Mail]] 
[[Google Mail]/All Mail] 
[[Google Mail]/Bin] 
[[Google Mail]/Drafts] 
[[Google Mail]/Important] 
[[Google Mail]/Sent Mail] 
[[Google Mail]/Spam] 
[[Google Mail]/Starred] 

compte Gmail 2: -

[[Gmail]] 
[[Gmail]/All Mail] 
[[Gmail]/Bin] 
[[Gmail]/Drafts] 
[[Gmail]/Important] 
[[Gmail]/Sent Mail] 
[[Gmail]/Spam] 
[[Gmail]/Starred] 
5
package com.technicalkeeda; 

import java.io.File; 
import java.io.FileInputStream; 
import java.util.Properties; 

import javax.mail.Folder; 
import javax.mail.Message; 
import javax.mail.Session; 
import javax.mail.Store; 

public class GmailInbox { 

public static void main(String[] args) { 
    GmailInbox gmail = new GmailInbox(); 
    gmail.read(); 
} 

public void read() { 
    Properties props = new Properties(); 
    try { 
    props.load(new FileInputStream(new File("C:\\smtp.properties"))); 
    Session session = Session.getDefaultInstance(props, null); 

    Store store = session.getStore("imaps"); 
    store.connect("smtp.gmail.com", "*************@gmail.com","your_password"); 

    Folder inbox = store.getFolder("inbox"); 
    inbox.open(Folder.READ_ONLY); 
    int messageCount = inbox.getMessageCount(); 

    System.out.println("Total Messages:- " + messageCount); 

    Message[] messages = inbox.getMessages(); 
    System.out.println("------------------------------"); 
    for (int i = 0; i < 10; i++) { 
     System.out.println("Mail Subject:- " + messages[i].getSubject());  
    } 
    inbox.close(true); 
    store.close(); 

    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
} 

} 
+0

quoi mettre dans smtp.properties? – vaibhavcool20

Questions connexes