Skip to content

Commit

Permalink
[SHIBUI-1030]
Browse files Browse the repository at this point in the history
First pass at email template handling and email sending.
  • Loading branch information
Bill Smith committed Jan 10, 2019
1 parent b88cdc1 commit 9220aeb
Show file tree
Hide file tree
Showing 6 changed files with 168 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package edu.internet2.tier.shibboleth.admin.ui.configuration;

import edu.internet2.tier.shibboleth.admin.ui.service.EmailService;
import edu.internet2.tier.shibboleth.admin.ui.service.EmailServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
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;

import java.util.Collections;

/**
* @author Bill Smith (wsmith@unicon.net)
*/
@Configuration
public class EmailConfiguration {

private static final String EMAIL_TEMPLATE_ENCODING = "UTF-8";

@Value("${shibui.text.email.template.path.prefix:/mail/text/}")
private String textEmailTemplatePathPrefix;

@Value("${shibui.html.email.template.path.prefix:/mail/html/}")
private String htmlEmailTemplatePathPrefix;

@Autowired
private ApplicationContext applicationContext;

@Autowired
private JavaMailSender javaMailSender;

@Bean
public ResourceBundleMessageSource emailMessageSource() {
final ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("mail/mailMessages");
return messageSource;
}

@Bean
public TemplateEngine textEmailTemplateEngine() {
final SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.addTemplateResolver(textTemplateResolver());
templateEngine.setTemplateEngineMessageSource(emailMessageSource());
return templateEngine;
}

@Bean
public TemplateEngine htmlEmailTemplateEngine() {
final SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.addTemplateResolver(htmlTemplateResolver());
templateEngine.setTemplateEngineMessageSource(emailMessageSource());
return templateEngine;
}

private ITemplateResolver textTemplateResolver() {
final ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
templateResolver.setOrder(1);
templateResolver.setResolvablePatterns(Collections.singleton("*"));
templateResolver.setPrefix(textEmailTemplatePathPrefix);
templateResolver.setSuffix(".txt");
templateResolver.setTemplateMode(TemplateMode.TEXT);
templateResolver.setCharacterEncoding(EMAIL_TEMPLATE_ENCODING);
templateResolver.setCacheable(false);
return templateResolver;
}

private ITemplateResolver htmlTemplateResolver() {
final ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
templateResolver.setOrder(1);
templateResolver.setResolvablePatterns(Collections.singleton("*"));
templateResolver.setPrefix(htmlEmailTemplatePathPrefix);
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode(TemplateMode.HTML);
templateResolver.setCharacterEncoding(EMAIL_TEMPLATE_ENCODING);
templateResolver.setCacheable(false);
return templateResolver;
}

@Bean
public EmailService emailService() {
return new EmailServiceImpl(javaMailSender, emailMessageSource(), textEmailTemplateEngine(), htmlEmailTemplateEngine());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package edu.internet2.tier.shibboleth.admin.ui.service;

import javax.mail.MessagingException;
import java.util.Locale;

/**
* @author Bill Smith (wsmith@unicon.net)
*/
public interface EmailService {
void sendMail(String emailTemplate, String fromAddress, String recipient, String subject, Locale locale) throws MessagingException;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package edu.internet2.tier.shibboleth.admin.ui.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.util.Locale;

/**
* @author Bill Smith (wsmith@unicon.net)
*/
public class EmailServiceImpl implements EmailService {
private static final Logger logger = LoggerFactory.getLogger(EmailServiceImpl.class);

private JavaMailSender emailSender;
private ResourceBundleMessageSource emailMessageSource;
private TemplateEngine textEmailTemplateEngine;
private TemplateEngine htmlEmailTemplateEngine;

public EmailServiceImpl(JavaMailSender emailSender,
ResourceBundleMessageSource emailMessageSource,
TemplateEngine textEmailTemplateEngine,
TemplateEngine htmlEmailTemplateEngine) {
this.emailSender = emailSender;
this.emailMessageSource = emailMessageSource;
this.textEmailTemplateEngine = textEmailTemplateEngine;
this.htmlEmailTemplateEngine = htmlEmailTemplateEngine;
}

public void sendMail(String emailTemplate, String fromAddress, String recipient, String subject, Locale locale) throws MessagingException {
Context context = new Context(locale);
// TODO: set things to be replaced in the email template here

MimeMessage mimeMessage = this.emailSender.createMimeMessage();
MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true,"UTF-8");
message.setSubject(subject);
message.setFrom(fromAddress);
message.setTo(recipient);

String textContent = textEmailTemplateEngine.process(emailTemplate, context);
String htmlContent = htmlEmailTemplateEngine.process(emailTemplate, context);
message.setText(textContent, htmlContent);

// TODO: Uncomment when we're ready to actually send emails
// emailSender.send(mimeMessage);
}
}
8 changes: 8 additions & 0 deletions backend/src/main/resources/application.properties
Original file line number Diff line number Diff line change
Expand Up @@ -65,3 +65,11 @@ shibui.nameid-filter-ui-schema-location=classpath:nameid-filter.schema.json
# Set the following property to periodically write out metadata providers configuration. There is no default value; the following is just an example
# shibui.metadataProviders.target=file:/opt/shibboleth-idp/conf/shibui-metadata-providers.xml
# shibui.metadataProviders.taskRunRate=30000

# Email configuration
spring.mail.host=localhost
spring.mail.port=25
spring.mail.username=username
spring.mail.password=password
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
4 changes: 4 additions & 0 deletions backend/src/main/resources/mail/html/test.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<html>
<head>This is a test!</head>
<body>This is a test email template. Can't you tell?</body>
</html>
1 change: 1 addition & 0 deletions backend/src/main/resources/mail/text/test.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This is a test email template. Can't you tell?

0 comments on commit 9220aeb

Please sign in to comment.