如何在springboot中配置两个不同的电子邮件?

nar*_*ana 2 java email spring spring-boot

我知道我可以使用以下属性来自动创建一个JavaMailSenderbean:

spring.mail.host=hostname
spring.mail.port=587
spring.mail.username=username
spring.mail.password=password
Run Code Online (Sandbox Code Playgroud)

但是,如何定义这些属性来创建两个 JavaMailSenderbean,以便我可以从不同的 SMTP 服务器发送电子邮件?

我尝试定义以下属性:

# Properties for sender 1
spring.mail.host=hostname
spring.mail.port=587
spring.mail.username=username
spring.mail.password=password

# Properties for sender 2
spring.mail.host1=hostname2
spring.mail.port1=587
spring.mail.username1=username2
spring.mail.password1=password2
Run Code Online (Sandbox Code Playgroud)

但是,这并不像我预期的那样工作,那么如何JavaMailSender使用 Spring boot创建两个bean?

g00*_*00b 13

创建 bean

Spring boot 只会JavaMailSender在找到spring.mail.*属性后立即初始化一个。如果需要多个bean,则必须自己定义这些bean。如果你只需要属性主机、端口、用户名和密码,你可以使用这个简单的配置:

@Configuration
public class MailConfiguration {

    @Bean
    @ConfigurationProperties(prefix = "spring.mail.primary")
    public JavaMailSender primarySender() {
        return new JavaMailSenderImpl();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.mail.secondary")
    public JavaMailSender secondarySender() {
        return new JavaMailSenderImpl();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您还想进行配置,这将不起作用spring.mail.properties.*。为此,您的配置会稍微复杂一些,因为您必须执行以下操作:

  • 创建两个MailProperties使用相同的bean,@ConfigurationProperties如您在上面看到的那样。
  • 使用MailProperties在如春天启动内做了类似的方式MailSenderPropertiesConfiguration

配置

之后,您可以按照习惯使用spring.mail.primary.*属性和spring.mail.secondary.*属性。例如:

spring.mail.primary.host=host1
spring.mail.primary.port=port1
spring.mail.primary.username=username1
spring.mail.primary.password=password1
spring.mail.secondary.host=host2
spring.mail.secondary.port=port2
spring.mail.secondary.username=username2
spring.mail.secondary.password=password2
Run Code Online (Sandbox Code Playgroud)

用法

之后,您可以自动装配primarySendersecondarySender。确保使用@Qualifier注释来告诉 Spring 哪个是哪个:

@Service
public class MailService {
    private JavaMailSender primarySender;
    private JavaMailSender secondarySender;

    public MailService(
        @Qualifier("primarySender") JavaMailSender primarySender,
        @Qualifier("secondarySender") JavaMailSender secondarySender) {
        this.primarySender = primarySender;
        this.secondarySender = secondarySender;
    }
}
Run Code Online (Sandbox Code Playgroud)