package com.sequenceiq.cloudbreak.conf; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Properties; import javax.mail.internet.MimeMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.mail.MailException; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.mail.javamail.MimeMessagePreparator; import org.springframework.util.StringUtils; @Configuration public class MailSenderConfig { @Value("${cb.smtp.sender.host:}") private String host; @Value("${cb.smtp.sender.port:}") private int port; @Value("${cb.smtp.sender.username:}") private String userName; @Value("${cb.smtp.sender.password:}") private String password; @Value("${cb.smtp.sender.from:}") private String msgFrom; @Value("${cb.mail.smtp.auth:}") private String smtpAuth; @Value("${cb.mail.smtp.starttls.enable:}") private String smtpStarttlsEnable; @Value("${cb.mail.smtp.type:}") private String smtpType; @Bean public JavaMailSender mailSender() { JavaMailSender mailSender; if (isMailSendingConfigured()) { mailSender = new JavaMailSenderImpl(); ((JavaMailSenderImpl) mailSender).setHost(host); ((JavaMailSenderImpl) mailSender).setPort(port); if (!StringUtils.isEmpty(userName)) { ((JavaMailSenderImpl) mailSender).setUsername(userName); } if (!StringUtils.isEmpty(password)) { ((JavaMailSenderImpl) mailSender).setPassword(password); } ((JavaMailSenderImpl) mailSender).setJavaMailProperties(getJavaMailProperties()); } else { mailSender = new DummyEmailSender(); } return mailSender; } private boolean isMailSendingConfigured() { // some SMTP servers don't need username/password return !StringUtils.isEmpty(host) && !StringUtils.isEmpty(msgFrom); } private String missingVars() { List<String> missingVars = new ArrayList(); if (StringUtils.isEmpty(host)) { missingVars.add("cb.smtp.sender.host"); } if (StringUtils.isEmpty(userName)) { missingVars.add("cb.smtp.sender.username"); } if (StringUtils.isEmpty(password)) { missingVars.add("cb.smtp.sender.password"); } if (StringUtils.isEmpty(msgFrom)) { missingVars.add("cb.smtp.sender.from"); } return StringUtils.collectionToDelimitedString(missingVars, ",", "[", "]"); } private Properties getJavaMailProperties() { Properties props = new Properties(); props.put("mail.transport.protocol", smtpType); props.put("mail.smtp.auth", smtpAuth); props.put("mail.smtp.starttls.enable", smtpStarttlsEnable); props.put("mail.debug", true); return props; } private final class DummyEmailSender implements JavaMailSender { private final Logger logger = LoggerFactory.getLogger(DummyEmailSender.class); private final String msg = "SMTP not configured! Related configuration entries: " + missingVars(); @Override public MimeMessage createMimeMessage() { return null; } @Override public MimeMessage createMimeMessage(InputStream contentStream) throws MailException { return null; } @Override public void send(MimeMessage mimeMessage) throws MailException { logger.info(msg); } @Override public void send(MimeMessage[] mimeMessages) throws MailException { logger.info(msg); } @Override public void send(MimeMessagePreparator mimeMessagePreparator) throws MailException { logger.info(msg); } @Override public void send(MimeMessagePreparator[] mimeMessagePreparators) throws MailException { logger.info(msg); } @Override public void send(SimpleMailMessage simpleMessage) throws MailException { logger.info(msg); } @Override public void send(SimpleMailMessage[] simpleMessages) throws MailException { logger.info(msg); } } }