java - 使用 Javamail 从 Gmail 下载 Word 文档

标签 java jakarta-mail

我正在使用 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()

最佳答案

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

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

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

如果您正在使用 imap。

这里是完整的引用: JavaMail BaseEncode64 Error

关于java - 使用 Javamail 从 Gmail 下载 Word 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7776743/

相关文章:

java - Android ImageSwitcher 图像到另一个 Activity

java - SMTP 出现错误 554,数据命令被拒绝 : Access Manager - slot COS quota violation

java - 如何在 Spring Prepared Statement 中传递 Java Date

java - 为什么我的阵列被识别为 double ?

java - 用于有条件生成文件名的 UDF

Java Mail 身份验证和连接

Spring 电子邮件 : Must issue a STARTTLS command first

jakarta-mail - 消息唯一存在于java邮件中

java - 自 1.9.0 起在 App Engine 上发送包含内嵌图片的电子邮件

java - 在 Java DAO 上使用同步是否会导致问题?