2009-11-18 50 views
5

我目前正在開發一個應用程序,它從Gmail帳戶下載附件。 現在,我每次下載壓縮附件都會出錯。但是,並非全部,有些我可以無誤地檢索它。以下是例外消息: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" 

通知:我可以通過gmail網絡界面下載附件。

這裏的片段:

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

任何人有任何想法,如何解決這個問題呢?

+0

還有什麼運氣呢? – William 2009-11-29 18:08:42

+0

不,還沒有。似乎。沒有人對java郵件感興趣:( – ariefbayu 2009-11-30 01:27:52

回答

10

從已知限制,臭蟲,JavaMail的問題的列表:

某些IMAP服務器不執行 的IMAP部分獲取功能 正常。當從IMG服務器下載來自 的大消息時,此問題通常會出現 損壞的電子郵件附件 。要解決此問題 服務器錯誤,請將 「mail.imap.partialfetch」屬性設置爲 false。您必須在您向會話提供的 屬性對象中設置此 屬性。

所以你應該只是關閉在imap會話中部分獲取。例如:

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

如果不解決這個問題呢?我已經設置了'properties.setProperty(「mail.imaps.partialfetch」,「false」);'(我也試過設置「mail .imap.partialfetch「,這也沒有幫助),但我仍然得到一種異常」編碼流中的BASE64Decoder:錯誤:需要4個有效的base64字符,但在EOF之前只有1個字符「 – David 2014-10-22 15:12:46

1

如果您使用的是Java API郵件,然後當你在connectin IMAP服務器添加這些行......

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

........ ....你的代碼.. ......

它應該工作。