JavaMail BaseEncode64 Ошибка - PullRequest
       11

JavaMail BaseEncode64 Ошибка

6 голосов
/ 18 ноября 2009

В настоящее время я разрабатываю приложение, которое загружает вложение из учетной записи 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.

Вот фрагмент:

        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 ]

10 голосов
/ 14 марта 2011

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

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

Так что вам нужно просто отключить частичное получение в сеансе imap. Например:

Properties props = System.getProperties();
props.setProperty("mail.store.protocol", "imap");
props.setProperty("mail.imap.partialfetch", "false");
Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore("imaps");
store.connect("imap.gmail.com", "<username>","<password>");

источник: https://javaee.github.io/javamail/docs/api/com/sun/mail/imap/package-summary.html

1 голос
/ 21 октября 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...