springboot带有spring-boot-starter-mail包,可用于发送邮件。但是SpringBoot mail默认只能配置一个账号,为了支持多个账号,需要自定义IOC的机制。
查看Springboot mail相关的源代码,发现邮件的配置主要是在类MailSenderPropertiesConfiguration里完成,这里会配置JavaMailSender和MailProperties里,因此解决问题的关键是重写MailSenderPropertiesConfiguration类,能够按照自定义的prefix配置单独的JavaMailSender和MailProperties。
@Configuration
public class MyMailConfig {
@Bean
@ConfigurationProperties(prefix = "spring.mail.mysender1")
public MailProperties mysender1Properties() {
return new MailProperties();
}
@Bean
@ConfigurationProperties(prefix = "spring.mail.mysender1")
public JavaMailSender mysender1(MailProperties mysender1Properties) {
JavaMailSenderImpl sender = new JavaMailSenderImpl();
this.applyProperties(sender, mysender1Properties);
return sender;
}
private void applyProperties(JavaMailSenderImpl sender, MailProperties properties) {
sender.setHost(properties.getHost());
if (properties.getPort() != null) {
sender.setPort(properties.getPort());
}
sender.setUsername(properties.getUsername());
sender.setPassword(properties.getPassword());
sender.setProtocol(properties.getProtocol());
if (properties.getDefaultEncoding() != null) {
sender.setDefaultEncoding(properties.getDefaultEncoding().name());
}
if (!properties.getProperties().isEmpty()) {
sender.setJavaMailProperties(asProperties(properties.getProperties()));
}
}
private Properties asProperties(Map<String, String> source) {
Properties properties = new Properties();
properties.putAll(source);
return properties;
}
}
这样所有的配置都是在spring.mail.mysender下设置,如
spring.mail.mysender.host=your_ip
spring.mail.mysender.port=465
spring.mail.mysender.properties.mail.smtp.auth=true
spring.mail.mysender.properties.mail.smtp.connectiontimeout=5000
spring.mail.mysender.properties.mail.smtp.timeout=5000
spring.mail.mysender.properties.mail.smtp.writetimeout=5000
spring.mail.mysender.properties.mail.smtp.socketFactory.port = 465
spring.mail.mysender.properties.mail.smtp.socketFactory.class = javax.net.ssl.SSLSocketFactory
spring.mail.mysender.username=user_name
spring.mail.mysender.password=password
调用时,只需要注解
@Autowired
private JavaMailSender mysender1;