Я разделяю Сообщение сообщения на 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,7-мегабайтного файла требуется почти 160 секунд. Я уже пробовал Channel и еще какой-то IO Stream, но ничего не изменилось. Любое решение для сохранения вложений с помощью Java Mail?

Для получения дополнительной информации о коде https://github.com/cainzhong/java-mail-demo/blob/master/src/main/java/com/java/mail/impl/ReceiveMailImpl.java

2
Cain 21 Фев 2016 в 08:51

2 ответа

Лучший ответ

На самом деле 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"); 

Важно заключить слово «ложь» в кавычки. В противном случае параметры не вступят в силу.

В любом случае, спасибо Биллу Шеннону.

5
Cain 1 Мар 2016 в 12:08

В этой операции есть две ключевые части - чтение данных с вашего почтового сервера и запись данных в вашу файловую систему. Скорее всего, это скорость сервера и сетевое подключение к серверу, которое контролирует общую скорость операции. Вы можете попробовать установить mail.imap.fetchsize и mail.imap.partialfetch, чтобы узнать, улучшит ли это производительность.

Вы также можете попробовать использовать что-то вроде NullOutputStream вместо FileOutputStream для измерения только скорости чтения данных.

1
Bill Shannon 22 Сен 2017 в 18:37