我显示下载附件的进度条,它工作正常......但是当我下载一些附件时,我收到异常消息:
线程“main”中的异常com.sun.mail.util.DecodingException: BASE64Decoder:编码流错误:需要4个有效的base64 字符,但在EOF之前只有1,最近的10个字符 是:“Q3w5ilxj2P”
我找到了解释:
某些IMAP服务器未实现IMAP部分FETCH 功能正常。这个问题通常表现为腐败 从IMAP下载大邮件时的电子邮件附件 服务器。要解决此服务器错误,请设置 “mail.imap.partialfetch”属性为false。你必须设置它 您提供给Session的Properties对象中的属性。
http://java.sun.com/products/javamail/NOTES113.txt
所以我关闭了部分抓取:
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>");
这解决了问题....然而,Part类中的方法getInputStream()阻塞了线程,直到完全下载了附件,并且无法获得有关已经从邮箱下载的字节数的信息。 如果没有此信息,则无法显示进度条。那么有没有办法获取这些信息并显示进度条?
答案 0 :(得分:0)
很难。
我知道的唯一方法是创建自己的套接字工厂,生成一种特殊类型的套接字(由您自己设计),它返回一个包装真实套接字InputStream的InputStream,并允许您监视通过它读取的数据量流。这将允许您测量从服务器返回到客户端的IMAP协议数据。它将无法告诉您返回了多少百分比的数据(因为您测量的数据包括所有IMAP协议开销和编码开销),但它应该可以让您看到正在进行的进展。 / p>
如果你创造这样的东西,我相信其他人会对它很感兴趣!