2009-11-18 25 views
5

Tôi hiện đang phát triển một ứng dụng tải xuống tệp đính kèm từ tài khoản gmail. Ngay bây giờ, tôi gặp lỗi khi tải xuống tệp đính kèm đã nén. Nhưng, không phải tất cả, một số tôi có thể lấy nó mà không có lỗi. Đây là thông báo Ngoại lệ:Lỗi 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: Tôi có thể tải xuống tệp đính kèm qua giao diện web gmail.

Sau đây là đoạn:

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

Bất cứ ai có ý tưởng, làm thế nào để làm việc xung quanh vấn đề này?

+0

Có may mắn với điều này chưa? – William

+0

không, chưa. Có vẻ như. không ai quan tâm đến thư java: ( – ariefbayu

Trả lời

10

Từ một danh sách các biết hạn chế, lỗi, các vấn đề về JavaMail:

Một số máy chủ IMAP không thực hiện IMAP phần FETCH chức năng đúng cách. Vấn đề này thường là tệp kê khai dưới dạng tệp đính kèm email bị hỏng khi tải xuống thư lớn từ máy chủ IMAP. Để giải quyết lỗi này máy chủ, hãy đặt thuộc tính "mail.imap.partialfetch" thành sai. Bạn sẽ phải đặt thuộc tính này trong đối tượng Thuộc tính mà bạn cung cấp cho Phiên của mình.

Vì vậy, bạn chỉ nên tắt tìm nạp một phần trong phiên imap. Ví dụ:

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

Điều gì sẽ xảy ra nếu điều đó không khắc phục được? Tôi đã đặt 'properties.setProperty (" mail.imaps.partialfetch "," false ");' (Tôi cũng đã thử đặt "thư" .imap.partialfetch ", không hỗ trợ cả hai), nhưng tôi vẫn nhận được ngoại lệ loại" BASE64Decoder: Lỗi trong luồng được mã hóa: cần 4 ký tự base64 hợp lệ nhưng chỉ nhận được 1 trước EOF " – David

1

Nếu bạn đang sử dụng java email API sau đó thêm những dòng này trong khi bạn đang connectin máy chủ imap ......

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

........ .... mã của bạn .. ......

nó sẽ hoạt động.

Các vấn đề liên quan