|
|
@ -18,23 +18,26 @@ package org.springframework.boot.autoconfigure.mail;
|
|
|
|
|
|
|
|
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Properties;
|
|
|
|
import java.util.Properties;
|
|
|
|
|
|
|
|
|
|
|
|
import javax.activation.MimeType;
|
|
|
|
import javax.activation.MimeType;
|
|
|
|
|
|
|
|
import javax.annotation.PostConstruct;
|
|
|
|
|
|
|
|
import javax.mail.MessagingException;
|
|
|
|
import javax.mail.Session;
|
|
|
|
import javax.mail.Session;
|
|
|
|
import javax.mail.internet.MimeMessage;
|
|
|
|
import javax.mail.internet.MimeMessage;
|
|
|
|
|
|
|
|
import javax.naming.NamingException;
|
|
|
|
|
|
|
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
|
|
|
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
|
|
|
import org.springframework.boot.autoconfigure.condition.AnyNestedCondition;
|
|
|
|
import org.springframework.boot.autoconfigure.condition.AnyNestedCondition;
|
|
|
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
|
|
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
|
|
|
|
|
|
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnJndi;
|
|
|
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
|
|
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
|
|
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
|
|
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
|
|
|
import org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration.MailSenderCondition;
|
|
|
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
|
|
|
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
|
|
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
|
|
|
import org.springframework.context.annotation.Bean;
|
|
|
|
import org.springframework.context.annotation.Bean;
|
|
|
|
import org.springframework.context.annotation.Conditional;
|
|
|
|
import org.springframework.context.annotation.Conditional;
|
|
|
|
import org.springframework.context.annotation.Configuration;
|
|
|
|
import org.springframework.context.annotation.Configuration;
|
|
|
|
import org.springframework.context.annotation.Import;
|
|
|
|
import org.springframework.jndi.JndiLocatorDelegate;
|
|
|
|
import org.springframework.mail.MailSender;
|
|
|
|
import org.springframework.mail.MailSender;
|
|
|
|
import org.springframework.mail.javamail.JavaMailSenderImpl;
|
|
|
|
import org.springframework.mail.javamail.JavaMailSenderImpl;
|
|
|
|
|
|
|
|
|
|
|
@ -48,67 +51,116 @@ import org.springframework.mail.javamail.JavaMailSenderImpl;
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
@Configuration
|
|
|
|
@Configuration
|
|
|
|
@ConditionalOnClass({ MimeMessage.class, MimeType.class })
|
|
|
|
@ConditionalOnClass({ MimeMessage.class, MimeType.class })
|
|
|
|
@ConditionalOnMissingBean(MailSender.class)
|
|
|
|
|
|
|
|
@Conditional(MailSenderCondition.class)
|
|
|
|
|
|
|
|
@EnableConfigurationProperties(MailProperties.class)
|
|
|
|
@EnableConfigurationProperties(MailProperties.class)
|
|
|
|
@Import(JndiSessionConfiguration.class)
|
|
|
|
|
|
|
|
public class MailSenderAutoConfiguration {
|
|
|
|
public class MailSenderAutoConfiguration {
|
|
|
|
|
|
|
|
|
|
|
|
@Autowired(required = false)
|
|
|
|
@Configuration
|
|
|
|
private Session session;
|
|
|
|
@ConditionalOnClass(Session.class)
|
|
|
|
|
|
|
|
@ConditionalOnProperty(prefix = "spring.mail", name = "jndi-name")
|
|
|
|
|
|
|
|
@ConditionalOnJndi
|
|
|
|
|
|
|
|
static class JndiSessionConfiguration {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
|
|
|
private MailProperties properties;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Bean
|
|
|
|
|
|
|
|
@ConditionalOnMissingBean
|
|
|
|
|
|
|
|
public Session session() {
|
|
|
|
|
|
|
|
String jndiName = this.properties.getJndiName();
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
return new JndiLocatorDelegate().lookup(jndiName, Session.class);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
catch (NamingException ex) {
|
|
|
|
|
|
|
|
throw new IllegalStateException(String.format(
|
|
|
|
|
|
|
|
"Unable to find Session in JNDI location %s", jndiName), ex);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
}
|
|
|
|
private MailProperties properties;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Bean
|
|
|
|
@ConditionalOnMissingBean(MailSender.class)
|
|
|
|
public JavaMailSenderImpl mailSender() {
|
|
|
|
@Conditional(MailSenderConfiguration.MailSenderCondition.class)
|
|
|
|
JavaMailSenderImpl sender = new JavaMailSenderImpl();
|
|
|
|
static class MailSenderConfiguration {
|
|
|
|
if (this.session != null) {
|
|
|
|
|
|
|
|
sender.setSession(this.session);
|
|
|
|
@Autowired
|
|
|
|
|
|
|
|
private MailProperties properties;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Autowired(required = false)
|
|
|
|
|
|
|
|
private Session session;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Bean
|
|
|
|
|
|
|
|
public JavaMailSenderImpl mailSender() {
|
|
|
|
|
|
|
|
JavaMailSenderImpl sender = new JavaMailSenderImpl();
|
|
|
|
|
|
|
|
if (this.session != null) {
|
|
|
|
|
|
|
|
sender.setSession(this.session);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
applyProperties(sender);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return sender;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
|
|
|
|
applyProperties(sender);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return sender;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void applyProperties(JavaMailSenderImpl sender) {
|
|
|
|
private void applyProperties(JavaMailSenderImpl sender) {
|
|
|
|
sender.setHost(this.properties.getHost());
|
|
|
|
sender.setHost(this.properties.getHost());
|
|
|
|
if (this.properties.getPort() != null) {
|
|
|
|
if (this.properties.getPort() != null) {
|
|
|
|
sender.setPort(this.properties.getPort());
|
|
|
|
sender.setPort(this.properties.getPort());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
sender.setUsername(this.properties.getUsername());
|
|
|
|
|
|
|
|
sender.setPassword(this.properties.getPassword());
|
|
|
|
|
|
|
|
sender.setDefaultEncoding(this.properties.getDefaultEncoding());
|
|
|
|
|
|
|
|
if (!this.properties.getProperties().isEmpty()) {
|
|
|
|
|
|
|
|
sender.setJavaMailProperties(asProperties(this.properties.getProperties()));
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
sender.setUsername(this.properties.getUsername());
|
|
|
|
|
|
|
|
sender.setPassword(this.properties.getPassword());
|
|
|
|
private Properties asProperties(Map<String, String> source) {
|
|
|
|
sender.setDefaultEncoding(this.properties.getDefaultEncoding());
|
|
|
|
Properties properties = new Properties();
|
|
|
|
if (!this.properties.getProperties().isEmpty()) {
|
|
|
|
properties.putAll(source);
|
|
|
|
sender.setJavaMailProperties(asProperties(this.properties.getProperties()));
|
|
|
|
return properties;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private Properties asProperties(Map<String, String> source) {
|
|
|
|
/**
|
|
|
|
Properties properties = new Properties();
|
|
|
|
* Condition to trigger the creation of a {@link JavaMailSenderImpl}. This kicks in if
|
|
|
|
properties.putAll(source);
|
|
|
|
* either the host or jndi name property is set.
|
|
|
|
return properties;
|
|
|
|
*/
|
|
|
|
}
|
|
|
|
static class MailSenderCondition extends AnyNestedCondition {
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
public MailSenderCondition() {
|
|
|
|
* Condition to trigger the creation of a {@link JavaMailSenderImpl}. This kicks in if
|
|
|
|
super(ConfigurationPhase.PARSE_CONFIGURATION);
|
|
|
|
* either the host or jndi name property is set.
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
|
|
|
static class MailSenderCondition extends AnyNestedCondition {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public MailSenderCondition() {
|
|
|
|
@ConditionalOnProperty(prefix = "spring.mail", name = "host")
|
|
|
|
super(ConfigurationPhase.PARSE_CONFIGURATION);
|
|
|
|
static class HostProperty {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ConditionalOnProperty(prefix = "spring.mail", name = "host")
|
|
|
|
@ConditionalOnProperty(prefix = "spring.mail", name = "jndi-name")
|
|
|
|
static class HostProperty {
|
|
|
|
static class JndiNameProperty {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ConditionalOnProperty(prefix = "spring.mail", name = "jndi-name")
|
|
|
|
|
|
|
|
static class JndiNameProperty {
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Configuration
|
|
|
|
|
|
|
|
@ConditionalOnSingleCandidate(JavaMailSenderImpl.class)
|
|
|
|
|
|
|
|
static class MailSenderValidator {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
|
|
|
private MailProperties properties;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
|
|
|
private JavaMailSenderImpl mailSender;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@PostConstruct
|
|
|
|
|
|
|
|
public void validateConnection() {
|
|
|
|
|
|
|
|
if (this.properties.isTestConnection()) {
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
this.mailSender.testConnection();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
catch (MessagingException ex) {
|
|
|
|
|
|
|
|
throw new IllegalStateException("Mail server is not unavailable", ex);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|