Как получать и различать обычные и встроенные вложения в 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.
1 ответ
Ответ в том, что 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;
}
У меня сложилось впечатление, что есть обходной путь, не переходя на более низкий уровень... Но я еще не проверял его со всеми типами вложений - только с изображениями. Что-то вроде этого:
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
}