2010-01-11 12 views
5

no sé por qué estoy recibiendo la siguiente excepción al leer un correo electrónico con un archivo adjunto de servidor de correo:Missing excepción de límite de inicio al leer los mensajes con un archivo adjunto

Exception in thread "main" javax.mail.MessagingException: Missing start boundary 

     at javax.mail.internet.MimeMultipart.parsebm<MimeMultipart.java:872) 
     at javax.mail.internet.MimeMultipart.parse<MimeMultipart.java:493) 
     at javax.mail.internet.MimeMultipart.getCount<MimeMultipart.java:240) 
     at GetParts.handleMultipart(GetParts.java:57) 
     at GetParts.main(GetParts.java:42) 

El archivo que he Estoy usando para leer esos mensajes es:

import java.io.*; 
import java.util.Properties; 
import javax.mail.*; 
import javax.mail.internet.*; 

public class GetParts { 
    public static void main (String args[]) 
     throws Exception { 
    String host = args[0]; 
    String username = args[1]; 
    String password = args[2]; 

    // Get session 
    Properties props=new Properties(); 
    props.put("mail.mime.multipart.ignoremissingboundaryparamete",true); 
    Session session = Session.getInstance(
     props, null); 
ContentType ct=new ContentType(); 
    // Get the store 
    Store store = session.getStore("pop3"); 
    store.connect(host, username, password); 

    // Get folder 
    Folder folder = store.getFolder("INBOX"); 
    folder.open(Folder.READ_ONLY); 

    BufferedReader reader = new BufferedReader (
     new InputStreamReader(System.in)); 

    // Get directory 
    Message message[] = folder.getMessages(); 
    for (int i=0, n=message.length; i<n; i++) { 
     System.out.println(i + ": " 
     + message[i].getFrom()[0] 
     + "\t" + message[i].getSubject()); 
      //message[i].setHeader("Content-Type","multipart/mixed"); 
     System.out.println("Do you want to get the content? [YES to read/QUIT to end]"); 
     String line = reader.readLine(); 
     if ("YES".equals(line)) { 
     Object content = message[i].getContent(); 
     if (content instanceof Multipart) { 
      handleMultipart((Multipart)content); 
     } else { 
      handlePart(message[i]); 
     } 
     } else if ("QUIT".equals(line)) { 
     break; 
     } 
    } 

    // Close connection 
    folder.close(false); 
    store.close(); 
    } 
    public static void handleMultipart(Multipart multipart) 
     throws MessagingException, IOException { 
     System.out.println(multipart.getCount()); 
    for (int i=0, n=multipart.getCount(); i<n; i++) { 
     handlePart(multipart.getBodyPart(i)); 
    } 
    } 
    public static void handlePart(Part part) 
     throws MessagingException, IOException { 
    String disposition = part.getDisposition(); 
    System.out.println("Disposition "+disposition); 
    String contentType = part.getContentType(); 
    System.out.println("contentType "+contentType); 
    if (disposition == null) { // When just body 
     System.out.println("Null: " + contentType); 
     // Check if plain 
     if ((contentType.length() >= 10) && 
      (contentType.toLowerCase().substring(
      0, 10).equals("text/plain"))) { 
     part.writeTo(System.out); 
     } else { // Don't think this will happen 
     System.out.println("Other body: " + contentType); 
     part.writeTo(System.out); 
     } 
    } else if (disposition.equalsIgnoreCase(Part.ATTACHMENT)) { 
     System.out.println("Attachment: " + part.getFileName() + 
     " : " + contentType); 
     saveFile(part.getFileName(), part.getInputStream()); 
    } else if (disposition.equalsIgnoreCase(Part.INLINE)) { 
     System.out.println("Inline: " + 
     part.getFileName() + 
     " : " + contentType); 
     saveFile(part.getFileName(), part.getInputStream()); 
    } else { // Should never happen 
     System.out.println("Other: " + disposition); 
    } 
    } 
    public static void saveFile(String filename, 
     InputStream input) throws IOException { 
    if (filename == null) { 
     filename = File.createTempFile("xx", ".out").getName(); 
    } 
    // Do no overwrite existing file 
    File file = new File(filename); 
    for (int i=0; file.exists(); i++) { 
     file = new File(filename+i); 
    } 
    FileOutputStream fos = new FileOutputStream(file); 
    BufferedOutputStream bos = new BufferedOutputStream(fos); 

    BufferedInputStream bis = new BufferedInputStream(input); 
    int aByte; 
    while ((aByte = bis.read()) != -1) { 
     bos.write(aByte); 
    } 
    bos.flush(); 
    bos.close(); 
    bis.close(); 
    } 
} 
+0

Publique la secuencia de mensajes de entrada que está causando el problema (al menos hasta el delimitador de partes) –

+1

No creo que debería importar pero se olvidó de la "r" en el parámetro en la línea 'props.put (" mail .mime.multipart.ignoremissingboundaryparamete ", true);' – Edd

Respuesta

7

Acabo de tener el mismo problema. El límite se especifica dentro del Tipo de contenido multiparte. Puede encontrar más información en este source. También puede ver el mensaje actual utilizando la función getContentType(). En mi caso he obtenido este resultado:

multipart/mixed; boundary=--boundary_25_2d74d02b-d0d6-4f28-a311-4d1b7d107417 

Por lo tanto la función getCount() utiliza este límite para separar todas las partes que componen la parte múltiple. Parece que podría haber casos en los que este límite esté dañado.

la propiedad del sistema mail.mime.multipart.ignoreexistingboundaryparameter puede establecerse en true para causar cualquier los límites para ser ignorado y en lugar de buscar una línea de frontera en el mensaje como con mail.mime.multipart.ignoremissingboundaryparameter.

Seguí estas instrucciones y todo funciona bien. He añadido el código a continuación:

System.setProperty("mail.mime.multipart.ignoreexistingboundaryparameter", "true"); 

Espero que ayude!

0

tratan de modo ajustado en el ex multipartEntityBuilder : multipartEntityBuilder.setMode (HttpMultipartMode.RFC6532);

Cuestiones relacionadas