Skip to content

Commit 87c5e8a

Browse files
committed
Add option to parse MimeMessage without loading attachment data
1 parent 122293a commit 87c5e8a

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
@@ -85,6 +85,14 @@ public static Email mimeMessageToEmail(@NotNull final MimeMessage mimeMessage, @
8585
return mimeMessageToEmailBuilder(mimeMessage, pkcs12Config).buildEmail();
8686
}
8787

88+
/**
89+
* Delegates to {@link #mimeMessageToEmailBuilder(MimeMessage, Pkcs12Config, boolean)}.
90+
*/
91+
@NotNull
92+
public static Email mimeMessageToEmail(@NotNull final MimeMessage mimeMessage, @Nullable final Pkcs12Config pkcs12Config, boolean attachmentData) {
93+
return mimeMessageToEmailBuilder(mimeMessage, pkcs12Config, attachmentData).buildEmail();
94+
}
95+
8896
/**
8997
* Delegates to {@link #mimeMessageToEmailBuilder(MimeMessage, Pkcs12Config)}.
9098
*/
@@ -93,16 +101,26 @@ public static EmailPopulatingBuilder mimeMessageToEmailBuilder(@NotNull final Mi
93101
return mimeMessageToEmailBuilder(mimeMessage, null);
94102
}
95103

104+
/**
105+
* Delegates to {@link #mimeMessageToEmailBuilder(MimeMessage, Pkcs12Config, boolean)}.
106+
*/
107+
@NotNull
108+
public static EmailPopulatingBuilder mimeMessageToEmailBuilder(@NotNull final MimeMessage mimeMessage, @Nullable final Pkcs12Config pkcs12Config) {
109+
return mimeMessageToEmailBuilder(mimeMessage, pkcs12Config, true);
110+
}
111+
96112
/**
97113
* @param mimeMessage The MimeMessage from which to create the {@link Email}.
98114
* @param pkcs12Config Private key store for decrypting S/MIME encrypted attachments
99115
* (only needed when the message is encrypted rather than just signed).
116+
* @param attachmentData When false only the names of the attachments are retrieved but no data
100117
*/
101118
@NotNull
102-
public static EmailPopulatingBuilder mimeMessageToEmailBuilder(@NotNull final MimeMessage mimeMessage, @Nullable final Pkcs12Config pkcs12Config) {
119+
public static EmailPopulatingBuilder mimeMessageToEmailBuilder(@NotNull final MimeMessage mimeMessage, @Nullable final Pkcs12Config pkcs12Config,
120+
boolean attachmentData) {
103121
checkNonEmptyArgument(mimeMessage, "mimeMessage");
104122
final EmailPopulatingBuilder builder = EmailBuilder.ignoringDefaults().startingBlank();
105-
final ParsedMimeMessageComponents parsed = MimeMessageParser.parseMimeMessage(mimeMessage);
123+
final ParsedMimeMessageComponents parsed = MimeMessageParser.parseMimeMessage(mimeMessage, attachmentData);
106124
return decryptAttachments(buildEmailFromMimeMessage(builder, parsed), mimeMessage, pkcs12Config);
107125
}
108126

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
@@ -111,9 +111,16 @@ public final class MimeMessageParser {
111111
}
112112

113113
/**
114-
* Extracts the content of a MimeMessage recursively.
114+
* Delegates to {@link #parseMimeMessage(MimeMessage, boolean)}.
115115
*/
116116
public static ParsedMimeMessageComponents parseMimeMessage(@NotNull final MimeMessage mimeMessage) {
117+
return parseMimeMessage(mimeMessage, true);
118+
}
119+
120+
/**
121+
* Extracts the content of a MimeMessage recursively.
122+
*/
123+
public static ParsedMimeMessageComponents parseMimeMessage(@NotNull final MimeMessage mimeMessage, boolean attachmentData) {
117124
final ParsedMimeMessageComponents parsedComponents = new ParsedMimeMessageComponents();
118125
parsedComponents.messageId = parseMessageId(mimeMessage);
119126
parsedComponents.sentDate = parseSentDate(mimeMessage);
@@ -123,12 +130,13 @@ public static ParsedMimeMessageComponents parseMimeMessage(@NotNull final MimeMe
123130
parsedComponents.bccAddresses.addAll(parseBccAddresses(mimeMessage));
124131
parsedComponents.fromAddress = parseFromAddress(mimeMessage);
125132
parsedComponents.replyToAddresses = parseReplyToAddresses(mimeMessage);
126-
parseMimePartTree(mimeMessage, parsedComponents);
133+
parseMimePartTree(mimeMessage, parsedComponents, attachmentData);
127134
moveInvalidEmbeddedResourcesToAttachments(parsedComponents);
128135
return parsedComponents;
129136
}
130137

131-
private static void parseMimePartTree(@NotNull final MimePart currentPart, @NotNull final ParsedMimeMessageComponents parsedComponents) {
138+
private static void parseMimePartTree(@NotNull final MimePart currentPart, @NotNull final ParsedMimeMessageComponents parsedComponents,
139+
boolean attachmentData) {
132140
for (final Header header : retrieveAllHeaders(currentPart)) {
133141
parseHeader(header, parsedComponents);
134142
}
@@ -147,10 +155,10 @@ private static void parseMimePartTree(@NotNull final MimePart currentPart, @NotN
147155
} else if (isMimeType(currentPart, "multipart/*")) {
148156
final Multipart mp = parseContent(currentPart);
149157
for (int i = 0, count = countBodyParts(mp); i < count; i++) {
150-
parseMimePartTree(getBodyPartAtIndex(mp, i), parsedComponents);
158+
parseMimePartTree(getBodyPartAtIndex(mp, i), parsedComponents, attachmentData);
151159
}
152160
} else {
153-
final DataSource ds = createDataSource(currentPart);
161+
final DataSource ds = createDataSource(currentPart, attachmentData);
154162
// if the diposition is not provided, for now the part should be treated as inline (later non-embedded inline attachments are moved)
155163
if (Part.ATTACHMENT.equalsIgnoreCase(disposition)) {
156164
parsedComponents.attachmentList.put(parseResourceNameOrUnnamed(parseContentID(currentPart), parseFileName(currentPart)), ds);
@@ -363,16 +371,22 @@ public static DataHandler retrieveDataHandler(@NotNull final MimePart part) {
363371
* @return the DataSource
364372
*/
365373
@NotNull
366-
private static DataSource createDataSource(@NotNull final MimePart part) {
374+
private static DataSource createDataSource(@NotNull final MimePart part, boolean attachmentData) {
367375
final DataHandler dataHandler = retrieveDataHandler(part);
368376
final DataSource dataSource = dataHandler.getDataSource();
369-
final String contentType = parseBaseMimeType(dataSource.getContentType());
370-
final byte[] content = readContent(retrieveInputStream(dataSource));
371-
final ByteArrayDataSource result = new ByteArrayDataSource(content, contentType);
372-
final String dataSourceName = parseDataSourceName(part, dataSource);
373377

374-
result.setName(dataSourceName);
375-
return result;
378+
if (attachmentData) {
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);
383+
384+
result.setName(dataSourceName);
385+
return result;
386+
}
387+
else {
388+
return dataSource;
389+
}
376390
}
377391

378392
@SuppressWarnings("WeakerAccess")

0 commit comments

Comments
 (0)