From 65ebffed06643bb24437983e4bb65b2e19aadef3 Mon Sep 17 00:00:00 2001 From: Maciej Walkowiak Date: Thu, 30 Oct 2025 23:14:50 +0100 Subject: [PATCH] Aligh sending message with multiple MimeMessagePreparators with default implementation in JavaMailSender. Now each preparator creates a separate mime message. Fixes #1490 --- .../ses/SimpleEmailServiceJavaMailSender.java | 29 --------------- .../SimpleEmailServiceJavaMailSenderTest.java | 35 ++++++++++++++----- 2 files changed, 27 insertions(+), 37 deletions(-) diff --git a/spring-cloud-aws-ses/src/main/java/io/awspring/cloud/ses/SimpleEmailServiceJavaMailSender.java b/spring-cloud-aws-ses/src/main/java/io/awspring/cloud/ses/SimpleEmailServiceJavaMailSender.java index 9f5281c73..59ae8832d 100644 --- a/spring-cloud-aws-ses/src/main/java/io/awspring/cloud/ses/SimpleEmailServiceJavaMailSender.java +++ b/spring-cloud-aws-ses/src/main/java/io/awspring/cloud/ses/SimpleEmailServiceJavaMailSender.java @@ -38,7 +38,6 @@ import org.springframework.mail.javamail.ConfigurableMimeFileTypeMap; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; -import org.springframework.mail.javamail.MimeMessagePreparator; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import software.amazon.awssdk.core.SdkBytes; @@ -204,12 +203,6 @@ public MimeMessage createMimeMessage(InputStream contentStream) throws MailExcep } } - @Override - public void send(MimeMessage mimeMessage) throws MailException { - Assert.notNull(mimeMessage, "mimeMessage are required"); - this.send(new MimeMessage[] { mimeMessage }); - } - @SuppressWarnings("OverloadedVarargsMethod") @Override public void send(MimeMessage... mimeMessages) throws MailException { @@ -241,28 +234,6 @@ public void send(MimeMessage... mimeMessages) throws MailException { } } - @Override - public void send(MimeMessagePreparator mimeMessagePreparator) throws MailException { - Assert.notNull(mimeMessagePreparator, "mimeMessagePreparator are required"); - send(new MimeMessagePreparator[] { mimeMessagePreparator }); - } - - @SuppressWarnings("OverloadedVarargsMethod") - @Override - public void send(MimeMessagePreparator... mimeMessagePreparators) throws MailException { - Assert.notNull(mimeMessagePreparators, "mimeMessagePreparator are required"); - MimeMessage mimeMessage = createMimeMessage(); - for (MimeMessagePreparator mimeMessagePreparator : mimeMessagePreparators) { - try { - mimeMessagePreparator.prepare(mimeMessage); - } - catch (Exception e) { - throw new MailPreparationException(e); - } - } - send(mimeMessage); - } - private RawMessage createRawMessage(MimeMessage mimeMessage) { ByteArrayOutputStream out; try { diff --git a/spring-cloud-aws-ses/src/test/java/io/awspring/cloud/ses/SimpleEmailServiceJavaMailSenderTest.java b/spring-cloud-aws-ses/src/test/java/io/awspring/cloud/ses/SimpleEmailServiceJavaMailSenderTest.java index 527c54ab7..be54c2a71 100644 --- a/spring-cloud-aws-ses/src/test/java/io/awspring/cloud/ses/SimpleEmailServiceJavaMailSenderTest.java +++ b/spring-cloud-aws-ses/src/test/java/io/awspring/cloud/ses/SimpleEmailServiceJavaMailSenderTest.java @@ -32,6 +32,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.List; import java.util.Objects; import java.util.Properties; import org.junit.jupiter.api.Test; @@ -223,8 +224,7 @@ void testSendMailWithMimeMessagePreparator() throws Exception { mailSender.send(preparator); - MimeMessage mimeMessage = new MimeMessage(Session.getInstance(new Properties()), - new ByteArrayInputStream(request.getValue().rawMessage().data().asByteArray())); + MimeMessage mimeMessage = toMimeMessage(request.getValue()); assertThat(mimeMessage.getRecipients(Message.RecipientType.TO)[0].toString()).isEqualTo("to@domain.com"); assertThat(mimeMessage.getSubject()).isEqualTo("subject"); assertThat(mimeMessage.getContent()).isEqualTo("body"); @@ -241,16 +241,19 @@ void testSendMailWithMultipleMimeMessagePreparators() throws Exception { preparators[0] = mimeMessage -> { MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage); mimeMessageHelper.setTo("to@domain.com"); + mimeMessageHelper.setText("body1"); }; preparators[1] = mimeMessage -> { MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage); mimeMessageHelper.setSubject("subject"); + mimeMessageHelper.setText("body2"); }; preparators[2] = mimeMessage -> { MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage); - mimeMessageHelper.setText("body"); + mimeMessageHelper.setPriority(1); + mimeMessageHelper.setText("body3"); }; ArgumentCaptor request = ArgumentCaptor.forClass(SendRawEmailRequest.class); @@ -259,12 +262,19 @@ void testSendMailWithMultipleMimeMessagePreparators() throws Exception { mailSender.send(preparators); - MimeMessage mimeMessage = new MimeMessage(Session.getInstance(new Properties()), - new ByteArrayInputStream(request.getValue().rawMessage().data().asByteArray())); - assertThat(mimeMessage.getRecipients(Message.RecipientType.TO)[0].toString()).isEqualTo("to@domain.com"); - assertThat(mimeMessage.getSubject()).isEqualTo("subject"); - assertThat(mimeMessage.getContent()).isEqualTo("body"); + List messages = request.getAllValues() + .stream() + .map(this::toMimeMessage) + .toList(); + + assertThat(messages.get(0).getRecipients(Message.RecipientType.TO)[0].toString()).isEqualTo("to@domain.com"); + assertThat(messages.get(0).getContent()).isEqualTo("body1"); + assertThat(messages.get(1).getSubject()).isEqualTo("subject"); + assertThat(messages.get(1).getContent()).isEqualTo("body2"); + + assertThat(messages.get(2).getContent()).isEqualTo("body3"); + assertThat(messages.get(2).getHeader("X-Priority", ":")).isEqualTo("1"); } @Test @@ -367,4 +377,13 @@ private byte[] getMimeMessageAsByteArray(MimeMessage mimeMessage) throws IOExcep return os.toByteArray(); } + private MimeMessage toMimeMessage(SendRawEmailRequest request) { + try { + return new MimeMessage(Session.getInstance(new Properties()), + new ByteArrayInputStream(request.rawMessage().data().asByteArray())); + } catch (MessagingException e) { + throw new RuntimeException(e); + } + } + }