Получить содержимое вложения с помощью javamail - PullRequest
3 голосов
/ 18 ноября 2010

Я использую 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 байта.

Я думаю, что проблема связана с заголовками, но я не уверен.

Как вы будете получать содержимое?только?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 19 ноября 2010

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

Как сказал 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 голосов
/ 19 ноября 2010

Что стоит, в документации API для javax.mail.Part.getSize() написано

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

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

...