Skip to content

Commit

Permalink
#179: Convert all embedded / INLINE resources to ATTACHMENT resources…
Browse files Browse the repository at this point in the history
… if the cid does not occur in the HTML
  • Loading branch information
Benny Bottema committed Nov 7, 2018
1 parent 421853b commit 65a0c49
Showing 1 changed file with 17 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,12 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.TreeMap;

import static java.lang.String.format;
import static org.simplejavamail.internal.util.MiscUtil.extractCID;
import static org.simplejavamail.internal.util.MiscUtil.valueNullOrEmpty;

/**
Expand Down Expand Up @@ -120,9 +121,10 @@ public static ParsedMimeMessageComponents parseMimeMessage(@Nonnull final MimeMe
parsedComponents.fromAddress = parseFromAddress(mimeMessage);
parsedComponents.replyToAddresses = parseReplyToAddresses(mimeMessage);
parseMimePartTree(mimeMessage, parsedComponents);
moveInvalidEmbeddedResourcesToAttachments(parsedComponents);
return parsedComponents;
}

private static void parseMimePartTree(@Nonnull final MimePart currentPart, @Nonnull final ParsedMimeMessageComponents parsedComponents) {
for (final Header header : retrieveAllHeaders(currentPart)) {
parseHeader(header, parsedComponents);
Expand All @@ -144,10 +146,10 @@ private static void parseMimePartTree(@Nonnull final MimePart currentPart, @Nonn
}
} else {
final DataSource ds = createDataSource(currentPart);
// If the diposition is not provided, the part should be treated as attachment
if (disposition == null || Part.ATTACHMENT.equalsIgnoreCase(disposition)) {
// 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(parseResourceName(parseContentID(currentPart), parseFileName(currentPart)), ds);
} else if (Part.INLINE.equalsIgnoreCase(disposition)) {
} else if (disposition == null || Part.INLINE.equalsIgnoreCase(disposition)) {
if (parseContentID(currentPart) != null) {
parsedComponents.cidMap.put(parseContentID(currentPart), ds);
} else {
Expand Down Expand Up @@ -482,6 +484,16 @@ public static String parseMessageId(@Nonnull final MimeMessage mimeMessage) {
throw new MimeMessageParseException(MimeMessageParseException.ERROR_GETTING_MESSAGE_ID, e);
}
}

private static void moveInvalidEmbeddedResourcesToAttachments(ParsedMimeMessageComponents parsedComponents) {
final String htmlContent = parsedComponents.htmlContent.toString();
for (Map.Entry<String, DataSource> cidEntry : parsedComponents.cidMap.entrySet()) {
if (!htmlContent.contains("cid:" + extractCID(cidEntry.getKey()))) {
parsedComponents.attachmentList.put(cidEntry.getKey(), cidEntry.getValue());
parsedComponents.cidMap.remove(cidEntry.getKey());
}
}
}

public static class ParsedMimeMessageComponents {
private final Map<String, DataSource> attachmentList = new TreeMap<>();
Expand Down

0 comments on commit 65a0c49

Please sign in to comment.