Skip to content

Commit 512ccbb

Browse files
committed
Fixed resource name resolution bug (if there is a proper file name it was ignored in favor of the provided resource name)
1 parent b9bf9d1 commit 512ccbb

File tree

2 files changed

+100
-10
lines changed

2 files changed

+100
-10
lines changed

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

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -268,13 +268,9 @@ private static String parseResourceNameOrUnnamed(@Nullable final String possible
268268

269269
@NotNull
270270
private static String parseResourceName(@Nullable String possibleWrappedContentID, @NotNull String fileName) {
271-
if (!valueNullOrEmpty(possibleWrappedContentID)) {
271+
if (valueNullOrEmpty(fileName) && !valueNullOrEmpty(possibleWrappedContentID)) {
272272
// https://regex101.com/r/46ulb2/1
273-
String unwrappedContentID = possibleWrappedContentID.replaceAll("^<?(.*?)>?$", "$1");
274-
String extension = (!valueNullOrEmpty(fileName) && fileName.contains("."))
275-
? fileName.substring(fileName.lastIndexOf("."))
276-
: "";
277-
return (unwrappedContentID.endsWith(extension)) ? unwrappedContentID : unwrappedContentID + extension;
273+
return possibleWrappedContentID.replaceAll("^<?(.*?)>?$", "$1");
278274
} else {
279275
return fileName;
280276
}
@@ -513,7 +509,7 @@ public static Date parseSentDate(@NotNull final MimeMessage mimeMessage) {
513509

514510
static void moveInvalidEmbeddedResourcesToAttachments(ParsedMimeMessageComponents parsedComponents) {
515511
final String htmlContent = parsedComponents.htmlContent.toString();
516-
for(Iterator<Map.Entry<String, DataSource>> it = parsedComponents.cidMap.entrySet().iterator(); it.hasNext(); ) {
512+
for (Iterator<Map.Entry<String, DataSource>> it = parsedComponents.cidMap.entrySet().iterator(); it.hasNext(); ) {
517513
Map.Entry<String, DataSource> cidEntry = it.next();
518514
String cid = extractCID(cidEntry.getKey());
519515
if (!htmlContent.contains("cid:" + cid)) {

modules/simple-java-mail/src/test/java/org/simplejavamail/converter/internal/mimemessage/MimeMessageParserTest.java

Lines changed: 97 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,123 @@
11
package org.simplejavamail.converter.internal.mimemessage;
22

33
import org.assertj.core.api.ThrowableAssert;
4+
import org.jetbrains.annotations.Nullable;
5+
import org.junit.Before;
46
import org.junit.Test;
7+
import org.simplejavamail.api.email.AttachmentResource;
58
import org.simplejavamail.api.email.Email;
69
import org.simplejavamail.api.email.EmailAssert;
710
import org.simplejavamail.api.email.Recipient;
811
import org.simplejavamail.converter.EmailConverter;
912
import org.simplejavamail.converter.internal.mimemessage.MimeMessageParser.ParsedMimeMessageComponents;
1013
import org.simplejavamail.email.EmailBuilder;
14+
import org.simplejavamail.internal.util.NamedDataSource;
1115
import testutil.ConfigLoaderTestHelper;
16+
import testutil.EmailHelper;
1217

13-
import org.jetbrains.annotations.Nullable;
14-
import javax.mail.internet.AddressException;
18+
import javax.activation.DataHandler;
19+
import javax.mail.BodyPart;
20+
import javax.mail.MessagingException;
21+
import javax.mail.Part;
22+
import javax.mail.Session;
1523
import javax.mail.internet.InternetAddress;
24+
import javax.mail.internet.MimeBodyPart;
25+
import javax.mail.internet.MimeMessage;
26+
import javax.mail.internet.MimeMultipart;
27+
import javax.mail.internet.ParameterList;
1628
import javax.mail.util.ByteArrayDataSource;
1729
import java.io.IOException;
1830
import java.io.UnsupportedEncodingException;
31+
import java.util.Calendar;
32+
import java.util.Date;
33+
import java.util.GregorianCalendar;
34+
import java.util.Properties;
1935

36+
import static java.lang.String.format;
2037
import static javax.mail.Message.RecipientType.TO;
2138
import static org.assertj.core.api.Assertions.assertThat;
2239
import static org.assertj.core.api.Assertions.assertThatThrownBy;
2340
import static org.simplejavamail.converter.internal.mimemessage.MimeMessageParser.moveInvalidEmbeddedResourcesToAttachments;
2441

2542
public class MimeMessageParserTest {
2643

44+
@Before
45+
public void setup() {
46+
ConfigLoaderTestHelper.clearConfigProperties();
47+
}
48+
49+
@Test
50+
public void testBasicParsing()
51+
throws IOException {
52+
Email originalEmail = EmailHelper.createDummyEmailBuilder(true, true, false, true, false).buildEmail();
53+
54+
MimeMessage mimeMessage = EmailConverter.emailToMimeMessage(originalEmail);
55+
ParsedMimeMessageComponents mimeMessageParts = MimeMessageParser.parseMimeMessage(mimeMessage);
56+
57+
assertThat(mimeMessageParts.getMessageId()).isNull();
58+
59+
assertThat(mimeMessageParts.getFromAddress().getPersonal()).isEqualTo(originalEmail.getFromRecipient().getName());
60+
assertThat(mimeMessageParts.getFromAddress().getAddress()).isEqualTo(originalEmail.getFromRecipient().getAddress());
61+
assertThat(mimeMessageParts.getReplyToAddresses().getPersonal()).isEqualTo(originalEmail.getFromRecipient().getName());
62+
assertThat(mimeMessageParts.getReplyToAddresses().getAddress()).isEqualTo(originalEmail.getFromRecipient().getAddress());
63+
64+
GregorianCalendar receiveWindowStart = new GregorianCalendar();
65+
receiveWindowStart.add(Calendar.SECOND, -5);
66+
assertThat(mimeMessageParts.getSentDate()).isBetween(receiveWindowStart.getTime(), new Date());
67+
68+
assertThat(mimeMessageParts.getCidMap()).containsOnlyKeys("<thumbsup>");
69+
assertThat(mimeMessageParts.getAttachmentList()).containsOnlyKeys("dresscode.txt", "location.txt");
70+
}
71+
72+
@Test
73+
public void testAttachmentNameResolution()
74+
throws MessagingException, IOException {
75+
MimeMessage mimeMessage = produceMimeMessageWithNamingIssue();
76+
ParsedMimeMessageComponents components = MimeMessageParser.parseMimeMessage(mimeMessage);
77+
78+
assertThat(components.getHtmlContent()).isNull();
79+
assertThat(components.getPlainContent()).isEqualTo("body text");
80+
assertThat(components.getCidMap()).isEmpty();
81+
assertThat(components.getAttachmentList()).containsOnlyKeys("proper-name.txt");
82+
}
83+
84+
private MimeMessage produceMimeMessageWithNamingIssue()
85+
throws MessagingException, IOException {
86+
MimeMessage m = new MimeMessage(Session.getDefaultInstance(new Properties()));
87+
MimeMultipart multipartRootMixed = new MimeMultipart("mixed");
88+
89+
// content
90+
final MimeBodyPart messagePart = new MimeBodyPart();
91+
messagePart.setText("body text", "UTF-8");
92+
multipartRootMixed.addBodyPart(messagePart);
93+
94+
// attachments
95+
final AttachmentResource r = new AttachmentResource("wrong-name.txt", new ByteArrayDataSource("Black Tie Optional", "text/plain"));
96+
multipartRootMixed.addBodyPart(getBodyPartFromDatasource(r, Part.ATTACHMENT));
97+
98+
m.setContent(multipartRootMixed);
99+
100+
return m;
101+
}
102+
103+
private static BodyPart getBodyPartFromDatasource(final AttachmentResource attachmentResource, final String dispositionType)
104+
throws MessagingException {
105+
final BodyPart attachmentPart = new MimeBodyPart();
106+
// setting headers isn't working nicely using the javax mail API, so let's do that manually
107+
final String resourceName = "htgfiytityf.txt";
108+
final String fileName = "proper-name.txt";
109+
attachmentPart.setDataHandler(new DataHandler(new NamedDataSource(fileName, attachmentResource.getDataSource())));
110+
attachmentPart.setFileName(fileName);
111+
final String contentType = attachmentResource.getDataSource().getContentType();
112+
ParameterList pl = new ParameterList();
113+
pl.set("filename", fileName);
114+
pl.set("name", fileName);
115+
attachmentPart.setHeader("Content-Type", contentType + pl.toString());
116+
attachmentPart.setHeader("Content-ID", format("<%s>", resourceName));
117+
attachmentPart.setDisposition(dispositionType);
118+
return attachmentPart;
119+
}
120+
27121
@Test
28122
public void testMoveInvalidEmbeddedResourcesToAttachments_NoHtmlNoInvalid() throws IOException {
29123
ParsedMimeMessageComponents parsedComponents = new ParsedMimeMessageComponents();
@@ -79,7 +173,7 @@ public void testCreateAddress() throws UnsupportedEncodingException {
79173
// next one is unparsable by InternetAddress#parse(), so it should be taken as is
80174
assertThatThrownBy(new ThrowableAssert.ThrowingCallable() {
81175
@Override
82-
public void call() throws Throwable {
176+
public void call() {
83177
interpretRecipient(" \" m oo \" [email protected] ");
84178
}
85179
})

0 commit comments

Comments
 (0)