Skip to content

Extend examples some more #7

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -97,13 +97,27 @@ public MimeMultipartBuilder addBodyPartJsonLd(StructuredData structuredData) thr
return addBodyPartJsonLd(structuredData, "utf-8");
}

public MimeMultipartBuilder addBodyPartJsonLd(StructuredData structuredData, String jsonLdEncoding) throws MessagingException {
public MimeMultipartBuilder addBodyPartJsonLd(
StructuredData structuredData,
String jsonLdEncoding
) throws MessagingException {
return addBodyPartJsonLd(structuredData, jsonLdEncoding, null);
}

public MimeMultipartBuilder addBodyPartJsonLd(
StructuredData structuredData,
String jsonLdEncoding,
String disposition
) throws MessagingException {
if (structuredData == null) {
return this;
}
MimeBodyPart bodyPart = new MimeBodyPart();
String bodyPartType = StructuredData.MIME_TYPE + "; charset=" + jsonLdEncoding;
bodyPart.setContent(structuredData, bodyPartType);
if (disposition != null) {
bodyPart.setDisposition(disposition);
}
m.addBodyPart(bodyPart);
return this;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
public class MultipartAlternativeMessageBuilder extends AbstractMessageBuilder<MultipartAlternativeMessageBuilder> {
private MimeTextContent textBody;
private boolean htmlLast = true;
private String disposition;

public MultipartAlternativeMessageBuilder textBody(String textBody) {
if (textBody != null) {
Expand All @@ -21,6 +22,11 @@ public MultipartAlternativeMessageBuilder htmlLast(boolean htmlLast) {
return this;
}

public MultipartAlternativeMessageBuilder disposition(String disposition) {
this.disposition = disposition;
return this;
}

@Override
protected MultipartAlternativeMessageBuilder self() {
return this;
Expand All @@ -42,12 +48,12 @@ public StructuredMimeMessageWrapper build() throws MessagingException {
MimeMultipartBuilder multipartBuilder = new MimeMultipartBuilder(MimeMultipartBuilder.MULTIPART.ALTERNATIVE);
if (htmlLast) {
multipartBuilder.addBodyPartText(textBody);
multipartBuilder.addBodyPartJsonLd(structuredDataPart);
multipartBuilder.addBodyPartJsonLd(structuredDataPart, "utf-8", disposition);
multipartBuilder.addBodyPartHtml(htmlBody);
} else {
multipartBuilder.addBodyPartText(textBody);
multipartBuilder.addBodyPartHtml(htmlBody);
multipartBuilder.addBodyPartJsonLd(structuredDataPart);
multipartBuilder.addBodyPartJsonLd(structuredDataPart, "utf-8", disposition);
}
sm.resetContent(multipartBuilder.build());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.audriga.jakarta.sml.h2lj.model.StructuredData;
import jakarta.mail.Message;
import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeBodyPart;
import jakarta.mail.internet.MimeMultipart;

public class MultipartRelatedMessageBuilder extends AbstractMessageBuilder<MultipartRelatedMessageBuilder> {
Expand Down Expand Up @@ -41,7 +42,8 @@ public StructuredMimeMessageWrapper build() throws MessagingException {

MimeMultipart mm = new MimeMultipartBuilder(MimeMultipartBuilder.MULTIPART.RELATED)
.addBodyPart(alternative)
.addBodyPartJsonLd(structuredDataPart, "utf-8")
// TODO Actually reference json-ld in related-text-html-json example via CID or similar
.addBodyPartJsonLd(structuredDataPart, "utf-8", MimeBodyPart.INLINE)
.build();
sm.resetContent(mm);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.audriga.jakarta.sml.extension.model.MimeTextContent;
import jakarta.mail.BodyPart;
import jakarta.mail.MessagingException;
import jakarta.mail.Part;
import jakarta.mail.internet.ContentType;
import jakarta.mail.internet.MimeMessage;
import jakarta.mail.internet.MimeMultipart;
Expand All @@ -24,19 +25,39 @@ public static StructuredMimeMessageWrapper parseMessage(MimeMessage message) thr
MimeTextContent htmlContent = parseBody(message, Collections.singletonList(TEXT_HTML));
smw.setHtmlBody(htmlContent);
smw.setTextBody(parseBody(message, Arrays.asList(TEXT, TEXT_PLAIN, TEXT_ASCII)));
// TODO also add structured data here

return smw;
}

public static Part parsePart(MimeMessage message, List<String> mimeTypes) throws MessagingException, IOException {
if (mimeTypes.stream().anyMatch(mimeType -> {
try {
return message.isMimeType(mimeType);
} catch (MessagingException e) {
throw new RuntimeException(e);
}
})) {
return message;
}
if (message.isMimeType("multipart/*")) {
return getPartFromMultipart((MimeMultipart) message.getContent(), mimeTypes);
}
return null;
}

public static MimeTextContent parseBody(MimeMessage message, List<String> mimeTypes) throws MessagingException, IOException {
for (String mimeType : mimeTypes) {
if (message.isMimeType(mimeType)) {
return new MimeTextContent((String) message.getContent(), message.getEncoding());
if (mimeTypes.stream().anyMatch(mimeType -> {
try {
return message.isMimeType(mimeType);
} catch (MessagingException e) {
throw new RuntimeException(e);
}
})) {
return new MimeTextContent((String) message.getContent(), message.getEncoding());
}
if (message.isMimeType("multipart/*")) {
MimeMultipart mimeMultipart = (MimeMultipart) message.getContent();
return getBodyFromMultipart(mimeMultipart, mimeTypes);
return getBodyFromMultipart((MimeMultipart) message.getContent(), mimeTypes);
}
return null;
}
Expand All @@ -62,4 +83,23 @@ private static MimeTextContent getBodyFromMultipart(MimeMultipart mimeMultipart,
}
return null;
}

private static Part getPartFromMultipart(MimeMultipart mimeMultipart, List<String> mimeTypes) throws MessagingException, IOException {
for (int i = 0; i < mimeMultipart.getCount(); i++) {
BodyPart bodyPart = mimeMultipart.getBodyPart(i);
for (String mimeType : mimeTypes) {
if (bodyPart.isMimeType(mimeType)) {
return bodyPart;
}
}
if (bodyPart.isMimeType("multipart/*")) {
MimeMultipart nestedMultipart = (MimeMultipart) bodyPart.getContent();
Part body = getPartFromMultipart(nestedMultipart, mimeTypes);
if (body != null) {
return body;
}
}
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,19 @@

import com.audriga.jakarta.sml.TestUtils;
import com.audriga.jakarta.sml.extension.mime.*;
import com.audriga.jakarta.sml.extension.sender.StructuredMimeParseUtils;
import com.audriga.jakarta.sml.h2lj.model.StructuredData;
import com.audriga.jakarta.sml.data.MultipartRelatedEmail;
import com.audriga.jakarta.sml.data.SimpleEmail;
import jakarta.mail.MessagingException;
import jakarta.mail.Part;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

import java.io.IOException;
import java.io.PrintStream;
import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
Expand All @@ -28,12 +31,14 @@ public void setUp() {
@DataProvider(name = "emailVariantsAlternative")
public Object[][] emailVariantsAlternative() {
return new Object[][] {
{ "eml/alternative-text-html-json.eml", SimpleEmail.getSubject(), SimpleEmail.getTextBody(), SimpleEmail.getHtmlBody(), SimpleEmail.getJson(), false },
{ "eml/alternative-html-json.eml", SimpleEmail.getSubject(), null, SimpleEmail.getHtmlBody(), SimpleEmail.getJson(), false },
{ "eml/alternative-html.eml", SimpleEmail.getSubject(), null, SimpleEmail.getHtmlBody(), null, false },
{ "eml/alternative-text-json.eml", SimpleEmail.getSubject(), SimpleEmail.getTextBody(), null, SimpleEmail.getJson(), false },
{ "eml/alternative-text-html.eml", SimpleEmail.getSubject(), SimpleEmail.getTextBody(), SimpleEmail.getHtmlBody(), null, false },
{ "eml/alternative-text-json-html.eml", SimpleEmail.getSubject(), SimpleEmail.getTextBody(), SimpleEmail.getHtmlBody(), SimpleEmail.getJson(), true },
{ "eml/alternative-text-html-json-inline.eml", SimpleEmail.getSubject(), SimpleEmail.getTextBody(), SimpleEmail.getHtmlBody(), SimpleEmail.getJson(), false, Part.INLINE},
{ "eml/alternative-text-html-json.eml", SimpleEmail.getSubject(), SimpleEmail.getTextBody(), SimpleEmail.getHtmlBody(), SimpleEmail.getJson(), false, null },
{ "eml/alternative-html-json.eml", SimpleEmail.getSubject(), null, SimpleEmail.getHtmlBody(), SimpleEmail.getJson(), false, null },
{ "eml/alternative-html.eml", SimpleEmail.getSubject(), null, SimpleEmail.getHtmlBody(), null, false, null },
{ "eml/alternative-text-json.eml", SimpleEmail.getSubject(), SimpleEmail.getTextBody(), null, SimpleEmail.getJson(), false, null },
{ "eml/alternative-text-html.eml", SimpleEmail.getSubject(), SimpleEmail.getTextBody(), SimpleEmail.getHtmlBody(), null, false, null },
{ "eml/alternative-text-json-html.eml", SimpleEmail.getSubject(), SimpleEmail.getTextBody(), SimpleEmail.getHtmlBody(), SimpleEmail.getJson(), true, null },
{"eml/alternative-text-html-json-inline.eml", SimpleEmail.getSubject(), SimpleEmail.getTextBody(), SimpleEmail.getHtmlBody(), SimpleEmail.getJson(), true, Part.INLINE },
};
}

Expand All @@ -57,12 +62,13 @@ public Object[][] emailVariantsHtml() {
}

@Test(dataProvider = "emailVariantsAlternative", groups = "unit")
public void testFullMultipartAlternativeGenerator(String emlFilePath, String subject, String textBody, String htmlBody, List<StructuredData> jsonList, boolean htmlLast) throws MessagingException, IOException {
public void testFullMultipartAlternativeGenerator(String emlFilePath, String subject, String textBody, String htmlBody, List<StructuredData> jsonList, boolean htmlLast, String disposition) throws MessagingException, IOException {
// Parse
StructuredMimeMessageWrapper result = TestUtils.parseEmlFile(emlFilePath);

// Generate
StructuredMimeMessageWrapper message = new MultipartAlternativeMessageBuilder()
.disposition(disposition)
.subject(subject)
.textBody(textBody)
.htmlBody(htmlBody)
Expand Down Expand Up @@ -110,6 +116,9 @@ public void testFullMultipartRelatedGenerator(String emlFilePath, String subject
StructuredData generatedJson = message.getStructuredData().get(0);
StructuredData resultJson = result.getStructuredData().get(0);
assertEquals(generatedJson.getJson().toString(), resultJson.getJson().toString(), "Structured data of generated message should be equal to the parsed message");
Part bodyPart = StructuredMimeParseUtils.parsePart(message.getMimeMessage(), Collections.singletonList(StructuredData.MIME_TYPE));
assert bodyPart != null;
assertEquals(bodyPart.getDisposition(), Part.INLINE);
}
if (htmlBody != null) {
assertEquals(message.getHtmlBody().getText(), result.getHtmlBody().getText(), "HTML of generated message should be equal to the parsed message");
Expand Down
24 changes: 19 additions & 5 deletions test/com/audriga/jakarta/sml/extension/sender/EmailSenderIT.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import jakarta.activation.FileDataSource;
import jakarta.mail.Address;
import jakarta.mail.MessagingException;
import jakarta.mail.Part;
import jakarta.mail.internet.InternetAddress;
import org.testng.annotations.Test;

Expand All @@ -16,24 +17,30 @@
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;

public class EmailSenderIT {
EmailSender sender;
private static final Logger mLogger = Logger.getLogger(EmailSenderIT.class.getName());
private static final String INLINE_BUILDER = "inline";
private static final String HTML_BUILDER = "html";
private static final String ALT_BUILDER = "alternative";
private static final String RELATED_BUILDER = "related";

private void sendEmail(Address[] to, Address[] from, String exampleName) throws MessagingException, URISyntaxException {
String[] parts = exampleName.split("-");
String builderType = parts[0];
boolean htmlLast = false;
String subject = SimpleEmail.getSubject();
String subject = String.format("[%s] %s", exampleName, SimpleEmail.getSubject());
String textBody = null;
String htmlBody = null;
FileDataSource attachment = null;
String attachmentName = null;
List<StructuredData> structuredDataList = new ArrayList<>();
String disposition = null;

for (int i = 1; i < parts.length; i++) {
switch (parts[i]) {
Expand All @@ -53,6 +60,12 @@ private void sendEmail(Address[] to, Address[] from, String exampleName) throws
attachment = SimpleEmail.getAttachment();
attachmentName = SimpleEmail.getAttachmentName();
break;
case "inline":
disposition = Part.INLINE;
if (!Objects.equals(builderType, ALT_BUILDER)) {
mLogger.log(Level.WARNING, "For now inline disposition is only supported for multipart alternative Messages.");
}
break;
default:
throw new IllegalArgumentException(
String.format("Unknown body part '%s' in example name '%s' taken from email subject.",
Expand All @@ -67,7 +80,7 @@ private void sendEmail(Address[] to, Address[] from, String exampleName) throws
StructuredMimeMessageWrapper message;

switch (builderType) {
case "inline":
case INLINE_BUILDER:
message = new InlineHtmlMessageBuilder()
.subject(subject)
.textBody(textBody)
Expand All @@ -79,7 +92,7 @@ private void sendEmail(Address[] to, Address[] from, String exampleName) throws
.addAttachment(attachment, attachmentName)
.build();
break;
case "html":
case HTML_BUILDER:
message = new HtmlOnlyMessageBuilder()
.subject(subject)
.htmlBody(htmlBody)
Expand All @@ -88,8 +101,9 @@ private void sendEmail(Address[] to, Address[] from, String exampleName) throws
.from(from)
.build();
break;
case "alternative":
case ALT_BUILDER:
message = new MultipartAlternativeMessageBuilder()
.disposition(disposition)
.subject(subject)
.textBody(textBody)
.htmlBody(htmlBody)
Expand All @@ -99,7 +113,7 @@ private void sendEmail(Address[] to, Address[] from, String exampleName) throws
.from(from)
.build();
break;
case "related":
case RELATED_BUILDER:
message = new MultipartRelatedMessageBuilder()
.subject(subject)
.textBody(textBody)
Expand Down
Loading