2009-11-18 18 views
5

Attualmente sto sviluppando un'applicazione che scarica l'allegato dall'account Gmail. In questo momento, ho ricevuto un errore ogni volta che scaricavo un allegato zippato. Ma non tutti, alcuni posso recuperarlo senza errori. Ecco il messaggio di eccezione:JavaMail BaseEncode64 Errore

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: Sono riuscito a scaricare l'allegato tramite l'interfaccia web di Gmail.

Ecco il frammento:

 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(); 
      } 
     } 
    } 

Qualcuno ha idea, come risolvere questo problema?

+0

Hai ancora fortuna? – William

+0

no, non ancora. Sembra come. nessuno è interessato a java mail :( – ariefbayu

risposta

10

Da un elenco delle note limitazioni, bug, problemi di JavaMail:

Alcuni server IMAP non implementano IMAP parziale FETCH funzionalità correttamente. Questo problema tipicamente si manifesta come allegati di posta elettronica danneggiati quando si scaricano messaggi di grandi dimensioni dal server IMAP . Per ovviare al problema del server , impostare la proprietà "mail.imap.partialfetch" su false. È necessario impostare questa proprietà nell'oggetto Proprietà che si fornisce alla sessione.

così si dovrebbe solo spegnere parziale recuperare in sessione imap. Per esempio:

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

Cosa succede se non lo risolve? Ho impostato 'properties.setProperty (" mail.imaps.partialfetch "," false ");' (Ho anche provato a impostare "mail .imap.partialfetch ", che non ha aiutato nessuno dei due), tuttavia ottengo ancora un'eccezione del tipo" BASE64Decoder: Errore nel flusso codificato: necessario 4 caratteri base64 validi ma solo 1 prima di EOF " – David

1

Se si utilizza Java API posta quindi aggiungere queste righe mentre si sta connectin il server imap ......

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

........ .... il tuo codice .. ......

dovrebbe funzionare.

Problemi correlati