Skip to content

Commit 21e5060

Browse files
Benny BottemaBenny Bottema
authored andcommitted
#227: make parsing recipients more lenient allows semicolons at the end of a list of one addresses
1 parent aa5f8c8 commit 21e5060

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

src/main/java/org/simplejavamail/converter/internal/mimemessage/MimeMessageParser.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.simplejavamail.converter.internal.mimemessage;
22

33
import org.simplejavamail.internal.util.NaturalEntryKeyComparator;
4+
import org.simplejavamail.internal.util.Preconditions;
45

56
import javax.activation.DataHandler;
67
import javax.activation.DataSource;
@@ -390,12 +391,26 @@ public static List<InternetAddress> parseBccAddresses(@Nonnull final MimeMessage
390391
@Nullable
391392
public static Address[] retrieveRecipients(@Nonnull final MimeMessage mimeMessage, final RecipientType recipientType) {
392393
try {
393-
return mimeMessage.getRecipients(recipientType);
394+
// return mimeMessage.getRecipients(recipientType); // can fail in strict mode, see https://github.com/bbottema/simple-java-mail/issues/227
395+
// workaround following (copied and modified from JavaMail internal code):
396+
String s = mimeMessage.getHeader(getHeaderName(mimeMessage, recipientType), ",");
397+
return (s == null) ? null : InternetAddress.parseHeader(s, false);
394398
} catch (final MessagingException e) {
395399
throw new MimeMessageParseException(format(MimeMessageParseException.ERROR_GETTING_RECIPIENTS, recipientType), e);
396400
}
397401
}
398402

403+
private static String getHeaderName(@Nonnull MimeMessage mimeMessage, RecipientType recipientType) throws MessagingException {
404+
if (recipientType == RecipientType.TO) {
405+
return "To";
406+
} else if (recipientType == RecipientType.CC) {
407+
return "Cc";
408+
} else {
409+
Preconditions.assumeTrue(recipientType == RecipientType.BCC, "invalid recipient type: " + recipientType);
410+
return "Bcc";
411+
}
412+
}
413+
399414
@Nonnull
400415
private static List<InternetAddress> parseInternetAddresses(@Nullable final Address[] recipients) {
401416
final List<Address> addresses = (recipients != null) ? Arrays.asList(recipients) : new ArrayList<Address>();

src/test/java/org/simplejavamail/converter/internal/mimemessage/MimeMessageParserTest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
package org.simplejavamail.converter.internal.mimemessage;
22

33
import org.junit.Test;
4+
import org.simplejavamail.converter.EmailConverter;
45
import org.simplejavamail.converter.internal.mimemessage.MimeMessageParser.ParsedMimeMessageComponents;
6+
import org.simplejavamail.email.Email;
7+
import org.simplejavamail.email.EmailAssert;
8+
import org.simplejavamail.email.EmailBuilder;
9+
import org.simplejavamail.email.Recipient;
10+
import testutil.ConfigLoaderTestHelper;
511

612
import javax.mail.util.ByteArrayDataSource;
713
import java.io.IOException;
814

15+
import static javax.mail.Message.RecipientType.TO;
916
import static org.assertj.core.api.Assertions.assertThat;
1017
import static org.simplejavamail.converter.internal.mimemessage.MimeMessageParser.moveInvalidEmbeddedResourcesToAttachments;
1118

@@ -44,4 +51,24 @@ public void testMoveInvalidEmbeddedResourcesToAttachments_Invalid() throws IOExc
4451
assertThat(parsedComponents.cidMap).containsOnlyKeys("moo1");
4552
assertThat(parsedComponents.attachmentList).extracting("key").containsOnly("moo2");
4653
}
54+
55+
@Test
56+
// https://github.com/bbottema/simple-java-mail/issues/227
57+
public void testSemiColonSeparatedToAddresses() {
58+
ConfigLoaderTestHelper.clearConfigProperties();
59+
60+
final Email initialEmail = EmailBuilder.startingBlank()
61+
.from("lollypop", "[email protected]")
62+
.to("C.Cane", "[email protected]")
63+
.withPlainText("We should meet up!")
64+
.buildEmail();
65+
66+
String corruptedEML = EmailConverter.emailToEML(initialEmail).replace(
67+
"To: \"C.Cane\" <[email protected]>",
68+
"To: \"C.Cane\" <[email protected]>;");
69+
70+
final Email fixedEmail = EmailConverter.emlToEmail(corruptedEML);
71+
72+
EmailAssert.assertThat(fixedEmail).hasOnlyRecipients(new Recipient("C.Cane", "[email protected]", TO));
73+
}
4774
}

0 commit comments

Comments
 (0)