2009-11-18 8 views
5

Ich entwickle gerade eine Anwendung, die Anhang von Google Mail-Konto herunterladen. Jetzt habe ich Fehler beim Herunterladen von ZIP-Anhang. Aber nicht alle, manche kann ich ohne Fehler abrufen. Hier ist die Ausnahmemeldung:JavaMail BaseEncode64 Fehler

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: Ich konnte die Anlage über gmail Web-Schnittstelle zum Download bereit.

Hier ist der Code-Schnipsel:

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

Jede Idee hat, wie dieses Problem zu arbeiten?

+0

Haben Sie Glück dabei? – William

+0

nein, noch nicht. Sieht aus als ob. niemand interessiert sich für Java-Mail :( – ariefbayu

Antwort

10

Aus einer Liste der bekannten Einschränkungen, Fehler, Fragen der Java Mail:

Bestimmte IMAP-Server nicht implementieren die IMAP Teil Funktionalität FETCH richtig. Dieses Problem in der Regel manifestiert als beschädigte E-Mail-Anhänge beim Herunterladen großer Nachrichten von IMAP-Server. Um diesen Fehler Server umgehen, legen Sie die "mail.imap.partialfetch" -Eigenschaft auf false. Sie müssen diese -Eigenschaft in dem Properties-Objekt festlegen, das Sie für Ihre Sitzung bereitstellen.

So sollten Sie nur deaktivieren Teil in imap Sitzung holen. Zum Beispiel:

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

Was ist, wenn das das nicht behebt? Ich habe 'properties.setProperty (" mail.imaps.partialfetch "," false ") gesetzt;' (Ich habe auch versucht, "mail" zu setzen .imap.partialfetch ", was auch nicht geholfen hat, aber ich bekomme immer noch eine Ausnahme der Art" BASE64Decoder: Fehler im codierten Stream: benötigt 4 gültige base64 Zeichen, aber bekam nur 1 vor EOF " – David

1

Wenn Sie Java-Mail-API dann diese Zeilen hinzufügen, während Sie den imap-Server ...... Die Anschluss

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

........ .... Ihr Code .. ......

sollte es funktionieren.