diff --git a/docs/src/main/asciidoc/ses.adoc b/docs/src/main/asciidoc/ses.adoc index 404f325e7..30eafe92f 100644 --- a/docs/src/main/asciidoc/ses.adoc +++ b/docs/src/main/asciidoc/ses.adoc @@ -135,8 +135,7 @@ The Spring Boot Starter for SES provides the following configuration options: | `spring.cloud.aws.ses.enabled` | Enables the SES integration. | No | `true` | `spring.cloud.aws.ses.endpoint` | Configures endpoint used by `SesClient`. | No | | `spring.cloud.aws.ses.region` | Configures region used by `SesClient`. | No | -| `spring.cloud.aws.ses.source-arn` | Configures source ARN, used only for sending authorization. | No | -| `spring.cloud.aws.ses.from-arn` | Configures from ARN, used only for sending authorization in the SendRawEmail operation. | No | +| `spring.cloud.aws.ses.identity-arn` | Configures identity ARN, used only for sending authorization. | No | | `spring.cloud.aws.ses.configuration-set-name` | The configuration set name used for every message | No | |=== @@ -146,11 +145,8 @@ service will produce an error while using the mail service. Therefore, the regio sender configuration. The example below shows a typical combination of a region (`EU-CENTRAL-1`) that does not provide an SES service where the client is overridden to use a valid region (`EU-WEST-1`). -`sourceArn` is the ARN of the identity that is associated with the sending authorization policy. For information about when to use this parameter, see the -description see https://docs.aws.amazon.com/ses/latest/dg/sending-authorization-delegate-sender-tasks-email.html[Amazon SES Developer Guide]. - -`fromArn` is the ARN of the identity that is associated with the sending authorization policy that permits you to specify a particular "From" address in the header of the raw email. -For information about when to use this parameter, see the description see https://docs.aws.amazon.com/ses/latest/dg/sending-authorization-delegate-sender-tasks-email.html[Amazon SES Developer Guide]. +`identityArn` is the ARN of the identity that is associated with the sending authorization policy. For information about when to use this parameter, see the +description see https://docs.aws.amazon.com/ses/latest/dg/sending-authorization-overview.html[https://docs.aws.amazon.com/ses/latest/dg/sending-authorization-delegate-sender-tasks-email.html][Amazon SES Developer Guide]. `configurationSetName` sets the configuration set name on mail sender level and applies to every mail. For information about when to use this parameter, see the description https://docs.aws.amazon.com/ses/latest/dg/using-configuration-sets.html[Using configuration sets in Amazon SES]. @@ -158,8 +154,7 @@ description https://docs.aws.amazon.com/ses/latest/dg/using-configuration-sets.h [source,properties,indent=0] ---- spring.cloud.aws.ses.region=eu-west-1 -spring.cloud.aws.ses.source-arn=arn:aws:ses:eu-west-1:123456789012:identity/example.com -spring.cloud.aws.ses.from-arn=arn:aws:ses:eu-west-1:123456789012:identity/example.com +spring.cloud.aws.ses.identity-arn=arn:aws:ses:eu-west-1:123456789012:identity/example.com spring.cloud.aws.ses.configuration-set-name=ConfigSet ---- diff --git a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/ses/SesAutoConfiguration.java b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/ses/SesAutoConfiguration.java index 91b7e070f..7c26ea61a 100644 --- a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/ses/SesAutoConfiguration.java +++ b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/ses/SesAutoConfiguration.java @@ -35,8 +35,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.mail.MailSender; import org.springframework.mail.javamail.JavaMailSender; -import software.amazon.awssdk.services.ses.SesClient; -import software.amazon.awssdk.services.ses.SesClientBuilder; +import software.amazon.awssdk.services.sesv2.SesV2Client; +import software.amazon.awssdk.services.sesv2.SesV2ClientBuilder; /** * {@link EnableAutoConfiguration} for {@link SimpleEmailServiceMailSender} and @@ -45,37 +45,38 @@ * @author Agim Emruli * @author Eddú Meléndez * @author Arun Patra + * @author Dominik Kovács */ @AutoConfiguration @EnableConfigurationProperties(SesProperties.class) -@ConditionalOnClass({ SesClient.class, MailSender.class, SimpleEmailServiceJavaMailSender.class }) +@ConditionalOnClass({ SesV2Client.class, MailSender.class, SimpleEmailServiceJavaMailSender.class }) @AutoConfigureAfter({ CredentialsProviderAutoConfiguration.class, RegionProviderAutoConfiguration.class }) @ConditionalOnProperty(name = "spring.cloud.aws.ses.enabled", havingValue = "true", matchIfMissing = true) public class SesAutoConfiguration { @Bean @ConditionalOnMissingBean - public SesClient sesClient(SesProperties properties, AwsClientBuilderConfigurer awsClientBuilderConfigurer, - ObjectProvider> configurer, + public SesV2Client sesClient(SesProperties properties, AwsClientBuilderConfigurer awsClientBuilderConfigurer, + ObjectProvider> configurer, ObjectProvider connectionDetails, ObjectProvider sesClientCustomizers, ObjectProvider awsSyncClientCustomizers) { - return awsClientBuilderConfigurer.configureSyncClient(SesClient.builder(), properties, + return awsClientBuilderConfigurer.configureSyncClient(SesV2Client.builder(), properties, connectionDetails.getIfAvailable(), configurer.getIfAvailable(), sesClientCustomizers.orderedStream(), awsSyncClientCustomizers.orderedStream()).build(); } @Bean @ConditionalOnMissingClass("jakarta.mail.Session") - public MailSender simpleMailSender(SesClient sesClient, SesProperties properties) { - return new SimpleEmailServiceMailSender(sesClient, properties.getSourceArn(), + public MailSender simpleMailSender(SesV2Client sesClient, SesProperties properties) { + return new SimpleEmailServiceMailSender(sesClient, properties.getIdentityArn(), properties.getConfigurationSetName()); } @Bean @ConditionalOnClass(name = "jakarta.mail.Session") - public JavaMailSender javaMailSender(SesClient sesClient, SesProperties properties) { - return new SimpleEmailServiceJavaMailSender(sesClient, properties.getSourceArn(), + public JavaMailSender javaMailSender(SesV2Client sesClient, SesProperties properties) { + return new SimpleEmailServiceJavaMailSender(sesClient, properties.getIdentityArn(), properties.getConfigurationSetName()); } diff --git a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/ses/SesClientCustomizer.java b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/ses/SesClientCustomizer.java index ec85f1224..88171d9f6 100644 --- a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/ses/SesClientCustomizer.java +++ b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/ses/SesClientCustomizer.java @@ -16,14 +16,14 @@ package io.awspring.cloud.autoconfigure.ses; import io.awspring.cloud.autoconfigure.AwsClientCustomizer; -import software.amazon.awssdk.services.ses.SesClientBuilder; +import software.amazon.awssdk.services.sesv2.SesV2ClientBuilder; /** - * Callback interface that can be used to customize a {@link SesClientBuilder}. + * Callback interface that can be used to customize a {@link SesV2ClientBuilder}. * * @author Maciej Walkowiak * @since 3.3.0 */ @FunctionalInterface -public interface SesClientCustomizer extends AwsClientCustomizer { +public interface SesClientCustomizer extends AwsClientCustomizer { } diff --git a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/ses/SesProperties.java b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/ses/SesProperties.java index 417d8b6d2..b650c6aef 100644 --- a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/ses/SesProperties.java +++ b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/ses/SesProperties.java @@ -24,6 +24,7 @@ * * @author Eddú Meléndez * @author Arun Patra + * @author Dominik Kovács */ @ConfigurationProperties(prefix = SesProperties.PREFIX) public class SesProperties extends AwsClientProperties { @@ -34,10 +35,10 @@ public class SesProperties extends AwsClientProperties { public static final String PREFIX = "spring.cloud.aws.ses"; /** - * Configures source ARN. Used only for sending authorization. + * Configures identity ARN. Used only for sending authorization. */ @Nullable - private String sourceArn; + private String identityArn; /** * Configures configuration set name. @@ -45,15 +46,9 @@ public class SesProperties extends AwsClientProperties { @Nullable private String configurationSetName; - /** - * Configures from ARN. Only applies to SendRawEmail operation. - */ @Nullable - private String fromArn; - - @Nullable - public String getSourceArn() { - return sourceArn; + public String getIdentityArn() { + return identityArn; } @Nullable @@ -61,21 +56,12 @@ public String getConfigurationSetName() { return configurationSetName; } - @Nullable - public String getFromArn() { - return fromArn; - } - - public void setSourceArn(@Nullable String sourceArn) { - this.sourceArn = sourceArn; + public void setIdentityArn(@Nullable String identityArn) { + this.identityArn = identityArn; } public void setConfigurationSetName(@Nullable String configurationSetName) { this.configurationSetName = configurationSetName; } - public void setFromArn(@Nullable String fromArn) { - this.fromArn = fromArn; - } - } diff --git a/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/ses/SesAutoConfigurationTest.java b/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/ses/SesAutoConfigurationTest.java index e8c437e98..356ac876d 100644 --- a/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/ses/SesAutoConfigurationTest.java +++ b/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/ses/SesAutoConfigurationTest.java @@ -35,8 +35,8 @@ import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration; import software.amazon.awssdk.http.SdkHttpClient; import software.amazon.awssdk.http.apache.ApacheHttpClient; -import software.amazon.awssdk.services.ses.SesClient; -import software.amazon.awssdk.services.ses.SesClientBuilder; +import software.amazon.awssdk.services.sesv2.SesV2Client; +import software.amazon.awssdk.services.sesv2.SesV2ClientBuilder; /** * Tests for class {@link SesAutoConfiguration}. @@ -63,7 +63,7 @@ void mailSenderWithJavaMail() { @Test void mailSenderWithoutSesClientInTheClasspath() { - this.contextRunner.withClassLoader(new FilteredClassLoader(software.amazon.awssdk.services.ses.SesClient.class)) + this.contextRunner.withClassLoader(new FilteredClassLoader(software.amazon.awssdk.services.sesv2.SesV2Client.class)) .run(context -> { assertThat(context).doesNotHaveBean(MailSender.class); assertThat(context).doesNotHaveBean(JavaMailSender.class); @@ -89,7 +89,7 @@ void sesAutoConfigurationIsDisabled() { @Test void withCustomEndpoint() { this.contextRunner.withPropertyValues("spring.cloud.aws.ses.endpoint:http://localhost:8090").run(context -> { - ConfiguredAwsClient client = new ConfiguredAwsClient(context.getBean(SesClient.class)); + ConfiguredAwsClient client = new ConfiguredAwsClient(context.getBean(SesV2Client.class)); assertThat(client.getEndpoint()).isEqualTo(URI.create("http://localhost:8090")); assertThat(client.isEndpointOverridden()).isTrue(); }); @@ -98,7 +98,7 @@ void withCustomEndpoint() { @Test void withCustomGlobalEndpoint() { this.contextRunner.withPropertyValues("spring.cloud.aws.endpoint:http://localhost:8090").run(context -> { - ConfiguredAwsClient client = new ConfiguredAwsClient(context.getBean(SesClient.class)); + ConfiguredAwsClient client = new ConfiguredAwsClient(context.getBean(SesV2Client.class)); assertThat(client.getEndpoint()).isEqualTo(URI.create("http://localhost:8090")); assertThat(client.isEndpointOverridden()).isTrue(); }); @@ -108,7 +108,7 @@ void withCustomGlobalEndpoint() { void withCustomGlobalEndpointAndSesEndpoint() { this.contextRunner.withPropertyValues("spring.cloud.aws.endpoint:http://localhost:8090", "spring.cloud.aws.ses.endpoint:http://localhost:9999").run(context -> { - ConfiguredAwsClient client = new ConfiguredAwsClient(context.getBean(SesClient.class)); + ConfiguredAwsClient client = new ConfiguredAwsClient(context.getBean(SesV2Client.class)); assertThat(client.getEndpoint()).isEqualTo(URI.create("http://localhost:9999")); assertThat(client.isEndpointOverridden()).isTrue(); }); @@ -117,7 +117,7 @@ void withCustomGlobalEndpointAndSesEndpoint() { @Test void customSesClientConfigurer() { this.contextRunner.withUserConfiguration(CustomAwsClientConfig.class).run(context -> { - ConfiguredAwsClient sesClient = new ConfiguredAwsClient(context.getBean(SesClient.class)); + ConfiguredAwsClient sesClient = new ConfiguredAwsClient(context.getBean(SesV2Client.class)); assertThat(sesClient.getApiCallTimeout()).isEqualTo(Duration.ofMillis(2000)); assertThat(sesClient.getSyncHttpClient()).isNotNull(); }); @@ -127,11 +127,11 @@ void customSesClientConfigurer() { static class CustomAwsClientConfig { @Bean - AwsClientCustomizer snsClientBuilderAwsClientConfigurer() { + AwsClientCustomizer snsClientBuilderAwsClientConfigurer() { return new CustomAwsClientConfig.SesAwsClientConfigurer(); } - static class SesAwsClientConfigurer implements AwsClientCustomizer { + static class SesAwsClientConfigurer implements AwsClientCustomizer { @Override public ClientOverrideConfiguration overrideConfiguration() { return ClientOverrideConfiguration.builder().apiCallTimeout(Duration.ofMillis(2000)).build(); diff --git a/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/ses/SesClientCustomizerTests.java b/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/ses/SesClientCustomizerTests.java index 4ec9f1c8e..b29aa884f 100644 --- a/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/ses/SesClientCustomizerTests.java +++ b/spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/ses/SesClientCustomizerTests.java @@ -30,7 +30,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; import software.amazon.awssdk.http.apache.ApacheHttpClient; -import software.amazon.awssdk.services.ses.SesClient; +import software.amazon.awssdk.services.sesv2.SesV2Client; /** * Tests for {@link SesClientCustomizer}. @@ -48,7 +48,7 @@ class SesClientCustomizerTests { @Test void customClientCustomizer() { contextRunner.withUserConfiguration(CustomizerConfig.class).run(context -> { - ConfiguredAwsClient client = new ConfiguredAwsClient(context.getBean(SesClient.class)); + ConfiguredAwsClient client = new ConfiguredAwsClient(context.getBean(SesV2Client.class)); assertThat(client.getApiCallTimeout()).describedAs("sets property from first customizer") .isEqualTo(Duration.ofMillis(2001)); assertThat(client.getApiCallAttemptTimeout()).describedAs("sets property from second customizer") @@ -61,7 +61,7 @@ void customClientCustomizer() { @Test void customClientCustomizerWithOrder() { contextRunner.withUserConfiguration(CustomizerConfigWithOrder.class).run(context -> { - ConfiguredAwsClient client = new ConfiguredAwsClient(context.getBean(SesClient.class)); + ConfiguredAwsClient client = new ConfiguredAwsClient(context.getBean(SesV2Client.class)); assertThat(client.getApiCallTimeout()) .describedAs("property from the customizer with higher order takes precedence") .isEqualTo(Duration.ofMillis(2001)); diff --git a/spring-cloud-aws-ses/pom.xml b/spring-cloud-aws-ses/pom.xml index 7c4369edb..743c6c01b 100644 --- a/spring-cloud-aws-ses/pom.xml +++ b/spring-cloud-aws-ses/pom.xml @@ -23,7 +23,7 @@ software.amazon.awssdk - ses + sesv2 jakarta.mail 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..bb92a04d7 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 @@ -42,10 +42,10 @@ import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import software.amazon.awssdk.core.SdkBytes; -import software.amazon.awssdk.services.ses.SesClient; -import software.amazon.awssdk.services.ses.model.RawMessage; -import software.amazon.awssdk.services.ses.model.SendRawEmailRequest; -import software.amazon.awssdk.services.ses.model.SendRawEmailResponse; +import software.amazon.awssdk.services.sesv2.SesV2Client; +import software.amazon.awssdk.services.sesv2.model.RawMessage; +import software.amazon.awssdk.services.sesv2.model.SendEmailRequest; +import software.amazon.awssdk.services.sesv2.model.SendEmailResponse; /** * {@link JavaMailSender} implementation that allows to send {@link MimeMessage} using the Simple E-Mail Service. In @@ -55,6 +55,7 @@ * @author Agim Emruli * @author Eddú Meléndez * @author Arun Patra + * @author Dominik Kovács * @since 1.0 */ public class SimpleEmailServiceJavaMailSender extends SimpleEmailServiceMailSender implements JavaMailSender { @@ -74,26 +75,17 @@ public class SimpleEmailServiceJavaMailSender extends SimpleEmailServiceMailSend @Nullable private FileTypeMap defaultFileTypeMap; - @Nullable - private String fromArn; - - public SimpleEmailServiceJavaMailSender(SesClient sesClient) { + public SimpleEmailServiceJavaMailSender(SesV2Client sesClient) { this(sesClient, null); } - public SimpleEmailServiceJavaMailSender(SesClient sesClient, @Nullable String sourceArn) { - this(sesClient, sourceArn, null); + public SimpleEmailServiceJavaMailSender(SesV2Client sesClient, @Nullable String identityArn) { + this(sesClient, identityArn, null); } - public SimpleEmailServiceJavaMailSender(SesClient sesClient, @Nullable String sourceArn, + public SimpleEmailServiceJavaMailSender(SesV2Client sesClient, @Nullable String identityArn, @Nullable String configurationSetName) { - super(sesClient, sourceArn, configurationSetName); - } - - public SimpleEmailServiceJavaMailSender(SesClient sesClient, @Nullable String sourceArn, - @Nullable String configurationSetName, @Nullable String fromArn) { - super(sesClient, sourceArn, configurationSetName); - this.fromArn = fromArn; + super(sesClient, identityArn, configurationSetName); } /** @@ -215,19 +207,18 @@ public void send(MimeMessage mimeMessage) throws MailException { public void send(MimeMessage... mimeMessages) throws MailException { Assert.notNull(mimeMessages, "mimeMessages are required"); Map failedMessages = new HashMap<>(); - for (MimeMessage mimeMessage : mimeMessages) { try { - RawMessage rawMessage = createRawMessage(mimeMessage); + SendEmailRequest request = SendEmailRequest.builder().fromEmailAddressIdentityArn(getIdentityArn()) + .configurationSetName(getConfigurationSetName()) + .content(content -> content.raw(createRawMessage(mimeMessage))).build(); - SendRawEmailResponse sendRawEmailResponse = getEmailService() - .sendRawEmail(SendRawEmailRequest.builder().sourceArn(getSourceArn()).fromArn(this.fromArn) - .configurationSetName(getConfigurationSetName()).rawMessage(rawMessage).build()); + SendEmailResponse sendEmailResponse = getEmailService().sendEmail(request); if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Message with id: {} successfully sent", sendRawEmailResponse.messageId()); + LOGGER.debug("Message with id: {} successfully sent", sendEmailResponse.messageId()); } - mimeMessage.setHeader("Message-ID", sendRawEmailResponse.messageId()); + mimeMessage.setHeader("Message-ID", sendEmailResponse.messageId()); } catch (Exception e) { // Ignore Exception because we are collecting and throwing all if any diff --git a/spring-cloud-aws-ses/src/main/java/io/awspring/cloud/ses/SimpleEmailServiceMailSender.java b/spring-cloud-aws-ses/src/main/java/io/awspring/cloud/ses/SimpleEmailServiceMailSender.java index a89537199..928e5550f 100644 --- a/spring-cloud-aws-ses/src/main/java/io/awspring/cloud/ses/SimpleEmailServiceMailSender.java +++ b/spring-cloud-aws-ses/src/main/java/io/awspring/cloud/ses/SimpleEmailServiceMailSender.java @@ -27,14 +27,10 @@ import org.springframework.mail.SimpleMailMessage; import org.springframework.util.Assert; import org.springframework.util.StringUtils; -import software.amazon.awssdk.services.ses.SesClient; -import software.amazon.awssdk.services.ses.model.Body; -import software.amazon.awssdk.services.ses.model.Content; -import software.amazon.awssdk.services.ses.model.Destination; -import software.amazon.awssdk.services.ses.model.Message; -import software.amazon.awssdk.services.ses.model.SendEmailRequest; -import software.amazon.awssdk.services.ses.model.SendEmailResponse; -import software.amazon.awssdk.services.ses.model.SesException; +import software.amazon.awssdk.services.sesv2.SesV2Client; +import software.amazon.awssdk.services.sesv2.model.SendEmailRequest; +import software.amazon.awssdk.services.sesv2.model.SendEmailResponse; +import software.amazon.awssdk.services.sesv2.model.SesV2Exception; /** * Simple MailSender implementation to send E-Mails with the Amazon Simple Email Service. This implementation has no @@ -44,31 +40,32 @@ * @author Agim Emruli * @author Eddú Meléndez * @author Arun Patra + * @author Dominik Kovács */ public class SimpleEmailServiceMailSender implements MailSender, DisposableBean { private static final Logger LOGGER = LoggerFactory.getLogger(SimpleEmailServiceMailSender.class); - private final SesClient sesClient; + private final SesV2Client sesClient; @Nullable - private final String sourceArn; + private final String identityArn; @Nullable private final String configurationSetName; - public SimpleEmailServiceMailSender(SesClient sesClient) { + public SimpleEmailServiceMailSender(SesV2Client sesClient) { this(sesClient, null); } - public SimpleEmailServiceMailSender(SesClient sesClient, @Nullable String sourceArn) { - this(sesClient, sourceArn, null); + public SimpleEmailServiceMailSender(SesV2Client sesClient, @Nullable String identityArn) { + this(sesClient, identityArn, null); } - public SimpleEmailServiceMailSender(SesClient sesClient, @Nullable String sourceArn, + public SimpleEmailServiceMailSender(SesV2Client sesClient, @Nullable String identityArn, @Nullable String configurationSetName) { this.sesClient = sesClient; - this.sourceArn = sourceArn; + this.identityArn = identityArn; this.configurationSetName = configurationSetName; } @@ -95,7 +92,7 @@ public void send(SimpleMailMessage... simpleMessages) throws MailException { LOGGER.debug("Message with id: {} successfully send", sendEmailResult.messageId()); } } - catch (SesException e) { + catch (SesV2Exception e) { // Ignore Exception because we are collecting and throwing all if any // noinspection ThrowableResultOfMethodCallIgnored failedMessages.put(simpleMessage, e); @@ -108,13 +105,13 @@ public void send(SimpleMailMessage... simpleMessages) throws MailException { } - protected SesClient getEmailService() { + protected SesV2Client getEmailService() { return this.sesClient; } @Nullable - protected String getSourceArn() { - return sourceArn; + protected String getIdentityArn() { + return identityArn; } @Nullable @@ -124,26 +121,22 @@ protected String getConfigurationSetName() { private SendEmailRequest prepareMessage(SimpleMailMessage simpleMailMessage) { Assert.notNull(simpleMailMessage, "simpleMailMessage are required"); - Destination.Builder destinationBuilder = Destination.builder(); - if (simpleMailMessage.getTo() != null) { - destinationBuilder.toAddresses(simpleMailMessage.getTo()); - } - - if (simpleMailMessage.getCc() != null) { - destinationBuilder.ccAddresses(simpleMailMessage.getCc()); - } - - if (simpleMailMessage.getBcc() != null) { - destinationBuilder.bccAddresses(simpleMailMessage.getBcc()); - } - Content subject = Content.builder().data(simpleMailMessage.getSubject()).build(); - Body body = Body.builder().text(Content.builder().data(simpleMailMessage.getText()).build()).build(); - Message message = Message.builder().body(body).subject(subject).build(); - - SendEmailRequest.Builder emailRequestBuilder = SendEmailRequest.builder() - .destination(destinationBuilder.build()).source(simpleMailMessage.getFrom()).sourceArn(getSourceArn()) - .configurationSetName(getConfigurationSetName()).message(message); + SendEmailRequest.Builder emailRequestBuilder = SendEmailRequest.builder().destination(destination -> { + if (simpleMailMessage.getTo() != null) { + destination.toAddresses(simpleMailMessage.getTo()); + } + if (simpleMailMessage.getCc() != null) { + destination.ccAddresses(simpleMailMessage.getCc()); + } + if (simpleMailMessage.getBcc() != null) { + destination.bccAddresses(simpleMailMessage.getBcc()); + } + }).fromEmailAddress(simpleMailMessage.getFrom()).configurationSetName(getConfigurationSetName()) + .fromEmailAddressIdentityArn(getIdentityArn()) + .content(content -> content + .simple(message -> message.subject(subject -> subject.data(simpleMailMessage.getSubject())) + .body(body -> body.text(text -> text.data(simpleMailMessage.getText()))))); if (StringUtils.hasText(simpleMailMessage.getReplyTo())) { emailRequestBuilder.replyToAddresses(simpleMailMessage.getReplyTo()); 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..1c5632109 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 @@ -43,10 +43,10 @@ import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.mail.javamail.MimeMessagePreparator; -import software.amazon.awssdk.services.ses.SesClient; -import software.amazon.awssdk.services.ses.model.SendRawEmailRequest; -import software.amazon.awssdk.services.ses.model.SendRawEmailResponse; -import software.amazon.awssdk.services.ses.model.SesException; +import software.amazon.awssdk.services.sesv2.SesV2Client; +import software.amazon.awssdk.services.sesv2.model.SendEmailRequest; +import software.amazon.awssdk.services.sesv2.model.SendEmailResponse; +import software.amazon.awssdk.services.sesv2.model.SesV2Exception; /** * Tests for class {@link SimpleEmailServiceJavaMailSender}. @@ -54,6 +54,7 @@ * @author Eddú Meléndez * @author Maciej Walkowiak * @author Arun Patra + * @author Dominik Kovács */ class SimpleEmailServiceJavaMailSenderTest { @@ -67,7 +68,7 @@ void createMimeMessage_withDefaultPropertiesAndNoEncodingAndFileTypeMap_returnsS // Assert assertThat(mimeMessage).isNotNull(); - assertThat(mimeMessage.getSession().getProperties().size()).isEqualTo(0); + assertThat(mimeMessage.getSession().getProperties()).isEmpty(); } @Test @@ -147,28 +148,29 @@ void testCreateMimeMessageFromPreDefinedMessage() throws Exception { @Test void testSendMimeMessage() throws MessagingException { - SesClient emailService = mock(SesClient.class); + SesV2Client emailService = mock(SesV2Client.class); JavaMailSender mailSender = new SimpleEmailServiceJavaMailSender(emailService, "arn:aws:ses:us-east-1:00000001:identity/domain.com"); - ArgumentCaptor request = ArgumentCaptor.forClass(SendRawEmailRequest.class); - when(emailService.sendRawEmail(request.capture())) - .thenReturn(SendRawEmailResponse.builder().messageId("123").build()); + ArgumentCaptor request = ArgumentCaptor.forClass(SendEmailRequest.class); + when(emailService.sendEmail(request.capture())) + .thenReturn(SendEmailResponse.builder().messageId("123").build()); MimeMessage mimeMessage = createMimeMessage(); mailSender.send(mimeMessage); assertThat(mimeMessage.getMessageID()).isEqualTo("123"); - assertThat(request.getValue().sourceArn()).isEqualTo("arn:aws:ses:us-east-1:00000001:identity/domain.com"); + assertThat(request.getValue().fromEmailAddressIdentityArn()) + .isEqualTo("arn:aws:ses:us-east-1:00000001:identity/domain.com"); } @Test void testSendMimeMessageWithConfigurationSetNameSet() throws MessagingException { - SesClient emailService = mock(SesClient.class); + SesV2Client emailService = mock(SesV2Client.class); JavaMailSender mailSender = new SimpleEmailServiceJavaMailSender(emailService, null, "Configuration Set"); - ArgumentCaptor request = ArgumentCaptor.forClass(SendRawEmailRequest.class); - when(emailService.sendRawEmail(request.capture())) - .thenReturn(SendRawEmailResponse.builder().messageId("123").build()); + ArgumentCaptor request = ArgumentCaptor.forClass(SendEmailRequest.class); + when(emailService.sendEmail(request.capture())) + .thenReturn(SendEmailResponse.builder().messageId("123").build()); MimeMessage mimeMessage = createMimeMessage(); mailSender.send(mimeMessage); @@ -176,37 +178,22 @@ void testSendMimeMessageWithConfigurationSetNameSet() throws MessagingException assertThat(request.getValue().configurationSetName()).isEqualTo("Configuration Set"); } - @Test - void testSendMimeMessageWithFromArnSet() throws MessagingException { - SesClient emailService = mock(SesClient.class); - JavaMailSender mailSender = new SimpleEmailServiceJavaMailSender(emailService, null, null, - "eu-west-1:123456789012:identity/example.com"); - ArgumentCaptor request = ArgumentCaptor.forClass(SendRawEmailRequest.class); - when(emailService.sendRawEmail(request.capture())) - .thenReturn(SendRawEmailResponse.builder().messageId("123").build()); - MimeMessage mimeMessage = createMimeMessage(); - - mailSender.send(mimeMessage); - - assertThat(request.getValue().fromArn()).isEqualTo("eu-west-1:123456789012:identity/example.com"); - } - @Test void testSendMultipleMimeMessages() throws Exception { - SesClient emailService = mock(SesClient.class); + SesV2Client emailService = mock(SesV2Client.class); JavaMailSender mailSender = new SimpleEmailServiceJavaMailSender(emailService); - when(emailService.sendRawEmail(ArgumentMatchers.isA(SendRawEmailRequest.class))) - .thenReturn(SendRawEmailResponse.builder().messageId("123").build()); + when(emailService.sendEmail(ArgumentMatchers.isA(SendEmailRequest.class))) + .thenReturn(SendEmailResponse.builder().messageId("123").build()); mailSender.send(createMimeMessage(), createMimeMessage()); - verify(emailService, times(2)).sendRawEmail(ArgumentMatchers.isA(SendRawEmailRequest.class)); + verify(emailService, times(2)).sendEmail(ArgumentMatchers.isA(SendEmailRequest.class)); } @Test void testSendMailWithMimeMessagePreparator() throws Exception { - SesClient emailService = mock(SesClient.class); + SesV2Client emailService = mock(SesV2Client.class); JavaMailSender mailSender = new SimpleEmailServiceJavaMailSender(emailService); @@ -217,15 +204,15 @@ void testSendMailWithMimeMessagePreparator() throws Exception { mimeMessageHelper.setText("body"); }; - ArgumentCaptor request = ArgumentCaptor.forClass(SendRawEmailRequest.class); - when(emailService.sendRawEmail(request.capture())) - .thenReturn(SendRawEmailResponse.builder().messageId("123").build()); + ArgumentCaptor request = ArgumentCaptor.forClass(SendEmailRequest.class); + when(emailService.sendEmail(request.capture())) + .thenReturn(SendEmailResponse.builder().messageId("123").build()); mailSender.send(preparator); 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"); + new ByteArrayInputStream(request.getValue().content().raw().data().asByteArray())); + assertThat(mimeMessage.getRecipients(Message.RecipientType.TO)[0]).hasToString("to@domain.com"); assertThat(mimeMessage.getSubject()).isEqualTo("subject"); assertThat(mimeMessage.getContent()).isEqualTo("body"); } @@ -233,7 +220,7 @@ void testSendMailWithMimeMessagePreparator() throws Exception { @Test void testSendMailWithMultipleMimeMessagePreparators() throws Exception { - SesClient emailService = mock(SesClient.class); + SesV2Client emailService = mock(SesV2Client.class); JavaMailSender mailSender = new SimpleEmailServiceJavaMailSender(emailService); @@ -253,15 +240,15 @@ void testSendMailWithMultipleMimeMessagePreparators() throws Exception { mimeMessageHelper.setText("body"); }; - ArgumentCaptor request = ArgumentCaptor.forClass(SendRawEmailRequest.class); - when(emailService.sendRawEmail(request.capture())) - .thenReturn(SendRawEmailResponse.builder().messageId("123").build()); + ArgumentCaptor request = ArgumentCaptor.forClass(SendEmailRequest.class); + when(emailService.sendEmail(request.capture())) + .thenReturn(SendEmailResponse.builder().messageId("123").build()); 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"); + new ByteArrayInputStream(request.getValue().content().raw().data().asByteArray())); + assertThat(mimeMessage.getRecipients(Message.RecipientType.TO)[0]).hasToString("to@domain.com"); assertThat(mimeMessage.getSubject()).isEqualTo("subject"); assertThat(mimeMessage.getContent()).isEqualTo("body"); @@ -271,7 +258,7 @@ void testSendMailWithMultipleMimeMessagePreparators() throws Exception { void testCreateMimeMessageWithExceptionInInputStream() throws Exception { InputStream inputStream = mock(InputStream.class); - SesClient emailService = mock(SesClient.class); + SesV2Client emailService = mock(SesV2Client.class); JavaMailSender mailSender = new SimpleEmailServiceJavaMailSender(emailService); @@ -291,30 +278,30 @@ void testCreateMimeMessageWithExceptionInInputStream() throws Exception { @Test void testSendMultipleMailsWithException() throws Exception { - SesClient emailService = mock(SesClient.class); + SesV2Client emailService = mock(SesV2Client.class); JavaMailSender mailSender = new SimpleEmailServiceJavaMailSender(emailService); MimeMessage failureMail = createMimeMessage(); - when(emailService.sendRawEmail(ArgumentMatchers.isA(SendRawEmailRequest.class))) - .thenReturn(SendRawEmailResponse.builder().build()) - .thenThrow(SesException.builder().message("error").build()) - .thenReturn(SendRawEmailResponse.builder().build()); + when(emailService.sendEmail(ArgumentMatchers.isA(SendEmailRequest.class))) + .thenReturn(SendEmailResponse.builder().build()) + .thenThrow(SesV2Exception.builder().message("error").build()) + .thenReturn(SendEmailResponse.builder().build()); try { mailSender.send(createMimeMessage(), failureMail, createMimeMessage()); fail("Exception expected due to error while sending mail"); } catch (MailSendException e) { - assertThat(e.getFailedMessages().size()).isEqualTo(1); - assertThat(e.getFailedMessages().containsKey(failureMail)).isTrue(); + assertThat(e.getFailedMessages()).hasSize(1); + assertThat(e.getFailedMessages()).containsKey(failureMail); } } @Test void testSendMailsWithExceptionWhilePreparing() { - SesClient emailService = mock(SesClient.class); + SesV2Client emailService = mock(SesV2Client.class); JavaMailSender mailSender = new SimpleEmailServiceJavaMailSender(emailService); @@ -326,9 +313,9 @@ void testSendMailsWithExceptionWhilePreparing() { } catch (MailSendException e) { // expected due to empty mail message - assertThat(e.getFailedMessages().size()).isEqualTo(1); + assertThat(e.getFailedMessages()).hasSize(1); // noinspection ThrowableResultOfMethodCallIgnored - assertThat(e.getFailedMessages().get(mimeMessage) instanceof MailPreparationException).isTrue(); + assertThat(e.getFailedMessages().get(mimeMessage)).isInstanceOf(MailPreparationException.class); } MimeMessage failureMessage = null; @@ -345,9 +332,9 @@ public void writeTo(OutputStream os) throws MessagingException { } catch (MailSendException e) { // expected due to exception writing message - assertThat(e.getFailedMessages().size()).isEqualTo(1); + assertThat(e.getFailedMessages()).hasSize(1); // noinspection ThrowableResultOfMethodCallIgnored - assertThat(e.getFailedMessages().get(failureMessage) instanceof MailParseException).isTrue(); + assertThat(e.getFailedMessages().get(failureMessage)).isInstanceOf(MailParseException.class); } } diff --git a/spring-cloud-aws-ses/src/test/java/io/awspring/cloud/ses/SimpleEmailServiceMailSenderTest.java b/spring-cloud-aws-ses/src/test/java/io/awspring/cloud/ses/SimpleEmailServiceMailSenderTest.java index e506e6f98..588d8ac1d 100644 --- a/spring-cloud-aws-ses/src/test/java/io/awspring/cloud/ses/SimpleEmailServiceMailSenderTest.java +++ b/spring-cloud-aws-ses/src/test/java/io/awspring/cloud/ses/SimpleEmailServiceMailSenderTest.java @@ -28,10 +28,10 @@ import org.mockito.ArgumentMatchers; import org.springframework.mail.MailSendException; import org.springframework.mail.SimpleMailMessage; -import software.amazon.awssdk.services.ses.SesClient; -import software.amazon.awssdk.services.ses.model.SendEmailRequest; -import software.amazon.awssdk.services.ses.model.SendEmailResponse; -import software.amazon.awssdk.services.ses.model.SesException; +import software.amazon.awssdk.services.sesv2.SesV2Client; +import software.amazon.awssdk.services.sesv2.model.SendEmailRequest; +import software.amazon.awssdk.services.sesv2.model.SendEmailResponse; +import software.amazon.awssdk.services.sesv2.model.SesV2Exception; /** * Tests for {@link SimpleEmailServiceMailSender}. @@ -39,12 +39,13 @@ * @author Eddú Meléndez * @author Maciej Walkowiak * @author Arun Patra + * @author Dominik Kovács */ class SimpleEmailServiceMailSenderTest { @Test void testSendSimpleMailWithMinimalProperties() { - SesClient emailService = mock(SesClient.class); + SesV2Client emailService = mock(SesV2Client.class); SimpleEmailServiceMailSender mailSender = new SimpleEmailServiceMailSender(emailService, "arn:aws:ses:us-east-1:00000000:identity/domain.com"); @@ -57,19 +58,20 @@ void testSendSimpleMailWithMinimalProperties() { mailSender.send(simpleMailMessage); SendEmailRequest sendEmailRequest = request.getValue(); - assertThat(sendEmailRequest.source()).isEqualTo(simpleMailMessage.getFrom()); + assertThat(sendEmailRequest.fromEmailAddress()).isEqualTo(simpleMailMessage.getFrom()); assertThat(sendEmailRequest.destination().toAddresses().get(0)) .isEqualTo(Objects.requireNonNull(simpleMailMessage.getTo())[0]); - assertThat(sendEmailRequest.message().subject().data()).isEqualTo(simpleMailMessage.getSubject()); - assertThat(sendEmailRequest.message().body().text().data()).isEqualTo(simpleMailMessage.getText()); - assertThat(sendEmailRequest.destination().ccAddresses().size()).isEqualTo(0); - assertThat(sendEmailRequest.destination().bccAddresses().size()).isEqualTo(0); - assertThat(sendEmailRequest.sourceArn()).isEqualTo("arn:aws:ses:us-east-1:00000000:identity/domain.com"); + assertThat(sendEmailRequest.content().simple().subject().data()).isEqualTo(simpleMailMessage.getSubject()); + assertThat(sendEmailRequest.content().simple().body().text().data()).isEqualTo(simpleMailMessage.getText()); + assertThat(sendEmailRequest.destination().ccAddresses()).isEmpty(); + assertThat(sendEmailRequest.destination().bccAddresses()).isEmpty(); + assertThat(sendEmailRequest.fromEmailAddressIdentityArn()) + .isEqualTo("arn:aws:ses:us-east-1:00000000:identity/domain.com"); } @Test void testSendSimpleMailWithConfigurationSetNameSet() { - SesClient emailService = mock(SesClient.class); + SesV2Client emailService = mock(SesV2Client.class); SimpleEmailServiceMailSender mailSender = new SimpleEmailServiceMailSender(emailService, null, "Configuration Set"); SimpleMailMessage simpleMailMessage = createSimpleMailMessage(); @@ -85,7 +87,7 @@ void testSendSimpleMailWithConfigurationSetNameSet() { @Test void testSendSimpleMailWithCCandBCC() { - SesClient emailService = mock(SesClient.class); + SesV2Client emailService = mock(SesV2Client.class); SimpleEmailServiceMailSender mailSender = new SimpleEmailServiceMailSender(emailService); SimpleMailMessage simpleMailMessage = createSimpleMailMessage(); @@ -99,11 +101,11 @@ void testSendSimpleMailWithCCandBCC() { mailSender.send(simpleMailMessage); SendEmailRequest sendEmailRequest = request.getValue(); - assertThat(sendEmailRequest.source()).isEqualTo(simpleMailMessage.getFrom()); + assertThat(sendEmailRequest.fromEmailAddress()).isEqualTo(simpleMailMessage.getFrom()); assertThat(sendEmailRequest.destination().toAddresses().get(0)) .isEqualTo(Objects.requireNonNull(simpleMailMessage.getTo())[0]); - assertThat(sendEmailRequest.message().subject().data()).isEqualTo(simpleMailMessage.getSubject()); - assertThat(sendEmailRequest.message().body().text().data()).isEqualTo(simpleMailMessage.getText()); + assertThat(sendEmailRequest.content().simple().subject().data()).isEqualTo(simpleMailMessage.getSubject()); + assertThat(sendEmailRequest.content().simple().body().text().data()).isEqualTo(simpleMailMessage.getText()); assertThat(sendEmailRequest.destination().ccAddresses().get(0)) .isEqualTo(Objects.requireNonNull(simpleMailMessage.getCc())[0]); assertThat(sendEmailRequest.destination().bccAddresses().get(0)) @@ -112,7 +114,7 @@ void testSendSimpleMailWithCCandBCC() { @Test void testSendSimpleMailWithNoTo() { - SesClient emailService = mock(SesClient.class); + SesV2Client emailService = mock(SesV2Client.class); SimpleEmailServiceMailSender mailSender = new SimpleEmailServiceMailSender(emailService); // Not using createSimpleMailMessage as we don't want the to address set. @@ -130,15 +132,15 @@ void testSendSimpleMailWithNoTo() { mailSender.send(simpleMailMessage); SendEmailRequest sendEmailRequest = request.getValue(); - assertThat(sendEmailRequest.message().subject().data()).isEqualTo(simpleMailMessage.getSubject()); - assertThat(sendEmailRequest.message().body().text().data()).isEqualTo(simpleMailMessage.getText()); + assertThat(sendEmailRequest.content().simple().subject().data()).isEqualTo(simpleMailMessage.getSubject()); + assertThat(sendEmailRequest.content().simple().body().text().data()).isEqualTo(simpleMailMessage.getText()); assertThat(sendEmailRequest.destination().bccAddresses().get(0)) .isEqualTo(Objects.requireNonNull(simpleMailMessage.getBcc())[0]); } @Test void testSendMultipleMails() { - SesClient emailService = mock(SesClient.class); + SesV2Client emailService = mock(SesV2Client.class); SimpleEmailServiceMailSender mailSender = new SimpleEmailServiceMailSender(emailService); ArgumentCaptor request = ArgumentCaptor.forClass(SendEmailRequest.class); @@ -151,7 +153,7 @@ void testSendMultipleMails() { @Test void testSendMultipleMailsWithExceptionWhileSending() { - SesClient emailService = mock(SesClient.class); + SesV2Client emailService = mock(SesV2Client.class); SimpleEmailServiceMailSender mailSender = new SimpleEmailServiceMailSender(emailService); SimpleMailMessage firstMessage = createSimpleMailMessage(); @@ -160,7 +162,7 @@ void testSendMultipleMailsWithExceptionWhileSending() { SimpleMailMessage failureMail = createSimpleMailMessage(); when(emailService.sendEmail(ArgumentMatchers.isA(SendEmailRequest.class))) .thenReturn(SendEmailResponse.builder().build()) - .thenThrow(SesException.builder().message("error").build()) + .thenThrow(SesV2Exception.builder().message("error").build()) .thenReturn(SendEmailResponse.builder().build()); SimpleMailMessage thirdMessage = createSimpleMailMessage(); @@ -170,14 +172,14 @@ void testSendMultipleMailsWithExceptionWhileSending() { fail("Exception expected due to error while sending mail"); } catch (MailSendException e) { - assertThat(e.getFailedMessages().size()).isEqualTo(1); - assertThat(e.getFailedMessages().containsKey(failureMail)).isTrue(); + assertThat(e.getFailedMessages()).hasSize(1); + assertThat(e.getFailedMessages()).containsKey(failureMail); } } @Test void testShutDownOfResources() { - SesClient emailService = mock(SesClient.class); + SesV2Client emailService = mock(SesV2Client.class); SimpleEmailServiceMailSender mailSender = new SimpleEmailServiceMailSender(emailService); mailSender.destroy(); diff --git a/spring-cloud-aws-testcontainers/src/test/java/io/awspring/cloud/testcontainers/AwsContainerConnectionDetailsFactoryTest.java b/spring-cloud-aws-testcontainers/src/test/java/io/awspring/cloud/testcontainers/AwsContainerConnectionDetailsFactoryTest.java index d3cdf2f90..40a85f065 100644 --- a/spring-cloud-aws-testcontainers/src/test/java/io/awspring/cloud/testcontainers/AwsContainerConnectionDetailsFactoryTest.java +++ b/spring-cloud-aws-testcontainers/src/test/java/io/awspring/cloud/testcontainers/AwsContainerConnectionDetailsFactoryTest.java @@ -17,7 +17,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; -import static org.junit.jupiter.api.Assertions.*; import io.awspring.cloud.autoconfigure.core.AwsAutoConfiguration; import io.awspring.cloud.autoconfigure.core.AwsConnectionDetails; @@ -40,7 +39,8 @@ import org.testcontainers.utility.DockerImageName; import software.amazon.awssdk.services.dynamodb.DynamoDbClient; import software.amazon.awssdk.services.s3.S3Client; -import software.amazon.awssdk.services.ses.SesClient; +import software.amazon.awssdk.services.sesv2.SesV2Client; +import software.amazon.awssdk.services.sesv2.model.ListEmailIdentitiesRequest; import software.amazon.awssdk.services.sns.SnsClient; import software.amazon.awssdk.services.sqs.SqsAsyncClient; @@ -69,8 +69,9 @@ void configuresDynamoDbClientWithServiceConnection(@Autowired DynamoDbClient cli } @Test - void configuresSesClientWithServiceConnection(@Autowired SesClient client) { - assertThatCode(client::listIdentities).doesNotThrowAnyException(); + void configuresSesClientWithServiceConnection(@Autowired SesV2Client client) { + assertThatCode(() -> client.listEmailIdentities(ListEmailIdentitiesRequest.builder().build())) + .doesNotThrowAnyException(); } @Test