2010-11-18 2 views
3

Я использую javamail для автоматизации обработки электронной почты.Извлечь содержимое вложения с помощью javamail

Мне удалось получить соединение с сервером pop3 и получить сообщения. Некоторые из них содержат вложение. Основываясь на заголовке электронной почты, я могу «предсказать» имя файла вложения, которое мне нужно получить.

Но я не могу получить его содержание :(

У меня есть функция

public byte[] searchForContent(Part part,String fileName){ 
    if(part.getFileName()!=null){ 
     if(part.getFileName().equals(fileName)){ 
      byte[] content = new byte[part.getSize()]; 
      part.getInputStream().read(content); 
      return content[] 
     } 
    } 
    return null; 
} 

Функция работает очень хорошо (то есть: возвращение содержание только если часть была привязанность описывается Filename) . Но массив его возвращение слишком велик.

Загруженное вложение длиной 256 байт, а функция возвращает 352 байт, содержание.

Я думаю, что ТЕН Проблема возникает из заголовков, но я не могу быть уверен.

Как вы прод можете воспринимать контент?

спасибо.

+0

, что вы имеете в виду слишком большой? он создает указанный файл? Если да, то как это может быть слишком большим? –

+0

Если я загружу приложение на свой рабочий стол и проверю размер, я получаю 256 байтов. Но для того же приложения, когда я запускаю этот код, возвращаемый массив имеет длину 352 байта. – almathie

ответ

0

Я, наконец, нашел решение.

As eaj сказал: part.getSize() возвращает размер объекта детали. Не размер самого приложения.

Однако InputStream, возвращаемый part.getInputStream(), содержит только содержимое вложения.

Так код ниже действительно дает ожидаемый результат:

public byte[] searchForContent(Part part,String fileName){ 
    if(part.getFileName()!=null){ 
     if(part.getFileName().equals(fileName)){ 
      InputStream stream=part.getInputStream(); 

      byte[] buffer = new byte[512]; 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

      int bytesRead; 
      while ((bytesRead = stream.read(buffer) != -1) 
      { 
       baos.write(buffer, 0, bytesRead); 
      } 
      return baos.toByteArray(); 
     } 
    } 
    return null; 
} 
0

Для чего это стоит, документация API для javax.mail.Part.getSize() говорит

Обратите внимание, что размер не может быть точной мерой размера содержимого и может или не может быть причиной для любого транспортного кодирования содержимого. Размер подходит для отображения в пользовательском интерфейсе, чтобы дать пользователю приблизительное представление о размере этой части.

Предполагая, что вы знаете тип контента, вы можете, вероятно, получить его от Part.getContent() и обработать его. getContent() возвращает объект, но если вы знаете тип содержимого, вы можете его соответствующим образом преобразовать (например, в строку для текста).

Смежные вопросы