2011-03-20 31 views
11

Ahora he creado un código para recuperar el correo electrónico no leído y leer su cuerpo y luego podemos almacenar o hacer lo que queramos hacer.Recuperar correos electrónicos no leídos de Gmail - JavaMail API + IMAP

Está funcionando por completo, pero el problema es que me da solo el cuerpo para el primer correo y para el segundo da el cuerpo con las etiquetas html.

estoy usando API JavaMail ...

¿Cómo puedo hacer ??

Gracias de antemano.

Saludos, Ali

package pack1; 
//import the necessary classes 

import java.io.IOException; 
import java.util.Properties; 

import javax.mail.Flags; 
import javax.mail.Folder; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.Multipart; 
import javax.mail.NoSuchProviderException; 
import javax.mail.Session; 
import javax.mail.Store; 
import javax.mail.search.FlagTerm; 

public class InboxReader { 

    public static void main(String args[]) { 
     Properties props = System.getProperties(); 
     props.setProperty("mail.store.protocol", "imaps"); 
      try { 
       Session session = Session.getDefaultInstance(props, null); 
       Store store = session.getStore("imaps"); 
       store.connect("imap.gmail.com", "mail", "pass"); 
       System.out.println(store); 

       Folder inbox = store.getFolder("Inbox"); 
       inbox.open(Folder.READ_ONLY); 
       //Message messages[] = inbox.getMessages(); 
       FlagTerm ft = new FlagTerm(new Flags(Flags.Flag.SEEN), false); 
       Message messages[] = inbox.search(ft); 

       int i =0; 
       for(Message message:messages) 
       { 

        Multipart mp = (Multipart)messages[i].getContent(); 
        Object p = mp.getBodyPart(i).getContent(); 
        String q = p.toString();//object has the body content 
        System.out.println(q);//prints the body 
        System.out.println(messages[i].getSubject()+ " \n"+i);i++; 
       } 


        } catch (NoSuchProviderException e) { 
         e.printStackTrace(); 
         System.exit(1); 
        } catch (MessagingException e) { 
         e.printStackTrace(); 
         System.exit(2); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 

    } 

} 

La salida:

a 

a 
0 
<div dir="ltr">b<br> 
</div> 

b 
1 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 >= 2 
    at java.util.Vector.elementAt(Unknown Source) 
    at javax.mail.Multipart.getBodyPart(Multipart.java:156) 
    at javax.mail.internet.MimeMultipart.getBodyPart(MimeMultipart.java:258) 
    at pack1.InboxReader.main(InboxReader.java:39) 
+0

Me pregunto si tal pregunta obtiene +11 y no -20 (y protagonizada con 13) – benchpresser

Respuesta

15

Estás usando el mismo índice para obtener un mensaje de su lista como para obtener una parte de ese mensaje. De modo que está obteniendo la parte 1 del mensaje 1, la parte 2 del mensaje 2, etc. En algún momento, apretó un mensaje N que tiene menos de N partes y obtiene el ArrayIndexOutOfBoundsException.

Multipart mp = (Multipart)messages[i].getContent(); 
Object p = mp.getBodyPart(i).getContent(); 

Además, usted está asumiendo que todos sus mensajes son multiparte. La primera vez que llame al Message.getContent() en un mensaje no multiparte, obtendrá un ClassCastException ya que lo más probable es que le devuelva un String.

Multipart mp = (Multipart)messages[i].getContent(); 

De forma similar, asumirá varias partes no anidadas. La primera vez que recibe un mensaje con un nivel superior multipart/mixed que contiene un multipart/alternative como primera subparte, la llamada a MimeBodyPart.getContent() devolverá otro Multipart y por lo tanto p.toString() simplemente devolverá un identificador de objeto Java, no el contenido del mensaje que desea.

Object p = mp.getBodyPart(i).getContent(); 
String q = p.toString();//object has the body content 

Para hacerlo bien, debe recorrer la estructura del mensaje y determinar la parte del "cuerpo" que le interesa.

Cuestiones relacionadas