Skip to content

Commit 9e739cd

Browse files
committed
bbottema#241: distinguish properly between TO, CC and BCC recipients when converting from Outlook messages
1 parent 1856f47 commit 9e739cd

File tree

5 files changed

+63
-17
lines changed

5 files changed

+63
-17
lines changed

angular-app

modules/outlook-module/src/main/java/org/simplejavamail/internal/outlooksupport/converter/OutlookEmailConverter.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.simplejavamail.api.email.EmailPopulatingBuilder;
44
import org.simplejavamail.api.email.EmailStartingBuilder;
5+
import org.simplejavamail.api.email.Recipient;
56
import org.simplejavamail.api.internal.outlooksupport.model.EmailFromOutlookMessage;
67
import org.simplejavamail.internal.modules.OutlookModule;
78
import org.simplejavamail.internal.outlooksupport.internal.model.OutlookMessageProxy;
@@ -15,6 +16,7 @@
1516
import java.io.IOException;
1617
import java.io.InputStream;
1718
import java.util.Map;
19+
import java.util.Objects;
1820

1921
import static org.simplejavamail.internal.util.MiscUtil.extractCID;
2022
import static org.simplejavamail.internal.util.Preconditions.assumeNonNull;
@@ -75,16 +77,24 @@ private static EmailFromOutlookMessage buildEmailFromOutlookMessage(
7577
}
7678

7779
private static void copyReceiversFromOutlookMessage(@NotNull EmailPopulatingBuilder builder, @NotNull OutlookMessage outlookMessage) {
78-
for (final OutlookRecipient to : outlookMessage.getRecipients()) {
79-
builder.to(to.getName(), to.getAddress());
80-
}
8180
//noinspection QuestionableName
8281
for (final OutlookRecipient cc : outlookMessage.getCcRecipients()) {
8382
builder.cc(cc.getName(), cc.getAddress());
8483
}
8584
for (final OutlookRecipient bcc : outlookMessage.getBccRecipients()) {
8685
builder.bcc(bcc.getName(), bcc.getAddress());
8786
}
87+
// only add remaining recipients...
88+
outerloop:
89+
for (final OutlookRecipient to : outlookMessage.getRecipients()) {
90+
for (final Recipient recipient : builder.getRecipients()) {
91+
if (Objects.equals(recipient.getName(), to.getName()) &&
92+
Objects.equals(recipient.getAddress(), to.getAddress())) {
93+
continue outerloop;
94+
}
95+
}
96+
builder.to(to.getName(), to.getAddress());
97+
}
8898
}
8999

