Как получать и отличать обычные вложения от встроенных вложений в Apache Commons Email 1.4

В настоящее время мы получаем электронное письмо, которое анализируется

MimeMessageParser mimeMessageParser = parse(message);

а затем вытащите вложения с помощью

 if (mimeMessageParser.hasAttachments()) {
     List<DataSource> attachments = mimeMessageParser.getAttachmentList();
     for (DataSource dataSource : attachments) {
         saveAttachment(dataSource, subjectLineProperties, documentToUpload, firstHeaders);
     }
 }

Проблема в том, что getAttachmentList также возвращает встроенные изображения, такие как логотип компании в строке подписи, и мы не хотим извлекать встроенные изображения в качестве вложений. Нам просто нужны фактические вложения электронной почты. ATTACHMENT против INLINE, но у нас также нет доступа к размещению java.mail через версию Apache Commons Email 1.4, и мы не можем найти решение. Я проверил их документацию https://commons.apache.org/proper/commons-email/javadocs/api-1.4/index.html

Неудачно. Кажется, что DataSource вложений позволяет мне получать контент, тип и имя контента, но не в том случае, если это встроенное вложение/изображение или обычное вложение, такое как Mime Parts.


person user1567291    schedule 17.09.2018    source источник


Ответы (2)


У меня сложилось впечатление, что есть обходной путь без перехода на более низкий уровень... Но я еще не проверял его со всеми типами вложений - только с изображениями. Что-то вроде этого:

for(DataSource ds : mimeMessageParser.getAttachmentList()) {
    for(String id : mimeMessageParser.getContentIds()) {
        if(ds == mimeMessageParser.findAttachmentByCid(id)) {
            // It is inline attachment with Content ID
            break;
        }
    }
    // If not found - it is file attachment without content ID
}
person Andy    schedule 26.06.2020
comment
Спасибо Энди за ответ. В нашей ситуации, поскольку этот низкоуровневый код отлично работает для всех вложений, мы не будем менять наш код. Но я помню, как перепробовал все, что было в электронной почте Apache Commons, и не нашел решения. Я надеюсь, что появится кто-то новый и сможет попробовать ваш код и прокомментировать, если он работает. Хорошего дня. - person user1567291; 02.07.2020

Ответ заключается в том, что Apache Commons Email не может этого сделать. Вы должны перейти на более низкий уровень и закодировать старомодные классы MimeMessage и MultiPart в JDK, чтобы сделать эти различия.

Итак, из mimeMessageParser.getAttachmentList(); Звоните, теперь у нас есть

        if (mimeMessageParser.hasAttachments()) {
            final Multipart mp = (Multipart) message.getContent();
            if (mp != null) {
                List<DataSource> attachments = extractAttachment(mp);
                for (DataSource dataSource : attachments) {
                    saveAttachment(dataSource, subjectLineProperties, documentToUpload, firstHeaders);
                }
            }
        }


private static List<DataSource> extractAttachment(Multipart multipart) {
    List<DataSource> attachments = new ArrayList<>();
    try {

        for (int i = 0; i < multipart.getCount(); i++) {
            BodyPart bodyPart = multipart.getBodyPart(i);

            if (bodyPart.getContent() instanceof Multipart) {
                // part-within-a-part, do some recursion...
                extractAttachment((Multipart) bodyPart.getContent());
            }

            System.out.println("bodyPart.getDisposition(): " + bodyPart.getDisposition());
            if (!Part.ATTACHMENT.equalsIgnoreCase(bodyPart.getDisposition())) {
                continue; // dealing with attachments only
            }

            InputStream is = bodyPart.getInputStream();
            String fileName = bodyPart.getFileName();
            String contentType = bodyPart.getContentType();
            ByteArrayDataSource dataSource = new ByteArrayDataSource(is, contentType);
            dataSource.setName(fileName);
            attachments.add(dataSource);
        }
    } catch (IOException | MessagingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return attachments;
}
person user1567291    schedule 21.09.2018