package com.thingtrack.konekti.mail.internal;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import javax.annotation.PostConstruct;
import javax.mail.internet.MimeMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.InputStreamSource;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.ui.velocity.VelocityEngineUtils;
import org.apache.velocity.app.VelocityEngine;
import com.thingtrack.konekti.domain.Configuration;
import com.thingtrack.konekti.mail.MailService;
import com.thingtrack.konekti.service.api.ConfigurationService;
public class MailServiceImpl implements MailService {
@Autowired
private ConfigurationService configurationService;
private List<Configuration> configurations;
private final static String SMTP_HOST = "SMTP_HOST";
private final static String SMTP_PORT = "SMTP_PORT";
private final static String SMTP_USERNAME = "SMTP_USERNAME";
private final static String SMTP_PASSEWORD = "SMTP_PASSEWORD";
private final static String SMTP_SSL = "SMTP_SSL";
private final static String SMTP_TLS = "SMTP_TLS";
private String host;
private int port;
private String username;
private String password;
boolean sslFlag;
private boolean tlsFlag;
private JavaMailSenderImpl javaMailSender;
private VelocityEngine velocityEngine = new VelocityEngine();
@PostConstruct
public void Initialize() throws Exception {
try {
// get all SMTP Server atributes
configurationService.get(1);
configurations = configurationService.getAll();
}
catch(Exception ex) {
ex.getMessage();
}
host = getConfigurationValue(SMTP_HOST);
port = Integer.parseInt(getConfigurationValue(SMTP_PORT));
username = getConfigurationValue(SMTP_USERNAME);
password = getConfigurationValue(SMTP_PASSEWORD);
sslFlag = Boolean.parseBoolean(getConfigurationValue(SMTP_SSL));
tlsFlag = Boolean.parseBoolean(getConfigurationValue(SMTP_TLS));
// configure mail sender
configureMailSender();
// configure velocity engine
Properties props = new Properties();
props.put("resource.loader", "class");
props.put("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
velocityEngine.init(props);
}
private String getConfigurationValue(String tag) {
for (Configuration configuration : configurations) {
if (configuration.getTag().equals(tag))
return configuration.getValue();
}
return null;
}
private void configureMailSender() {
javaMailSender = new JavaMailSenderImpl();
Properties javaMailProperties = new Properties();
javaMailProperties.put("mail.smtp.starttls.enable", tlsFlag);
javaMailProperties.put("mail.smtp.ssl.enable", sslFlag);
javaMailSender.setHost(host);
javaMailSender.setPort(port);
javaMailSender.setUsername(username);
javaMailSender.setPassword(password);
javaMailSender.setJavaMailProperties(javaMailProperties);
}
@Override
public void sendMessage(String emailTo, String subject, String template, HashMap<String, Object> staticResources, HashMap<String, Object> dynamicResources) throws Exception {
sendMessage(username, emailTo, subject, template, staticResources, dynamicResources);
}
@Override
public void sendMessage(String emailFrom, String emailTo, String subject, String template, HashMap<String, Object> staticResources, HashMap<String, Object> dynamicResources) throws Exception {
String text = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, template, "UTF-8", dynamicResources);
// configure mail helper
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true); // configure multipart email configuration: css and images inside
helper.setFrom(emailFrom);
helper.setTo(emailTo);
helper.setSubject(subject);
helper.setText(text, true); // configure html email
Iterator<String> iter = staticResources.keySet().iterator();
while(iter.hasNext()) {
String key = (String)iter.next();
InputStreamSource val = (InputStreamSource)staticResources.get(key);
helper.addInline(key, val, "text/html");
}
// send message in OSGi envirotment
ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(javax.mail.Session.class.getClassLoader());
javaMailSender.send(message);
}
catch (Exception e) {
throw new Exception(e);
} finally {
Thread.currentThread().setContextClassLoader(oldClassLoader);
}
}
}