Вопрос

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

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

Это было полезно?

Решение

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

Некоторые серверы IMAP не реализуют функциональность частичной выборки IMAP. Эта проблема обычно проявляется как коррумпированные вложения по электронной почте при загрузке больших сообщений с сервера IMAP. Чтобы обходной ошибку этой ошибки сервера, установите свойство "mail.imap.partialfetch" на false. Вам придется установить это свойство в объекте 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

Другие советы

If You Are Using java mail API then add these lines while you are connectin the imap server......

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

........ .... your code .. ......

it should work.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top