Skip to content

Commit 7ff414a

Browse files
authored
Merge pull request #346 from drencrom/develop
Add option to parse MimeMessage without loading attachment data
2 parents deb937b + 87c5e8a commit 7ff414a

File tree

2 files changed

+46
-14
lines changed

2 files changed

+46
-14
lines changed

modules/simple-java-mail/src/main/java/org/simplejavamail/converter/EmailConverter.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,14 @@ public static Email mimeMessageToEmail(@NotNull final MimeMessage mimeMessage, @
8080
return mimeMessageToEmailBuilder(mimeMessage, pkcs12Config).buildEmail();
8181
}
8282

83+
/**
84+
* Delegates to {@link #mimeMessageToEmailBuilder(MimeMessage, Pkcs12Config, boolean)}.
85+
*/
86+
@NotNull
87+
public static Email mimeMessageToEmail(@NotNull final MimeMessage mimeMessage, @Nullable final Pkcs12Config pkcs12Config, boolean attachmentData) {
88+
return mimeMessageToEmailBuilder(mimeMessage, pkcs12Config, attachmentData).buildEmail();
89+
}
90+
8391
/**
8492
* Delegates to {@link #mimeMessageToEmailBuilder(MimeMessage, Pkcs12Config)}.
8593
*/
@@ -88,16 +96,26 @@ public static EmailPopulatingBuilder mimeMessageToEmailBuilder(@NotNull final Mi
8896
return mimeMessageToEmailBuilder(mimeMessage, null);
8997
}
9098

