我将 Message msg 分成 Multipart multi1 =(Multipart)msg.getContent()。 邮件附件在一个BodyPart中, Part part = multi1.getBodyPart(i); 然后我想保存附件。
private void saveFile(String fileName, InputStream in) throws IOException {
File file = new File(fileName);
if (!file.exists()) {
OutputStream out = null;
try {
out = new BufferedOutputStream(new FileOutputStream(file));
in = new BufferedInputStream(in);
byte[] buf = new byte[BUFFSIZE];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
} catch (FileNotFoundException e) {
LOG.error(e.toString());
} finally {
// close streams
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
但是在阅读IO Stream时花费了太多时间。例如,2.7M文件需要大约160秒才能保存在磁盘上。我已经尝试过Channel和其他一些IO Stream,但没有任何改变。使用Java Mail保存附件的任何解决方案?
答案 0 :(得分:4)
实际上,mail.imaps.partialfetch生效并加速了很多。我之前的代码有一个错误。
props.put("mail.imap.partialfetch","false");
props.put("mail.imap.fetchsize", "1048576");
props.put("mail.imaps.partialfetch", "false");
props.put("mail.imaps.fetchsize", "1048576");
而不是
props.put("mail.imap.partialfetch",false);
props.put("mail.imap.fetchsize", "1048576");
props.put("mail.imaps.partialfetch", false);
props.put("mail.imaps.fetchsize", "1048576");
在" false"上加上引号很重要。如果没有,参数将不起作用。
无论如何,多亏Bill Billnon。
答案 1 :(得分:1)
此操作有两个关键部分 - 从邮件服务器读取数据并将数据写入文件系统。很可能是服务器的速度和服务器的网络连接控制着整体操作速度。您可以尝试设置mail.imap.fetchsize和mail.imap.partialfetch属性,看看是否可以提高性能。
您也可以尝试使用NullOutputStream而不是FileOutputStream来测量读取数据的速度。