All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io._57blocks.email.config.EmailServiceAutoConfig Maven / Gradle / Ivy

Go to download

Email service based on spring-boot and provide an easy way to integrate spring-mail or aws ses.

There is a newer version: 0.2.0
Show newest version
package io._57blocks.email.config;

import io._57blocks.email.DummyEmailServiceImpl;
import io._57blocks.email.EmailService;
import io._57blocks.email.EmailServiceImpl;
import io._57blocks.email.config.properties.EmailServiceProperties;
import io._57blocks.email.config.properties.EmailServiceProperties.TemplateResolverProperties;
import java.util.Collections;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.mail.javamail.JavaMailSender;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
import org.thymeleaf.templateresolver.ITemplateResolver;

@Configuration
@ConditionalOnClass(EmailService.class)
@EnableConfigurationProperties(EmailServiceProperties.class)
public class EmailServiceAutoConfig {

  @Autowired
  private EmailServiceProperties properties;

  @Autowired
  private JavaMailSender mailSender;

  private ResourceBundleMessageSource emailMessageSource() {
    final ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasename(properties.getTemplate().getFullMessageBaseName());

    return messageSource;
  }

  private TemplateEngine emailTemplateEngine() {
    final SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    // Resolver for TEXT emails
    templateEngine.addTemplateResolver(textTemplateResolver());
    // Resolver for HTML emails (except the editable one)
    templateEngine.addTemplateResolver(htmlTemplateResolver());
    // Resolver for Subject
    templateEngine.addTemplateResolver(subjectTemplateResolver());
    // Message source, internationalization specific to emails
    templateEngine.setTemplateEngineMessageSource(emailMessageSource());

    return templateEngine;
  }

  private ITemplateResolver textTemplateResolver() {
    return createTemplateResolver(properties.getTemplate().getText(), TemplateMode.TEXT);
  }

  private ITemplateResolver htmlTemplateResolver() {
    return createTemplateResolver(properties.getTemplate().getHtml(), TemplateMode.HTML);
  }

  private ITemplateResolver subjectTemplateResolver() {
    return createTemplateResolver(properties.getTemplate().getSubject(), TemplateMode.TEXT);
  }

  private ITemplateResolver createTemplateResolver(TemplateResolverProperties props,
      TemplateMode templateMode) {
    final ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
    templateResolver.setOrder(props.getOrder());
    templateResolver.setResolvablePatterns(Collections.singleton(props.getPattern()));
    templateResolver.setPrefix(properties.getTemplate().getPrefix());
    templateResolver.setSuffix(props.getSuffix());
    templateResolver.setTemplateMode(templateMode);
    templateResolver.setCharacterEncoding(props.getCharacterEncoding());
    templateResolver.setCacheable(props.getCacheable());
    return templateResolver;
  }

  @Bean
  @ConditionalOnMissingBean
  public EmailService htmlEmailService() {
    if (properties.getEnabled()) {
      return new EmailServiceImpl(mailSender, emailTemplateEngine(), properties);
    } else {
      return new DummyEmailServiceImpl();
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy