package no.niths.services;
import javax.mail.internet.MimeMessage;
import no.niths.common.constants.MiscConstants;
import no.niths.common.misc.EmailTexts;
import no.niths.domain.development.Application;
import no.niths.domain.development.Developer;
import no.niths.services.interfaces.MailSenderService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.MailException;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
/**
* Service Class for sending emails
*
* <p>
* Has methods for composeAndSend, sendDeveloperRegistratedConfirmation,
* sendDeveloperAddedAppConfirmation, sendDeveloperEnabledConfirmation
* and sendApplicationEnabledConfirmation
* </p>
*/
@Service
public class MailSenderServiceImpl implements MailSenderService {
private static final Logger logger = LoggerFactory
.getLogger(MailSenderServiceImpl.class);
@Autowired(required=false)
private MailSender mailSender;
@Autowired(required = false)
private JavaMailSender javaMailSender;
//Composes a simple mail (No html or attachements)
private SimpleMailMessage composeMail(String to, String from, String subject, String body){
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from); //Email from
message.setTo(to); //Email to
message.setSubject(subject); //Email subject
message.setText(body); //Email message(body)
return message;
}
//Prepares a MimeMessage (html and attachments)
private MimeMessagePreparator prepare(final String to,final String from,final String subject,final String body) {
MimeMessagePreparator preparator = new MimeMessagePreparator() {
public void prepare(MimeMessage mimeMessage) throws Exception {
MimeMessageHelper message = new MimeMessageHelper(mimeMessage);
message.setTo(to);
message.setFrom(from);
message.setSubject(subject);
message.setText(body, true);
}
};
return preparator;
}
/**
* {@inheritDoc}
*/
public void sendDeveloperRegistratedConfirmation(Developer dev){
String subject = "Hi " + dev.getName()+ ". Registration success, verification needed";
sendMimeMessage(prepare(dev.getEmail(), MiscConstants.NITHS_EMAIL, subject, EmailTexts.getDeveloperConfirmationBody(dev)));
}
/**
* {@inheritDoc}
*/
public void sendDeveloperAddedAppConfirmation(Developer dev, Application app){
String subject = "Hi " + dev.getName()+ ". Your app has been registrated";
sendMimeMessage(prepare(dev.getEmail(), MiscConstants.NITHS_EMAIL, subject, EmailTexts.getAddedAppToDevelioperBody(app)));
}
/**
* {@inheritDoc}
*/
public void sendDeveloperEnabledConfirmation(Developer dev){
String subject = "Hi " + dev.getName()+ ". Your are now enabled!";
sendMimeMessage(prepare(dev.getEmail(), MiscConstants.NITHS_EMAIL, subject, EmailTexts.getDeveloperEnabledBody(dev)));
}
/**
* {@inheritDoc}
*/
@Override
public void sendApplicationEnabledConfirmation(Developer dev,
Application app) {
String subject = "Hi " + dev.getName()+ ". Your app now enabled!";
sendMimeMessage(prepare(dev.getEmail(), MiscConstants.NITHS_EMAIL, subject, EmailTexts.getApplicationEnabledBody(dev, app)));
}
/**
* {@inheritDoc}
*/
@Override
public void composeAndSend(String to, String from, String subject, String body) {
sendMessage(composeMail(to, from, subject, body));
}
/**
* Private helper method for sending a MIME message
* MIME message can contain html, attachments etc
*
* Sends an email asynchronized
*
* @param message the mime message to send
*/
@Async
private void sendMimeMessage(MimeMessagePreparator message){
try{
if(javaMailSender != null){
javaMailSender.send(message);
}else{
logger.warn("Could not send mail, mailsender is null");
}
}catch(MailException me){
me.printStackTrace();
logger.warn("MailException! Could not send mail");
}
}
/**
* Private helper method for sending a Simple mail message
* Simple Mail Message can only contain text,
* @see sendMimeMessage(MimeMessagePreparator message) if
* you want to send an email with attachments/html
*
* Sends an email asynchronized
*
* @param message the simple mail message to send
*/
@Async
private void sendMessage(SimpleMailMessage message){
try{
if(mailSender != null){
mailSender.send(message);
}else {
logger.warn("Could not send mail, mailsender is null");
}
}catch(MailException me){
me.printStackTrace();
logger.warn("MailException! Could not send mail");
}
}
}