2009-11-18 16 views
5

Actualmente estoy desarrollando una aplicación que descarga archivos adjuntos de la cuenta de Gmail. Ahora mismo, recibí un error al descargar archivos adjuntos comprimidos. Pero, no todos, algunos puedo recuperarlo sin error. Aquí está el mensaje de excepción:JavaMail BaseEncode64 Error

Exception in thread "main" com.sun.mail.util.DecodingException: BASE64Decoder: Error in encoded stream: needed 4 valid base64 characters but only got 1 before EOF, the 10 most recent characters were: "Q3w5ilxj2P" 

FYI: yo era capaz de descargar el archivo adjunto a través de la interfaz web de Gmail.

Aquí está el fragmento:

 Multipart multipart = (Multipart) message.getContent(); 

     for (int i = 0; i < multipart.getCount(); i++) { 

      BodyPart bodyPart = multipart.getBodyPart(i); 

      if (bodyPart.getFileName().toLowerCase().endsWith("zip") || 
        bodyPart.getFileName().toLowerCase().endsWith("rar")) { 
       InputStream is = bodyPart.getInputStream(); 
       File f = new File("/tmp/" + bodyPart.getFileName()); 
       FileOutputStream fos = new FileOutputStream(f); 
       byte[] buf = new byte[bodyPart.getSize()]; 
       int bytesRead; 
       while ((bytesRead = is.read(buf)) != -1) { 
        fos.write(buf, 0, bytesRead); 
       } 
       fos.close(); 
      } 
     } 
    } 

Alguien tiene idea de cómo solucionar este problema?

+0

¿Alguna suerte con esto todavía? – William

+0

no, aún no. Parece. nadie está interesado en el correo de Java :( – ariefbayu

Respuesta

10

De una lista de las conocidas limitaciones, errores, problemas de JavaMail:

Algunos servidores IMAP no implementan el IMAP parcial FETCH funcionalidad correctamente. Este problema típicamente se manifiesta como archivos adjuntos de correo electrónico dañados al descargar mensajes grandes desde el servidor IMAP. Para solucionar este error del servidor , establezca la propiedad "mail.imap.partialfetch" en false. Tendrá que establecer esta propiedad en el objeto Propiedades que proporciona a su Sesión.

Por lo tanto, debe simplemente desactivar recuperación parcial en la sesión imap. Por ejemplo:

Properties props = System.getProperties(); 
props.setProperty("mail.store.protocol", "imaps"); 
props.setProperty("mail.imaps.partialfetch", "false"); 
Session session = Session.getDefaultInstance(props, null); 
Store store = session.getStore("imaps"); 
store.connect("imap.gmail.com", "<username>","<password>"); 
+0

¿Qué pasa si eso no lo arregla? He establecido 'properties.setProperty (" mail.imaps.partialfetch "," false ");' (También he intentado configurar el "correo" .imap.partialfetch ", que no ayudó tampoco), aún así recibo una excepción del tipo" BASE64Decoder: error en la transmisión codificada: necesitaba 4 caracteres válidos de base64 pero solo obtuve 1 antes de EOF " – David

1

si se utiliza el API de Java electrónico a continuación, añadir estas líneas mientras está cone el servidor IMAP ......

Properties prop = new Properties(); 
prop.put("mail.imaps.partialfetch", false); 
Session session = Session.getDefaultInstance(prop, null); 

........ .... su código ... ......

debería funcionar.

Cuestiones relacionadas