IMAP - javax.mail. - Получение только тела без навесного оборудования - PullRequest
6 голосов
/ 17 декабря 2009

Я пытаюсь разработать почтовый клиент IMAP с использованием API javax.mail. Мне удалось без проблем связаться с серверами, получить электронную почту, вложения и другие операции.

Однако мы не хотели бы получать вложение, пока пользователь не захочет просмотреть его в явном виде, чтобы повысить производительность. Это будет означать, что нам потребуется информация, которая указала бы, есть ли в письме вложение, если да, то имя файла (ов) и размер (а), но не отправит мне фактическое содержание письма , Однако я не смог найти метод в описании API, который бы возвращал только многокомпонентный контент.

Есть ли способ, которым я мог бы получить только тело и детали вложения, но не фактическое вложение?

Спасибо, Аравиндом

1 Ответ

2 голосов
/ 12 января 2011

Метод getContent() из javax.Part возвращает

содержимое как объект Java. Тип возвращенного объекта, конечно, зависит от самого контента. За Например, объект возвращен для «текст / простой» контент обычно Строковый объект. Объект возвращен для «Составной» контент всегда Составной подкласс.

См. http://download.oracle.com/javaee/6/api/javax/mail/Part.html#getContent%28%29

Если Message (то есть Part) содержит вложения, метод getContent вернет объект Multipart. Кроме того, вы можете узнать MIME-тип детали с помощью getContentType.

Информация, которая отсутствует в документации, заключается в том, что этот MultiPart объект, возвращаемый getContent, является просто пустым представлением структуры сообщения. Содержимое каждого Part Multipart будет извлекаться с сервера, только если вы специально запросите его. Например, чтобы разобрать составную часть Message, вы должны сделать:

if( p.isMimeType("multipart/*") ) {

    Multipart mp = (Multipart)p.getContent();
    // the content was not fetched from the server

    // parse each Part
    for (int i = 0; i < mp.getCount(); i++) {
        Part inner_part = mp.getBodyPart(i)

        if( inner_part.isMimeType("text/plain") ) {
            String text = inner_part.getText();
            // the content of this Part was fetched from the server
        }
    }
}

Что еще нужно учитывать, это то, что для оптимальной производительности вы должны получать информацию о структуре тела от сервера в пакете для сбора сообщений, которые вы хотите проанализировать (см. http://download.oracle.com/javaee/6/api/javax/mail/FetchProfile.Item.html#CONTENT_INFO). Если нет, каждый

Multipart mp = (Multipart)p.getContent();

приведет к запросу сервера на получение структуры тела. Если используется подход FetchProfile, структура тела для сбора сообщений будет извлечена только с одним запросом. Вы можете увидеть запросы к серверу в журнале, если активируете режим отладки в сеансе:

session.setDebug(true);

При этом для получения размера и имен файлов вложений просто используйте Part.getSize() и Part.getFileName() соответственно.

...