99+
/**
100+
* Delegates to {@link #mimeMessageToEmailBuilder(MimeMessage, Pkcs12Config, boolean)}.
101+
*/
102+
@NotNull
103+
public static EmailPopulatingBuilder mimeMessageToEmailBuilder(@NotNull final MimeMessage mimeMessage, @Nullable final Pkcs12Config pkcs12Config) {
104+
return mimeMessageToEmailBuilder(mimeMessage, pkcs12Config, true);
105+
}
106+
91107
/**
92108
* @param mimeMessage The MimeMessage from which to create the {@link Email}.
93109
* @param pkcs12Config Private key store for decrypting S/MIME encrypted attachments
94110
* (only needed when the message is encrypted rather than just signed).
111+
* @param attachmentData When false only the names of the attachments are retrieved but no data
95112
*/
96113
@NotNull
97-
public static EmailPopulatingBuilder mimeMessageToEmailBuilder(@NotNull final MimeMessage mimeMessage, @Nullable final Pkcs12Config pkcs12Config) {
114+
public static EmailPopulatingBuilder mimeMessageToEmailBuilder(@NotNull final MimeMessage mimeMessage, @Nullable final Pkcs12Config pkcs12Config,
115+
boolean attachmentData) {
98116
checkNonEmptyArgument(mimeMessage, "mimeMessage");
99117
final EmailPopulatingBuilder builder = EmailBuilder.ignoringDefaults().startingBlank();
100-
final ParsedMimeMessageComponents parsed = MimeMessageParser.parseMimeMessage(mimeMessage);
118+
final ParsedMimeMessageComponents parsed = MimeMessageParser.parseMimeMessage(mimeMessage, attachmentData);
101119
return decryptAttachments(buildEmailFromMimeMessage(builder, parsed), mimeMessage, pkcs12Config);
102120
}
103121

modules/simple-java-mail/src/main/java/org/simplejavamail/converter/internal/mimemessage/MimeMessageParser.java

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,16 @@ public final class MimeMessageParser {
115115
}
116116

117117
/**
118-
* Extracts the content of a MimeMessage recursively.
118+
* Delegates to {@link #parseMimeMessage(MimeMessage, boolean)}.
119119
*/
120120
public static ParsedMimeMessageComponents parseMimeMessage(@NotNull final MimeMessage mimeMessage) {
121+
return parseMimeMessage(mimeMessage, true);
122+
}
123+
124+
/**
125+
* Extracts the content of a MimeMessage recursively.
126+
*/
127+
public static ParsedMimeMessageComponents parseMimeMessage(@NotNull final MimeMessage mimeMessage, boolean attachmentData) {
121128
final ParsedMimeMessageComponents parsedComponents = new ParsedMimeMessageComponents();
122129
parsedComponents.messageId = parseMessageId(mimeMessage);
123130
parsedComponents.sentDate = parseSentDate(mimeMessage);
@@ -127,12 +134,13 @@ public static ParsedMimeMessageComponents parseMimeMessage(@NotNull final MimeMe
127134
parsedComponents.bccAddresses.addAll(parseBccAddresses(mimeMessage));
128135
parsedComponents.fromAddress = parseFromAddress(mimeMessage);
129136
parsedComponents.replyToAddresses = parseReplyToAddresses(mimeMessage);
130-
parseMimePartTree(mimeMessage, parsedComponents);
137+
parseMimePartTree(mimeMessage, parsedComponents, attachmentData);
131138
moveInvalidEmbeddedResourcesToAttachments(parsedComponents);
132139
return parsedComponents;
133140
}
134141

135-
private static void parseMimePartTree(@NotNull final MimePart currentPart, @NotNull final ParsedMimeMessageComponents parsedComponents) {
142+
private static void parseMimePartTree(@NotNull final MimePart currentPart, @NotNull final ParsedMimeMessageComponents parsedComponents,
143+
boolean attachmentData) {
136144
for (final Header header : retrieveAllHeaders(currentPart)) {
137145
parseHeader(header, parsedComponents);
138146
}
@@ -149,10 +157,10 @@ private static void parseMimePartTree(@NotNull final MimePart currentPart, @NotN
149157
} else if (isMimeType(currentPart, "multipart/*")) {
150158
final Multipart mp = parseContent(currentPart);
151159
for (int i = 0, count = countBodyParts(mp); i < count; i++) {
152-
parseMimePartTree(getBodyPartAtIndex(mp, i), parsedComponents);
160+
parseMimePartTree(getBodyPartAtIndex(mp, i), parsedComponents, attachmentData);
153161
}
154162
} else {
155-
final DataSource ds = createDataSource(currentPart);
163+
final DataSource ds = createDataSource(currentPart, attachmentData);
156164
// if the diposition is not provided, for now the part should be treated as inline (later non-embedded inline attachments are moved)
157165
if (Part.ATTACHMENT.equalsIgnoreCase(disposition)) {
158166
parsedComponents.attachmentList.add(new SimpleEntry<>(parseResourceNameOrUnnamed(parseContentID(currentPart), parseFileName(currentPart)), ds));
@@ -373,16 +381,22 @@ public static DataHandler retrieveDataHandler(@NotNull final MimePart part) {
373381
* @return the DataSource
374382
*/
375383
@NotNull
376-
private static DataSource createDataSource(@NotNull final MimePart part) {
384+
private static DataSource createDataSource(@NotNull final MimePart part, boolean attachmentData) {
377385
final DataHandler dataHandler = retrieveDataHandler(part);
378386
final DataSource dataSource = dataHandler.getDataSource();
379-
final String contentType = parseBaseMimeType(dataSource.getContentType());
380-
final byte[] content = readContent(retrieveInputStream(dataSource));
381-
final ByteArrayDataSource result = new ByteArrayDataSource(content, contentType);
382-
final String dataSourceName = parseDataSourceName(part, dataSource);
383387

384-
result.setName(dataSourceName);
385-
return result;
388+
if (attachmentData) {
389+
final String contentType = parseBaseMimeType(dataSource.getContentType());
390+
final byte[] content = readContent(retrieveInputStream(dataSource));
391+
final ByteArrayDataSource result = new ByteArrayDataSource(content, contentType);
392+
final String dataSourceName = parseDataSourceName(part, dataSource);
393+
394+
result.setName(dataSourceName);
395+
return result;
396+
}
397+
else {
398+
return dataSource;
399+
}
386400
}
387401

388402
@SuppressWarnings("WeakerAccess")

0 commit comments

Comments
 (0)