Id вложения писем в Java

В настоящее время я работаю с Java Mail API. Мне нужно перечислить детали вложения также хочет удалить вложение из некоторых писем и переслать его другим. Поэтому я пытаюсь выяснить идентификатор вложения. Как мне это сделать? Любое предложение будет оценено!!!

2 ответа

Это помогает?

private void getAttachments(Part p, File inputFolder, List<String> fileNames) throws Exception{
    String disp = p.getDisposition();
    if (!p.isMimeType("multipart/*") ) {
        if (disp == null || (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE)))) {             
            String fileName = p.getFileName();
            File opFile =  new File(inputFolder, fileName);
            ((MimeBodyPart) p).saveFile(opFile);
            fileNames.add(fileName);                    
            }
        }
    }else{
        Multipart mp = (Multipart) p.getContent();
        int count = mp.getCount();
        for (int i = 0; i < count; i++){                 
            getAttachments(mp.getBodyPart(i),inputFolder, fileNames);
        }
    }
}

Попробуйте использовать почтовый пакет Apache Commons, который имеет MimeMessageParser учебный класс. С помощью анализатора вы можете получить идентификатор контента (который можно использовать для идентификации вложения) и вложения из сообщения электронной почты, например, так:

Session session = Session.getInstance(new Properties());
ByteArrayInputStream is = new ByteArrayInputStream(rawEmail.getBytes());
MimeMessage message = new MimeMessage(session, is);
MimeMessageParser parser = new MimeMessageParser(message);

// Once you have the parser, get the content ids and attachments:
List<DataSource> attachments = parser.getContentIds.stream
    .map(id -> parser.findAttachmentByCid(id))
    .filter(att -> att != null)
    .collect(Collectors.toList());

Для краткости я создал здесь список, но вместо этого вы можете создать карту с contentId в качестве ключа и DataSource в качестве значения.

Взгляните еще на несколько примеров использования парсера в Java или на некоторый код, который я написал для проекта Scala.

Там нет ничего в качестве идентификатора вложения. То, что ваш почтовый клиент отображает как сообщение с вложенным содержимым, действительно является MIME Multipart и выглядит так ( пример источника):

From: John Doe <example@example.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="XXXXboundary text"

This is a multipart message in MIME format.

--XXXXboundary text 
Content-Type: text/plain

this is the body text

--XXXXboundary text 
Content-Type: text/plain;
Content-Disposition: attachment; filename="test.txt"

this is the attachment text

--XXXXboundary text--

Важные вещи на заметку:

  1. Каждая часть в составной части имеет Content-Type
  2. При желании может быть Content-Disposition заголовок
  3. Отдельные части могут быть составными

Обратите внимание, что действительно есть Content-ID заголовок, но я не думаю, что это то, что вы ищете: например, он используется в multipart/related сообщения для встраивания image/*с и текст из text/html в том же сообщении электронной почты. Вы должны понимать, как это работает и используется ли оно на вашем входе.

Я думаю, что ваш лучший вариант - изучить Content-Disposition и Content-Type заголовок. Все остальное - догадки, и без фактического требования никто не сможет помочь с кодом.

Другие вопросы по тегам