Ошибка Javamail Будет BaseEncode64

в настоящее время я разрабатываю приложение, которое загружает вложение из учетной записи gmail. Прямо сейчас, я получил ошибку при загрузке zipped attachment. Но не все, некоторые я могу восстановить без ошибок. Вот сообщение об исключении:

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: я смог загрузить приложение через веб-интерфейс 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();
            }
        }
    }

кто-нибудь есть идея, как обойти эту проблему?

2 ответов


из списка известных ограничений, ошибок, проблем JavaMail:

некоторые серверы IMAP не реализуют функция частичной выборки IMAP правильно. Эта проблема обычно проявляется как поврежденные вложения электронной почты при загрузке больших сообщений сервер IMAP. Чтобы обойти это ошибка сервера, установите "почта.протокол IMAP.partialfetch" имущество ложный. Вы должны будете установить это свойство в объекте Properties, которое вы предоставляете свой Сессия.

поэтому вы должны просто выключить частичная выборка в сеансе 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>");

Если вы используете JAVA mail API, добавьте эти строки во время подключения к серверу imap......

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

........ .... ваш код. . ......

он должен работать.