从javamail读取需要很长时间 [英] Reading from javamail takes a long time

查看:96
本文介绍了从javamail读取需要很长时间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用javamail使用IMAP协议从交换帐户中读取邮件.这些邮件为纯格式,其内容为XML.

I use javamail to read mails from an exchage account using IMAP protocol. Those mails are in plain format and its contents are XMLs.

几乎所有这些邮件的大小都很短(通常在100Kb以下).但是,有时我必须处理大型邮件(大约10Mb-15Mb).例如,昨天我收到了一封大小为13Mb的电子邮件.仅花费了50多分钟即可阅读.正常吗有没有办法提高其性能? 代码是:

Almost all those mails have short size (usually under 100Kb). However, sometimes I have to deal with large mails (about 10Mb-15Mb). For example, yesterday I received an email which was 13Mb size. It took more than 50min just to read it. Is it normal? Is there a way to increase its performance? The code is:

Session sesion = Session.getInstance(System.getProperties());
Store store = sesion.getStore("imap");
store.connect(host, user, passwd);
Folder inbox = store.getFolder("INBOX");
inbox.open(Folder.READ_WRITE);

Message[] messages = inbox.search(new FlagTerm(new Flags(Flags.Flag.SEEN), false));
for (int i = 0 ; i< messages.length ; i++){
    Object contents = messages[i].getContent();  // Here it takes 50 min on 13Mb mail
    // ...
}

花费这么长时间的方法是messages[i].getContent().我究竟做错了什么?有什么提示吗?

Method that takes such a long time is messages[i].getContent(). What am I doing wrong? Any hint?

非常感谢,我的英语对不起! ;)

Thanks a lot and sorry for my english! ;)

推荐答案

我终于解决了这个问题,并希望分享.

I finally solved this issue and wanted to share.

该解决方案,至少是对我有用的解决方案,可以在以下站点找到: http://www.oracle.com/technetwork/java/faq-135477.html#imapserverbug

The solution, at least the one that worked to me, was found in this site: http://www.oracle.com/technetwork/java/faq-135477.html#imapserverbug

因此,我在第一篇文章中键入的原始代码变为:

So, my original code typed in my first post becomes to this:

Session sesion = Session.getInstance(System.getProperties());
Store store = sesion.getStore("imap");
store.connect(host, user, passwd);
Folder inbox = store.getFolder("INBOX");
inbox.open(Folder.READ_WRITE);

// Convert to MimeMessage after search 
MimeMessage[] messages = (MimeMessage[]) carpetaInbox.search(new FlagTerm(new Flags(Flags.Flag.SEEN), false));
for (int i = 0 ; i< messages.length ; i++){
    // Create a new message using MimeMessage copy constructor
    MimeMessage cmsg = new MimeMessage(messages[i]);
    // Use this message to read its contents 
    Object obj = cmsg.getContent(); 
// ....
}

诀窍是使用MimeMessage()复制构造函数创建一个新的MimeMessage并读取其内容而不是原始消息. 您应该注意,此类对象实际上并没有连接到服务器,因此您对它所做的任何更改(例如设置标志)都不会生效.邮件上的任何更改都必须在原始邮件上完成.

The trick is, using MimeMessage() copy constructor, create a new MimeMessage and read its contents instead of original message. You should note that such object is not really connected to server, so any changes you make on it, like setting flags, won't take effect. Any change on message, have to be done on original message.

总结:此解决方案可读取使用IMAP协议连接到Exchange Server的大型纯文本邮件(最大15Mb).时间从读取13Mb邮件的51-55分钟缩短到读取同一邮件的9秒.逆天.

To sum up: This solution works reading large Plain Text mails (up to 15Mb) connecting to an Exchange Server using IMAP protocol. The times lowered from 51-55min to read a 13Mb mail, to 9seconds to read same mail. Unbelievable.

希望这对某人有帮助,并为英语错误感到抱歉;)

Hope this helps someone and sorry for English mistakes ;)

这篇关于从javamail读取需要很长时间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