Spring Boot 应用程序中是否可以有两种 MailSender 实现?

问题描述 投票:0回答:1

我有一个 Spring Boot 应用程序,其中有一个电子邮件发送部分。我想将 SMTP org.springframework.mail.javamailJavaMailSenderImpl 与我的“dev”配置文件一起使用,并将 AWS SES 实现 io.awspring.cloud.ses.SimpleEmailServiceMailSender 与我的“prod”配置文件一起使用。两者都实现了 org.springframework.mail.MailSender。让它发挥作用的“正确”方法是什么?

spring spring-boot spring-cloud amazon-ses
1个回答
0
投票

我认为正确的解决方案是使用属性在 MailSender 实现之间进行切换。

为此,您需要知道每个邮件发件人是在什么条件下创建的。这是在 Spring Boot 的相应 AutoConfiguration 类中定义的。

仅当设置了

JavaMailSenderImpl
spring.mail.host
属性时,才会创建
spring.mail.jndi-name
Bean。 请参阅:https://github.com/spring-projects/spring-boot/blob/main/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mail /MailSenderAutoConfiguration.java

仅当

SimpleEmailServiceJavaMailSender
spring.cloud.aws.ses.enabled
或根本未设置时,才会创建
true
Bean。 请参阅:https://github.com/awspring/spring-cloud-aws/blob/main/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/ses/SesAutoConfiguration.java

这意味着你必须这样配置:

在开发属性中(仅 JavaMailSenderImpl):

spring.mail.host=... # must be set
spring.cloud.aws.ses.enabled=false # must be false

在产品属性中(仅限 SimpleEmailServiceJavaMailSender):

# Do not set spring.mail.host at all
spring.cloud.aws.ses.enabled=true # can be true or omitted

要使用它们,您只需注入

MailSender
JavaMailSender
接口,它将使用基于属性的实现

© www.soinside.com 2019 - 2024. All rights reserved.