【问题标题】:Downloading a word Document from Gmail using Javamail使用 Javamail 从 Gmail 下载 word 文档
【发布时间】:2011-10-15 08:37:17
【问题描述】:

我正在使用 Javamail API,并且正在尝试下载附件文件,例如 word 文件。 问题是我在尝试读取字节并将其保存到文件时遇到 base64 解码异常。 为此,我正在使用以下代码。

堆栈异常:

IOException:com.sun.mail.util.DecodingException: BASE64Decoder: Error in encoded stream: needed 4 valid base64 characters but only got 2 before EOF, the 10 most recent characters were: "AG4AAAAAAA"

JavaMail 代码:

 private void getAttachments(Message temp) throws IOException, MessagingException {
        List<File> attachments = new ArrayList<File>();

        Multipart multipart = (Multipart) temp.getContent();

        System.out.println(multipart.getCount());

        for (int i = 0; i < multipart.getCount(); i++) {
            BodyPart bodyPart = multipart.getBodyPart(i);
            if (!Part.ATTACHMENT.equalsIgnoreCase(bodyPart.getDisposition())) {
                continue; // dealing with attachments only
            }
            InputStream is = bodyPart.getInputStream();


            File f = new File("C:\\Attachments\\" + bodyPart.getFileName());

          //  saveFile(bodyPart.getFileName(),is);

            BufferedReader br = new BufferedReader(new InputStreamReader(is));

            while (br.ready()) {
                System.out.println(br.readLine());
            }



           saveFile(bodyPart.getFileName(),is);

            attachments.add(f);
        }



public static void saveFile(String filename,InputStream input) 
    {

        System.out.println(filename);
        try {
            if (filename == null) {
                //filename = File.createTempFile("VSX", ".out").getName();
                return;
            }
            // Do no overwrite existing file
            filename = "C:\\Attachments\\" + filename;
            File file = new File(filename);
            for (int i = 0; file.exists(); i++) {
                file = new File(filename + i);
            }
            FileOutputStream fos = new FileOutputStream(file);
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            BufferedInputStream bis = new BufferedInputStream(input);


            int aByte;
            while ((aByte = bis.read()) >=0) {
                bos.write(aByte);
            }

            bos.flush();
            bos.close();
            bis.close();
        } // end of try()
        catch (IOException exp) {
            System.out.println("IOException:" + exp);
        }
    } //end of saveFile()

【问题讨论】:

  • 您发布的代码看起来不错。因此,您的问题可能出在 JavaMail 特定的代码中。您能否向我们展示该代码以及异常的消息和堆栈跟踪?
  • @RolandIllig 我再次编辑了代码
  • 当您直接使用 MimeBodyPart 中的 saveFile() 方法而不是滚动您自己的保存逻辑时会发生什么?
  • 已解决:问题是您必须将 IMAP 的属性设置为部分提取。谢谢大家!

标签: java jakarta-mail


【解决方案1】:

您需要禁用部分提取才能解决此问题。这是您可以做到的方法

props.setProperty("mail.imap.partialfetch", "false");

props.setProperty("mail.imaps.partialfetch", "false");

如果您正在使用 imaps。

这里是完整的参考: JavaMail BaseEncode64 Error

【讨论】:

  • 如果这不能解决问题怎么办?我已经设置了 properties.setProperty("mail.imaps.partialfetch", "false"); (我也尝试过设置“mail.imap.partialfetch”,这也没有帮助),但我仍然得到“BASE64Decoder:编码流中的错误:需要4个有效的base64字符但之前只有1个”的异常EOF"
  • 能否分享您的代码库和错误详情。
  • 忽略我的评论,它实际上只是一封包含格式错误的 BASE64 内容的电子邮件! :)
【解决方案2】:

使用 MimeBodyPart 中的 saveFile() 方法。如果你真的想在将输入流交给你的 saveFile 方法之前从输入流中读取你自己的 stop(!) 行。您正在使用部分内容,这可能会导致问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    相关资源
    最近更新 更多