From bf5f932ee4b094c9f2f70bb4a070694c6f5e939d Mon Sep 17 00:00:00 2001 From: itsnuyen Date: Fri, 13 Dec 2024 11:01:44 +0100 Subject: [PATCH 1/5] fix(mail-connector): check htmlBody and/or body is null and throw an error if not throw an error, connector will retry it over and over again. --- .../jakarta/outbound/JakartaEmailActionExecutor.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/connectors/email/src/main/java/io/camunda/connector/email/client/jakarta/outbound/JakartaEmailActionExecutor.java b/connectors/email/src/main/java/io/camunda/connector/email/client/jakarta/outbound/JakartaEmailActionExecutor.java index 4659927c7a..7af686e952 100644 --- a/connectors/email/src/main/java/io/camunda/connector/email/client/jakarta/outbound/JakartaEmailActionExecutor.java +++ b/connectors/email/src/main/java/io/camunda/connector/email/client/jakarta/outbound/JakartaEmailActionExecutor.java @@ -301,16 +301,25 @@ private Multipart getMultipart(SmtpSendEmail smtpSendEmail) throws MessagingExce Multipart multipart = new MimeMultipart(); switch (smtpSendEmail.contentType()) { case PLAIN -> { + if (smtpSendEmail.body() == null) { + throw new MessagingException("Text Body is null"); + } MimeBodyPart textPart = new MimeBodyPart(); textPart.setText(smtpSendEmail.body(), StandardCharsets.UTF_8.name()); multipart.addBodyPart(textPart); } case HTML -> { + if (smtpSendEmail.htmlBody() == null) { + throw new MessagingException("HTML Body is null"); + } MimeBodyPart htmlPart = new MimeBodyPart(); htmlPart.setContent(smtpSendEmail.htmlBody(), JakartaUtils.HTML_CHARSET); multipart.addBodyPart(htmlPart); } case MULTIPART -> { + if (smtpSendEmail.htmlBody() == null || smtpSendEmail.body() == null) { + throw new MessagingException("Text or HTML Body is null"); + } MimeBodyPart textPart = new MimeBodyPart(); textPart.setText(smtpSendEmail.body(), StandardCharsets.UTF_8.name()); MimeBodyPart htmlPart = new MimeBodyPart(); From 3e2815c315b3bffcfbdd6ed98e54bca8bc787ae4 Mon Sep 17 00:00:00 2001 From: itsnuyen Date: Tue, 17 Dec 2024 13:43:31 +0100 Subject: [PATCH 2/5] chore(mail-connector): build the assertation inside the `SmtpSendMail` record --- .../jakarta/outbound/JakartaEmailActionExecutor.java | 9 --------- .../outbound/protocols/actions/SmtpSendEmail.java | 12 +++++++++++- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/connectors/email/src/main/java/io/camunda/connector/email/client/jakarta/outbound/JakartaEmailActionExecutor.java b/connectors/email/src/main/java/io/camunda/connector/email/client/jakarta/outbound/JakartaEmailActionExecutor.java index 7af686e952..4659927c7a 100644 --- a/connectors/email/src/main/java/io/camunda/connector/email/client/jakarta/outbound/JakartaEmailActionExecutor.java +++ b/connectors/email/src/main/java/io/camunda/connector/email/client/jakarta/outbound/JakartaEmailActionExecutor.java @@ -301,25 +301,16 @@ private Multipart getMultipart(SmtpSendEmail smtpSendEmail) throws MessagingExce Multipart multipart = new MimeMultipart(); switch (smtpSendEmail.contentType()) { case PLAIN -> { - if (smtpSendEmail.body() == null) { - throw new MessagingException("Text Body is null"); - } MimeBodyPart textPart = new MimeBodyPart(); textPart.setText(smtpSendEmail.body(), StandardCharsets.UTF_8.name()); multipart.addBodyPart(textPart); } case HTML -> { - if (smtpSendEmail.htmlBody() == null) { - throw new MessagingException("HTML Body is null"); - } MimeBodyPart htmlPart = new MimeBodyPart(); htmlPart.setContent(smtpSendEmail.htmlBody(), JakartaUtils.HTML_CHARSET); multipart.addBodyPart(htmlPart); } case MULTIPART -> { - if (smtpSendEmail.htmlBody() == null || smtpSendEmail.body() == null) { - throw new MessagingException("Text or HTML Body is null"); - } MimeBodyPart textPart = new MimeBodyPart(); textPart.setText(smtpSendEmail.body(), StandardCharsets.UTF_8.name()); MimeBodyPart htmlPart = new MimeBodyPart(); diff --git a/connectors/email/src/main/java/io/camunda/connector/email/outbound/protocols/actions/SmtpSendEmail.java b/connectors/email/src/main/java/io/camunda/connector/email/outbound/protocols/actions/SmtpSendEmail.java index 9b4e99cb61..fe0e8f5e3e 100644 --- a/connectors/email/src/main/java/io/camunda/connector/email/outbound/protocols/actions/SmtpSendEmail.java +++ b/connectors/email/src/main/java/io/camunda/connector/email/outbound/protocols/actions/SmtpSendEmail.java @@ -11,6 +11,7 @@ import io.camunda.connector.generator.java.annotation.TemplateSubType; import io.camunda.document.Document; import jakarta.validation.Valid; +import jakarta.validation.constraints.AssertTrue; import jakarta.validation.constraints.NotNull; import java.util.List; import java.util.Map; @@ -138,4 +139,13 @@ public record SmtpSendEmail( description = "Email's attachment. e.g., =[ document1, document2]", binding = @TemplateProperty.PropertyBinding(name = "data.smtpAction.attachments")) List attachments) - implements SmtpAction {} + implements SmtpAction { + @AssertTrue(message = "Please provide a proper message body") + public boolean isEmailMessageValid() { + return switch (contentType) { + case PLAIN -> body != null; + case HTML -> htmlBody != null; + case MULTIPART -> body != null && htmlBody != null; + }; + } +} From dab711fb237772eadc7e2adf1f7b6d2eb1713f23 Mon Sep 17 00:00:00 2001 From: itsnuyen Date: Wed, 18 Dec 2024 10:17:51 +0100 Subject: [PATCH 3/5] test(mail-connector): adding unit test to validate `isEmailMessageValid` --- .../protocols/actions/SmtpSendEmailTest.java | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 connectors/email/src/test/java/io/camunda/connector/email/outbound/protocols/actions/SmtpSendEmailTest.java diff --git a/connectors/email/src/test/java/io/camunda/connector/email/outbound/protocols/actions/SmtpSendEmailTest.java b/connectors/email/src/test/java/io/camunda/connector/email/outbound/protocols/actions/SmtpSendEmailTest.java new file mode 100644 index 0000000000..1cb810a861 --- /dev/null +++ b/connectors/email/src/test/java/io/camunda/connector/email/outbound/protocols/actions/SmtpSendEmailTest.java @@ -0,0 +1,64 @@ +package io.camunda.connector.email.outbound.protocols.actions; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class SmtpSendEmailTest { + + @Test + void isEmailMessageValidPlainTextWithBody() { + SmtpSendEmail smtpSendEmail = mockSmtpSendEmail(ContentType.PLAIN, "text", null); + assertTrue(smtpSendEmail.isEmailMessageValid()); + } + + @Test + void isEmailMessageNotValidPlainTextWithoutBody() { + SmtpSendEmail smtpSendEmail = mockSmtpSendEmail(ContentType.PLAIN, null, null); + assertFalse(smtpSendEmail.isEmailMessageValid()); + } + + @Test + void isEmailMessageValidHtmlTextWithBody() { + SmtpSendEmail smtpSendEmail = mockSmtpSendEmail(ContentType.HTML, null, "text"); + assertTrue(smtpSendEmail.isEmailMessageValid()); + } + + @Test + void isEmailMessageNotValidHtmlWithoutBody() { + SmtpSendEmail smtpSendEmail = mockSmtpSendEmail(ContentType.HTML, null, null); + assertFalse(smtpSendEmail.isEmailMessageValid()); + } + + @Test + void isEmailMessageValidMultiWithBody() { + SmtpSendEmail smtpSendEmail = mockSmtpSendEmail(ContentType.MULTIPART, "text", "text2"); + assertTrue(smtpSendEmail.isEmailMessageValid()); + } + + @Test + void isEmailMessageNotValidHtmlTextWithoutBothBodies() { + SmtpSendEmail smtpSendEmail = mockSmtpSendEmail(ContentType.MULTIPART, null, null); + assertFalse(smtpSendEmail.isEmailMessageValid()); + } + + @Test + void isEmailMessageNotValidMultiWithoutHtmlBody() { + SmtpSendEmail smtpSendEmail = mockSmtpSendEmail(ContentType.MULTIPART, "text", null); + assertFalse(smtpSendEmail.isEmailMessageValid()); + } + + @Test + void isEmailMessageNotValidMultiWithoutBody() { + SmtpSendEmail smtpSendEmail = mockSmtpSendEmail(ContentType.MULTIPART, null, "text"); + assertFalse(smtpSendEmail.isEmailMessageValid()); + } + + + + private SmtpSendEmail mockSmtpSendEmail(ContentType contentType, String body, String htmlBody) { + return new SmtpSendEmail("", "", "", "", null, "", contentType, + body, htmlBody, null); + } +} \ No newline at end of file From d3fb3931fe6f4d31bb746267a35da5ff8edca9b7 Mon Sep 17 00:00:00 2001 From: itsnuyen Date: Wed, 18 Dec 2024 10:19:34 +0100 Subject: [PATCH 4/5] chore(mail-connector): run mvn spotless to format the `SmtpSendEmailTest` class --- .../protocols/actions/SmtpSendEmailTest.java | 111 +++++++++--------- 1 file changed, 54 insertions(+), 57 deletions(-) diff --git a/connectors/email/src/test/java/io/camunda/connector/email/outbound/protocols/actions/SmtpSendEmailTest.java b/connectors/email/src/test/java/io/camunda/connector/email/outbound/protocols/actions/SmtpSendEmailTest.java index 1cb810a861..bb851aef72 100644 --- a/connectors/email/src/test/java/io/camunda/connector/email/outbound/protocols/actions/SmtpSendEmailTest.java +++ b/connectors/email/src/test/java/io/camunda/connector/email/outbound/protocols/actions/SmtpSendEmailTest.java @@ -1,64 +1,61 @@ package io.camunda.connector.email.outbound.protocols.actions; -import org.junit.jupiter.api.Test; - import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -class SmtpSendEmailTest { - - @Test - void isEmailMessageValidPlainTextWithBody() { - SmtpSendEmail smtpSendEmail = mockSmtpSendEmail(ContentType.PLAIN, "text", null); - assertTrue(smtpSendEmail.isEmailMessageValid()); - } - - @Test - void isEmailMessageNotValidPlainTextWithoutBody() { - SmtpSendEmail smtpSendEmail = mockSmtpSendEmail(ContentType.PLAIN, null, null); - assertFalse(smtpSendEmail.isEmailMessageValid()); - } - - @Test - void isEmailMessageValidHtmlTextWithBody() { - SmtpSendEmail smtpSendEmail = mockSmtpSendEmail(ContentType.HTML, null, "text"); - assertTrue(smtpSendEmail.isEmailMessageValid()); - } - - @Test - void isEmailMessageNotValidHtmlWithoutBody() { - SmtpSendEmail smtpSendEmail = mockSmtpSendEmail(ContentType.HTML, null, null); - assertFalse(smtpSendEmail.isEmailMessageValid()); - } - - @Test - void isEmailMessageValidMultiWithBody() { - SmtpSendEmail smtpSendEmail = mockSmtpSendEmail(ContentType.MULTIPART, "text", "text2"); - assertTrue(smtpSendEmail.isEmailMessageValid()); - } - - @Test - void isEmailMessageNotValidHtmlTextWithoutBothBodies() { - SmtpSendEmail smtpSendEmail = mockSmtpSendEmail(ContentType.MULTIPART, null, null); - assertFalse(smtpSendEmail.isEmailMessageValid()); - } - - @Test - void isEmailMessageNotValidMultiWithoutHtmlBody() { - SmtpSendEmail smtpSendEmail = mockSmtpSendEmail(ContentType.MULTIPART, "text", null); - assertFalse(smtpSendEmail.isEmailMessageValid()); - } - - @Test - void isEmailMessageNotValidMultiWithoutBody() { - SmtpSendEmail smtpSendEmail = mockSmtpSendEmail(ContentType.MULTIPART, null, "text"); - assertFalse(smtpSendEmail.isEmailMessageValid()); - } - +import org.junit.jupiter.api.Test; +class SmtpSendEmailTest { - private SmtpSendEmail mockSmtpSendEmail(ContentType contentType, String body, String htmlBody) { - return new SmtpSendEmail("", "", "", "", null, "", contentType, - body, htmlBody, null); - } -} \ No newline at end of file + @Test + void isEmailMessageValidPlainTextWithBody() { + SmtpSendEmail smtpSendEmail = mockSmtpSendEmail(ContentType.PLAIN, "text", null); + assertTrue(smtpSendEmail.isEmailMessageValid()); + } + + @Test + void isEmailMessageNotValidPlainTextWithoutBody() { + SmtpSendEmail smtpSendEmail = mockSmtpSendEmail(ContentType.PLAIN, null, null); + assertFalse(smtpSendEmail.isEmailMessageValid()); + } + + @Test + void isEmailMessageValidHtmlTextWithBody() { + SmtpSendEmail smtpSendEmail = mockSmtpSendEmail(ContentType.HTML, null, "text"); + assertTrue(smtpSendEmail.isEmailMessageValid()); + } + + @Test + void isEmailMessageNotValidHtmlWithoutBody() { + SmtpSendEmail smtpSendEmail = mockSmtpSendEmail(ContentType.HTML, null, null); + assertFalse(smtpSendEmail.isEmailMessageValid()); + } + + @Test + void isEmailMessageValidMultiWithBody() { + SmtpSendEmail smtpSendEmail = mockSmtpSendEmail(ContentType.MULTIPART, "text", "text2"); + assertTrue(smtpSendEmail.isEmailMessageValid()); + } + + @Test + void isEmailMessageNotValidHtmlTextWithoutBothBodies() { + SmtpSendEmail smtpSendEmail = mockSmtpSendEmail(ContentType.MULTIPART, null, null); + assertFalse(smtpSendEmail.isEmailMessageValid()); + } + + @Test + void isEmailMessageNotValidMultiWithoutHtmlBody() { + SmtpSendEmail smtpSendEmail = mockSmtpSendEmail(ContentType.MULTIPART, "text", null); + assertFalse(smtpSendEmail.isEmailMessageValid()); + } + + @Test + void isEmailMessageNotValidMultiWithoutBody() { + SmtpSendEmail smtpSendEmail = mockSmtpSendEmail(ContentType.MULTIPART, null, "text"); + assertFalse(smtpSendEmail.isEmailMessageValid()); + } + + private SmtpSendEmail mockSmtpSendEmail(ContentType contentType, String body, String htmlBody) { + return new SmtpSendEmail("", "", "", "", null, "", contentType, body, htmlBody, null); + } +} From f3563906dfb14b06bc276ee7d1f6fa5f69c23470 Mon Sep 17 00:00:00 2001 From: itsnuyen Date: Wed, 18 Dec 2024 13:05:09 +0100 Subject: [PATCH 5/5] chore(mail-connector): use mvn:licence to add the licence to the file --- .../email/outbound/protocols/actions/SmtpSendEmailTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/connectors/email/src/test/java/io/camunda/connector/email/outbound/protocols/actions/SmtpSendEmailTest.java b/connectors/email/src/test/java/io/camunda/connector/email/outbound/protocols/actions/SmtpSendEmailTest.java index bb851aef72..489cce8a8f 100644 --- a/connectors/email/src/test/java/io/camunda/connector/email/outbound/protocols/actions/SmtpSendEmailTest.java +++ b/connectors/email/src/test/java/io/camunda/connector/email/outbound/protocols/actions/SmtpSendEmailTest.java @@ -1,3 +1,9 @@ +/* + * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH + * under one or more contributor license agreements. Licensed under a proprietary license. + * See the License.txt file for more information. You may not use this file + * except in compliance with the proprietary license. + */ package io.camunda.connector.email.outbound.protocols.actions; import static org.junit.jupiter.api.Assertions.assertFalse;