Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,14 @@ public static Email mimeMessageToEmail(@NotNull final MimeMessage mimeMessage, @
return mimeMessageToEmailBuilder(mimeMessage, pkcs12Config).buildEmail();
}

/**
* Delegates to {@link #mimeMessageToEmailBuilder(MimeMessage, Pkcs12Config, boolean)}.
*/
@NotNull
public static Email mimeMessageToEmail(@NotNull final MimeMessage mimeMessage, @Nullable final Pkcs12Config pkcs12Config, boolean attachmentData) {
return mimeMessageToEmailBuilder(mimeMessage, pkcs12Config, attachmentData).buildEmail();
}

/**
* Delegates to {@link #mimeMessageToEmailBuilder(MimeMessage, Pkcs12Config)}.
*/
Expand All @@ -93,16 +101,26 @@ public static EmailPopulatingBuilder mimeMessageToEmailBuilder(@NotNull final Mi
return mimeMessageToEmailBuilder(mimeMessage, null);
}

/**
* Delegates to {@link #mimeMessageToEmailBuilder(MimeMessage, Pkcs12Config, boolean)}.
*/
@NotNull
public static EmailPopulatingBuilder mimeMessageToEmailBuilder(@NotNull final MimeMessage mimeMessage, @Nullable final Pkcs12Config pkcs12Config) {
return mimeMessageToEmailBuilder(mimeMessage, pkcs12Config, true);
}

/**
* @param mimeMessage The MimeMessage from which to create the {@link Email}.
* @param pkcs12Config Private key store for decrypting S/MIME encrypted attachments
* (only needed when the message is encrypted rather than just signed).
* @param attachmentData When false only the names of the attachments are retrieved but no data
*/
@NotNull
public static EmailPopulatingBuilder mimeMessageToEmailBuilder(@NotNull final MimeMessage mimeMessage, @Nullable final Pkcs12Config pkcs12Config) {
public static EmailPopulatingBuilder mimeMessageToEmailBuilder(@NotNull final MimeMessage mimeMessage, @Nullable final Pkcs12Config pkcs12Config,
boolean attachmentData) {
checkNonEmptyArgument(mimeMessage, "mimeMessage");
final EmailPopulatingBuilder builder = EmailBuilder.ignoringDefaults().startingBlank();
final ParsedMimeMessageComponents parsed = MimeMessageParser.parseMimeMessage(mimeMessage);
final ParsedMimeMessageComponents parsed = MimeMessageParser.parseMimeMessage(mimeMessage, attachmentData);
return decryptAttachments(buildEmailFromMimeMessage(builder, parsed), mimeMessage, pkcs12Config);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,9 +111,16 @@ public final class MimeMessageParser {
}

/**
* Extracts the content of a MimeMessage recursively.
* Delegates to {@link #parseMimeMessage(MimeMessage, boolean)}.
*/
public static ParsedMimeMessageComponents parseMimeMessage(@NotNull final MimeMessage mimeMessage) {
return parseMimeMessage(mimeMessage, true);
}

/**
* Extracts the content of a MimeMessage recursively.
*/
public static ParsedMimeMessageComponents parseMimeMessage(@NotNull final MimeMessage mimeMessage, boolean attachmentData) {
final ParsedMimeMessageComponents parsedComponents = new ParsedMimeMessageComponents();
parsedComponents.messageId = parseMessageId(mimeMessage);
parsedComponents.sentDate = parseSentDate(mimeMessage);
Expand All @@ -123,12 +130,13 @@ public static ParsedMimeMessageComponents parseMimeMessage(@NotNull final MimeMe
parsedComponents.bccAddresses.addAll(parseBccAddresses(mimeMessage));
parsedComponents.fromAddress = parseFromAddress(mimeMessage);
parsedComponents.replyToAddresses = parseReplyToAddresses(mimeMessage);
parseMimePartTree(mimeMessage, parsedComponents);
parseMimePartTree(mimeMessage, parsedComponents, attachmentData);
moveInvalidEmbeddedResourcesToAttachments(parsedComponents);
return parsedComponents;
}

private static void parseMimePartTree(@NotNull final MimePart currentPart, @NotNull final ParsedMimeMessageComponents parsedComponents) {
private static void parseMimePartTree(@NotNull final MimePart currentPart, @NotNull final ParsedMimeMessageComponents parsedComponents,
boolean attachmentData) {
for (final Header header : retrieveAllHeaders(currentPart)) {
parseHeader(header, parsedComponents);
}
Expand All @@ -147,10 +155,10 @@ private static void parseMimePartTree(@NotNull final MimePart currentPart, @NotN
} else if (isMimeType(currentPart, "multipart/*")) {
final Multipart mp = parseContent(currentPart);
for (int i = 0, count = countBodyParts(mp); i < count; i++) {
parseMimePartTree(getBodyPartAtIndex(mp, i), parsedComponents);
parseMimePartTree(getBodyPartAtIndex(mp, i), parsedComponents, attachmentData);
}
} else {
final DataSource ds = createDataSource(currentPart);
final DataSource ds = createDataSource(currentPart, attachmentData);
// if the diposition is not provided, for now the part should be treated as inline (later non-embedded inline attachments are moved)
if (Part.ATTACHMENT.equalsIgnoreCase(disposition)) {
parsedComponents.attachmentList.put(parseResourceNameOrUnnamed(parseContentID(currentPart), parseFileName(currentPart)), ds);
Expand Down Expand Up @@ -363,16 +371,22 @@ public static DataHandler retrieveDataHandler(@NotNull final MimePart part) {
* @return the DataSource
*/
@NotNull
private static DataSource createDataSource(@NotNull final MimePart part) {
private static DataSource createDataSource(@NotNull final MimePart part, boolean attachmentData) {
final DataHandler dataHandler = retrieveDataHandler(part);
final DataSource dataSource = dataHandler.getDataSource();
final String contentType = parseBaseMimeType(dataSource.getContentType());
final byte[] content = readContent(retrieveInputStream(dataSource));
final ByteArrayDataSource result = new ByteArrayDataSource(content, contentType);
final String dataSourceName = parseDataSourceName(part, dataSource);

result.setName(dataSourceName);
return result;
if (attachmentData) {
final String contentType = parseBaseMimeType(dataSource.getContentType());
final byte[] content = readContent(retrieveInputStream(dataSource));
final ByteArrayDataSource result = new ByteArrayDataSource(content, contentType);
final String dataSourceName = parseDataSourceName(part, dataSource);

result.setName(dataSourceName);
return result;
}
else {
return dataSource;
}
}

@SuppressWarnings("WeakerAccess")
Expand Down