2012-02-13 29 views
20

Estoy tratando de acceder a los correos electrónicos de las cuentas de Gmail a través de IMAP con la ayuda de la API de JavaMail. Me preguntaba por qué el código funciona para una cuenta de correo electrónico pero no funciona para otra.Acceder a los correos electrónicos de Gmail usando IMAP (API de javamail)

Puedo acceder a la carpeta Inbox de ambas cuentas de correo electrónico. Pero para una de las cuentas de correo electrónico, otras carpetas como SPAM([Gmail]/Spam) no se pueden acceder y arroja una excepción FolderNotFoundException. ¿Alguien podría explicar lo que está pasando mal?

Gracias de antemano.

Aquí está el código:

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. ¡Esto funciona! :-) –

+0

Gracias hombre. :-) – kukis

Respuesta

12

es una de las cuentas utilizando la interfaz de usuario no-Inglés, por casualidad?

Los nombres de las carpetas de Gmail están localizados con respecto a la configuración de localización del usuario.

Actualmente, la única forma de obtener el nombre de la carpeta localizada es utilizando el comando XLIST.

+0

@ Pawel Lesnikowski ¿Podría por favor elaborar qué es el comando XLIST y cómo puedo usarlo para obtener el nombre de la carpeta localizada? Gracias. – Ragini

+0

XLIST es una de las extensiones agregadas al protocolo IMAP de Google. Es muy similar al comando LIST. Su respuesta incluye indicadores adicionales que permiten al cliente identificar el propósito de la carpeta. Puede encontrar una respuesta de ejemplo aquí: http://www.limilabs.com/blog/localized-gmail-imap-folders No soy un desarrollador de Java, así que no puedo mostrarle cómo ejecutar este comando usando java. mail –

+0

@ Pawel Lesnikowski Gracias de nuevo ... El enlace que proporcionaste es muy útil ... Obtuve nombres de carpetas correctos y funcionan bien ... – Ragini

0

Im no está seguro si esto ayuda, pero he visto casos en los que las cuentas de Gmail tienen diferentes buzones es decir ..

cuenta de Gmail 1: -

cuenta
[[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] 

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

qué poner en smtp.properties? – vaibhavcool20

Cuestiones relacionadas