2009-11-18 6 views
5

Obecnie pracuję nad aplikacją, która pobiera załącznik z konta Gmail. W tej chwili dostałem błąd podczas pobierania skompresowanego załącznika. Ale nie wszystkie, niektóre mogę odzyskać bez błędu. Oto komunikat o wyjątku:Błąd JavaMail BaseEncode64

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: Udało mi się pobrać załącznik za pośrednictwem interfejsu internetowego Gmail.

Oto fragment:

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

Ktoś ma pomysł, jak obejść ten problem?

+0

Powodzenia z tym jeszcze? – William

+0

nie, jeszcze nie. Wydaje się że. nikt nie jest zainteresowany pocztą java: ( – ariefbayu

Odpowiedz

10

z listy znanych ograniczeń, błędy, problemy z JavaMail:

Niektóre serwery IMAP nie wdrażają IMAP Częściowa FETCH funkcjonalność prawidłowo. Ten problem zazwyczaj przedstawia się jako uszkodzony załącznik wiadomości e-mail podczas pobierania dużych wiadomości z serwera IMAP. Aby obejść ten błąd serwera, ustaw właściwość "mail.imap.partialfetch" na false. Będziesz musiał ustawić tę właściwość w obiekcie Właściwości, który podasz na Sesję na .

Powinieneś po prostu wyłączyć częściowe pobieranie w sesji imap. Na przykład:

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

Co jeśli to nie naprawi? Ustawiłem 'properties.setProperty (" mail.imaps.partialfetch "," false ");' (Próbowałem również ustawienie "mail .imap.partialfetch ", co też nie pomogło), ale nadal otrzymuję wyjątek typu" BASE64Decoder: Błąd w zakodowanym strumieniu: potrzeba 4 ważnych znaków base64, ale otrzymałem tylko 1 przed EOF " – David

1

If You Are Korzystanie java poczty API następnie dodać te linie podczas łączące się z serwerem IMAP ......

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

........ .... Twój kod ... ......

powinien działać.

Powiązane problemy