代码之家  ›  专栏  ›  技术社区  ›  ariefbayu

Javamail BaseEncode64错误

  •  6
  • ariefbayu  · 技术社区  · 15 年前

    我目前正在开发一个从Gmail帐户下载附件的应用程序。 现在,下载压缩附件时出错。但是,不是所有的,有些我可以毫无错误地找回它。以下是例外信息:

    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 Web界面下载附件。

    这是一个片段:

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

    有人知道如何解决这个问题吗?

    2 回复  |  直到 13 年前
        1
  •  10
  •   RED    13 年前

    从已知的限制、bug、javamail问题列表中:

    某些IMAP服务器无法实现 IMAP部分提取功能 适当地。这个问题通常 声明为损坏的电子邮件附件 从下载大邮件时 IMAP服务器。解决这个问题 服务器错误,设置 “mail.imap.partialfetch”属性 错误的。你得设置这个 属性对象中的属性 你提供给你的课程。

    所以你应该 关掉 在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>");
    
        2
  •  1
  •   Sorted    13 年前

    如果您正在使用Java邮件API,则在连接IMAP服务器时添加这些行……

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

    …… …你的代码… ……

    它应该起作用。