From b100364e864c41a014800346d6c3cc1a6d8831c9 Mon Sep 17 00:00:00 2001 From: Andrea Cosentino Date: Wed, 22 Jul 2026 12:54:59 +0200 Subject: [PATCH] CAMEL-24238: camel-aws2-ses - send RawMessage body content instead of the SdkBytes descriptor When the exchange body is an SES RawMessage, Ses2Producer built the outgoing Content from the body converted to String, which for a RawMessage falls back to Object.toString() on the SDK type. SdkBytes.toString() renders a debug descriptor ("SdkBytes(bytes=0x46726f6d...)"), so the recipient received that descriptor instead of the MIME payload. Read the payload from RawMessage.data().asUtf8String() when the body is a RawMessage, and cover it with a test asserting the sent text equals the original MIME content. Co-authored-by: Claude Opus 4.8 Signed-off-by: Andrea Cosentino --- components/camel-aws/camel-aws2-ses/pom.xml | 5 +++++ .../camel/component/aws2/ses/Ses2Producer.java | 3 ++- .../camel/component/aws2/ses/SesComponentTest.java | 14 ++++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/components/camel-aws/camel-aws2-ses/pom.xml b/components/camel-aws/camel-aws2-ses/pom.xml index 7e074926fe2de..275f8d85e442b 100644 --- a/components/camel-aws/camel-aws2-ses/pom.xml +++ b/components/camel-aws/camel-aws2-ses/pom.xml @@ -83,5 +83,10 @@ camel-test-spring-junit6 test + + org.assertj + assertj-core + test + diff --git a/components/camel-aws/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Producer.java b/components/camel-aws/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Producer.java index 4b1ef57e797bb..d84a5adbc0b40 100644 --- a/components/camel-aws/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Producer.java +++ b/components/camel-aws/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Producer.java @@ -101,7 +101,8 @@ private software.amazon.awssdk.services.ses.model.Message createMessage(Exchange = software.amazon.awssdk.services.ses.model.Message.builder(); String content; if (exchange.getIn().getBody() instanceof RawMessage raw) { - content = raw.data().toString(); + // SdkBytes.toString() is a debug descriptor (SdkBytes(bytes=0x...)), not the payload + content = raw.data().asUtf8String(); } else { content = exchange.getIn().getBody(String.class); } diff --git a/components/camel-aws/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentTest.java b/components/camel-aws/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentTest.java index 1ba9aa3de35a9..021800773783d 100644 --- a/components/camel-aws/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentTest.java +++ b/components/camel-aws/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentTest.java @@ -26,9 +26,12 @@ import org.apache.camel.builder.RouteBuilder; import org.apache.camel.test.junit6.CamelTestSupport; import org.junit.jupiter.api.Test; +import software.amazon.awssdk.core.SdkBytes; import software.amazon.awssdk.services.ses.model.MessageTag; +import software.amazon.awssdk.services.ses.model.RawMessage; import software.amazon.awssdk.services.ses.model.SendEmailRequest; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; public class SesComponentTest extends CamelTestSupport { @@ -36,6 +39,17 @@ public class SesComponentTest extends CamelTestSupport { @BindToRegistry("amazonSESClient") private AmazonSESClientMock sesClient = new AmazonSESClientMock(); + @Test + void rawMessageBodyIsSentAsItsContentNotTheSdkBytesDescriptor() { + String mime = "From: from@example.com\r\nSubject: Subject\r\n\r\nThis is my message text."; + template.send("direct:start", exchange -> exchange.getIn().setBody( + RawMessage.builder().data(SdkBytes.fromUtf8String(mime)).build())); + + // SdkBytes.toString() would yield "SdkBytes(bytes=0x...)" rather than the message content + String sent = sesClient.getSendEmailRequest().message().body().text().data(); + assertThat(sent).isEqualTo(mime); + } + @Test public void sendInOnlyMessageUsingUrlOptions() { Exchange exchange = template.send("direct:start", new Processor() {