2009-11-18 11 views
5

Je suis actuellement en train de développer une application qui télécharge des pièces jointes à partir du compte Gmail. À l'heure actuelle, j'ai eu une erreur lors du téléchargement de la pièce jointe compressée. Mais, pas tous, certains je peux le récupérer sans erreur. Voici le message d'exception:JavaMail BaseEncode64 Erreur

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: J'ai pu télécharger la pièce jointe via l'interface web de gmail.

Voici l'extrait:

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

Quelqu'un a idée, comment contourner ce problème?

+0

Encore une chance avec ça? – William

+0

Non, pas encore. Semble être. personne ne s'intéresse au courrier java :( – ariefbayu

Répondre

10

A partir d'une liste des limites connues, des bugs, des problèmes de JavaMail:

Certains serveurs IMAP ne mettent pas en œuvre IMAP Fetch partiel fonctionnalité correctement. Ce problème généralement se manifeste sous la forme de pièces jointes d'e-mail corrompues lors du téléchargement de gros messages à partir du serveur IMAP. Pour contourner ce bug de serveur , définissez la propriété "mail.imap.partialfetch" sur false. Vous devrez définir cette propriété dans l'objet Propriétés que vous fournissez à votre session.

Vous devriez juste désactiver fetch partiel en session imap. Par exemple:

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

Que faire si cela ne le résout pas? J'ai défini 'properties.setProperty (" mail.imaps.partialfetch "," false ");' (J'ai également essayé de mettre "mail" .imap.partialfetch ", ce qui n'a pas aidé non plus, pourtant je reçois toujours une exception du genre" BASE64Decoder: Erreur dans le flux encodé: besoin de 4 caractères base64 valides mais seulement 1 avant EOF " – David

1

Si vous utilisez l'API de messagerie java puis ajoutez ces lignes pendant que vous ConnectIn le serveur imap ......

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

........ .... votre code .. ......

cela devrait fonctionner.