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