90100
@NotNull

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

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -107,24 +107,24 @@ public static EmailPopulatingBuilder mimeMessageToEmailBuilder(@NotNull final Mi
107107
/**
108108
* Delegates to {@link #outlookMsgToEmail(String, Pkcs12Config)}.
109109
*
110-
* @param msgFile The content of an Outlook (.msg) message from which to create the {@link Email}.
110+
* @param msgData The content of an Outlook (.msg) message from which to create the {@link Email}.
111111
*/
112112
@SuppressWarnings("unused")
113113
@NotNull
114-
public static Email outlookMsgToEmail(@NotNull final String msgFile) {
115-
return outlookMsgToEmail(msgFile, null);
114+
public static Email outlookMsgToEmail(@NotNull final String msgData) {
115+
return outlookMsgToEmail(msgData, null);
116116
}
117117

118118
/**
119-
* @param msgFile The content of an Outlook (.msg) message from which to create the {@link Email}.
119+
* @param msgData The content of an Outlook (.msg) message from which to create the {@link Email}.
120120
* @param pkcs12Config Private key store for decrypting S/MIME encrypted attachments
121121
* (only needed when the message is encrypted rather than just signed).
122122
*/
123123
@SuppressWarnings("deprecation")
124124
@NotNull
125-
public static Email outlookMsgToEmail(@NotNull final String msgFile, @Nullable final Pkcs12Config pkcs12Config) {
126-
checkNonEmptyArgument(msgFile, "msgFile");
127-
EmailFromOutlookMessage result = ModuleLoader.loadOutlookModule().outlookMsgToEmailBuilder(msgFile, new EmailStartingBuilderImpl());
125+
public static Email outlookMsgToEmail(@NotNull final String msgData, @Nullable final Pkcs12Config pkcs12Config) {
126+
checkNonEmptyArgument(msgData, "msgFile");
127+
EmailFromOutlookMessage result = ModuleLoader.loadOutlookModule().outlookMsgToEmailBuilder(msgData, new EmailStartingBuilderImpl());
128128
return decryptAttachments(result.getEmailBuilder(), result.getOutlookMessage(), pkcs12Config)
129129
.buildEmail();
130130
}
@@ -372,9 +372,9 @@ public static MimeMessage outlookMsgToMimeMessage(@NotNull final String msgFile)
372372
* @return Result of {@link #outlookMsgToEmail(String, Pkcs12Config)} and {@link #emailToMimeMessage(Email)}.
373373
*/
374374
@NotNull
375-
public static MimeMessage outlookMsgToMimeMessage(@NotNull final String msgFile, @Nullable final Pkcs12Config pkcs12Config) {
376-
checkNonEmptyArgument(msgFile, "outlookMsgData");
377-
return emailToMimeMessage(outlookMsgToEmail(msgFile, pkcs12Config));
375+
public static MimeMessage outlookMsgToMimeMessage(@NotNull final String msgData, @Nullable final Pkcs12Config pkcs12Config) {
376+
checkNonEmptyArgument(msgData, "outlookMsgData");
377+
return emailToMimeMessage(outlookMsgToEmail(msgData, pkcs12Config));
378378
}
379379

380380
/**
@@ -535,9 +535,9 @@ public static String outlookMsgToEML(@NotNull final String msgFile) {
535535
* @return Result of {@link #outlookMsgToEmail(String, Pkcs12Config)} and {@link #emailToEML(Email)}
536536
*/
537537
@NotNull
538-
public static String outlookMsgToEML(@NotNull final String msgFile, @Nullable final Pkcs12Config pkcs12Config) {
539-
checkNonEmptyArgument(msgFile, "outlookMsgData");
540-
return emailToEML(outlookMsgToEmail(msgFile, pkcs12Config));
538+
public static String outlookMsgToEML(@NotNull final String msgData, @Nullable final Pkcs12Config pkcs12Config) {
539+
checkNonEmptyArgument(msgData, "outlookMsgData");
540+
return emailToEML(outlookMsgToEmail(msgData, pkcs12Config));
541541
}
542542

543543
/**
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package org.simplejavamail.converter;
2+
3+
import org.jetbrains.annotations.NotNull;
4+
import org.junit.Test;
5+
import org.simplejavamail.api.email.Email;
6+
import org.simplejavamail.api.email.EmailAssert;
7+
import org.simplejavamail.api.email.Recipient;
8+
9+
import java.io.File;
10+
11+
import static demo.ResourceFolderHelper.determineResourceFolder;
12+
import static javax.mail.Message.RecipientType.CC;
13+
import static javax.mail.Message.RecipientType.TO;
14+
import static org.assertj.core.api.Assertions.assertThat;
15+
import static org.simplejavamail.internal.util.MiscUtil.normalizeNewlines;
16+
17+
public class EmailConverterTest {
18+
19+
private static final String RESOURCE_FOLDER = determineResourceFolder("simple-java-mail") + "/test/resources/test-messages";
20+
21+
@Test
22+
public void testOutlookBasicConversions() {
23+
final Recipient elias = new Recipient("Elias Laugher", "[email protected]", null);
24+
final Recipient sven = new Recipient("Sven Sielenkemper", "[email protected]", TO);
25+
final Recipient niklas = new Recipient("[email protected]", "[email protected]", CC);
26+
27+
@NotNull Email msg = EmailConverter.outlookMsgToEmail(new File(RESOURCE_FOLDER + "/simple email with TO and CC.msg"));
28+
EmailAssert.assertThat(msg).hasFromRecipient(elias);
29+
EmailAssert.assertThat(msg).hasSubject("Test E-Mail");
30+
EmailAssert.assertThat(msg).hasOnlyRecipients(sven, niklas);
31+
EmailAssert.assertThat(msg).hasNoAttachments();
32+
assertThat(msg.getPlainText()).isNotEmpty();
33+
assertThat(normalizeNewlines(msg.getHTMLText())).isEqualTo("<div dir=\"auto\">Just a test to get an email with one cc recipient.</div>\n");
34+
assertThat(normalizeNewlines(msg.getPlainText())).isEqualTo("Just a test to get an email with one cc recipient.\n");
35+
}
36+
}
Binary file not shown.

0 commit comments

Comments
 (0)