2010-01-11 9 views
5

non so il motivo per cui sto ottenendo la seguente eccezione durante la lettura di una mail con un file allegato dal server di posta:mancante inizio confine Eccezione durante la lettura di messaggi con un file allegato

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) 

Il file che ho Sto usando per leggere quei messaggi è:

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

Inviare il flusso di messaggi di input che sta causando il problema (almeno fino al delimitatore di parte) –

+1

Non penso che dovrebbe essere importante ma hai perso la "r" nel parametro nella riga 'props.put (" mail .mime.multipart.ignoremissingboundaryparamete", true);' – Edd

risposta

7

Ho appena avuto lo stesso problema. Il limite è specificato all'interno del tipo di contenuto Multipart. È possibile trovare ulteriori informazioni in questo source. Puoi anche guardare quello del tuo messaggio corrente usando la funzione getContentType(). Nel mio caso ho ottenuto questo risultato:

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

Quindi la funzione getCount() utilizza questo confine per separare tutte le parti che compongono la parte multipla. Sembra che potrebbero esserci casi in cui questo limite è corrotto.

la proprietà di sistema mail.mime.multipart.ignoreexistingboundaryparameter può essere impostato su true per causare qualsiasi confine per essere ignorato e invece la ricerca di una linea di confine nel messaggio come con mail.mime.multipart.ignoremissingboundaryparameter.

Ho seguito queste istruzioni e tutto funziona perfettamente. Ho aggiunto il codice qui sotto:

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

Spero che sia d'aiuto!

0

provare la modalità per impostare sul multipartEntityBuilder es: multipartEntityBuilder.setMode (HttpMultipartMode.RFC6532);

Problemi correlati