Java邮件Api从MS Exchange服务器获取邮件内容非常慢

时间:2015-12-23 07:27:32

标签: java javamail

我有使用java mail api和spring编写的服务。以下是阅读邮件的代码段。

First Store对象是使用spring bean创建的,如下所示

<bean id="store" factory-bean="imap_session" factory-method="getStore">
    <constructor-arg index="0" value="imaps"/>
</bean>

<bean id="imap_session" class="javax.mail.Session">
   <constructor-arg index="0">
    <props>
       <prop key="mail.imap.partialfetch">false</prop>
       <prop key="mail.mime.decodefilename">true</prop>
       <prop key="mail.imap.port">993</prop>
       <prop key="mail.imap.ssl.protocols"></prop>
       <prop key="mail.imap.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
      <prop key="mail.imap.ssl.enable">true</prop>
    </props>
 </constructor-arg>
<constructor-arg index="1">
    <null/>
</constructor-arg>
</bean>

用于连接服务器和获取消息的java代码片段如下所示

public Message[] getMessages() throws MessagingException, ConfigurationException {
try {
store.connect(host, user, password);
} catch (AuthenticationFailedException e) {
log.error("AuthenticationFailedException: " + e.getMessage());
}  catch(Exception ex) {
log.error("Exception: in connection with mail server " + ex.getMessage());
  }
Folder inFolder =  store.getFolder(name);
folder.open(Folder.READ_WRITE);
int count = inFolder.getMessageCount();
int length = count < numberOfMessagesToFetch ? count : numberOfMessagesToFetch;
Message[] messages = inFolder.getMessages(1, length);
// Commented out below settings 
/*FetchProfile fp = new FetchProfile();
fp.add(FetchProfile.Item.ENVELOPE);
fp.add(FetchProfile.Item.FLAGS);
fp.add(FetchProfile.Item.CONTENT_INFO);*/
//fp.add(IMAPFolder.FetchProfileItem.MESSAGE);
//IMAPFolder.FetchProfileItem

/*fp.add("X-mailer");
inFolder.fetch(messages, fp);*/
return messages;
}

下面是下载附件的代码片段

try{
  Object content = message.getContent();
  Multipart msgMultipart = (Multipart) content;
  Part part = multipart.getBodyPart(0);
  File attachmentFile = new File("path of file");
  FileOutputStream os = null;
  os = new FileOutputStream(attachmentFile);
  IOUtils.copy(part.getInputStream(), os);
  os.flush();
} finally {
  IOUtils.closeQuietly(os);
}

还有一些消息处理,例如获取一些标题字段值。收到时间,寄件人等。

问题是,对于一台不是Microsoft Exchange服务器的服务器,上面的代码片段需要3-4秒才能下载大小为315k的附件。但另一台服务器交换服务器,相同的代码速度非常慢,需要10 +秒。这是一个很大的瓶颈。

这种缓慢的原因是什么?如果有人有解决方案,请帮助我。如何快速使用Exchange邮件服务器。

0 个答案:

没有答案