package com.porterhead.mail; import org.apache.velocity.app.VelocityEngine; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.mail.javamail.MimeMessagePreparator; import org.springframework.stereotype.Service; import org.springframework.ui.velocity.VelocityEngineUtils; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.util.HashMap; import java.util.Map; /** * @version 1.0 * @author: Iain Porter * @since 13/05/2013 */ @Service("mailSenderService") public class MailSenderServiceImpl implements MailSenderService { private static Logger LOG = LoggerFactory.getLogger(MailSenderServiceImpl.class); private final JavaMailSender mailSender; private final VelocityEngine velocityEngine; @Value("${email.services.emailVerificationSubjectText}") private String emailVerificationSubjectText; @Value("${email.services.emailRegistrationSubjectText}") private String emailRegistrationSubjectText; @Value("${email.services.lostPasswordSubjectText}") private String lostPasswordSubjectText; @Value("${email.services.fromAddress}") private String emailFromAddress; @Value("${email.services.replyToAddress}") private String emailReplyToAddress; @Autowired public MailSenderServiceImpl(JavaMailSender mailSender, VelocityEngine velocityEngine) { this.mailSender = mailSender; this.velocityEngine = velocityEngine; } public EmailServiceTokenModel sendVerificationEmail(final EmailServiceTokenModel emailVerificationModel) { Map<String, String> resources = new HashMap<String, String>(); return sendVerificationEmail(emailVerificationModel, emailVerificationSubjectText, "META-INF/velocity/VerifyEmail.vm", resources); } public EmailServiceTokenModel sendRegistrationEmail(final EmailServiceTokenModel emailVerificationModel) { Map<String, String> resources = new HashMap<String, String>(); return sendVerificationEmail(emailVerificationModel, emailRegistrationSubjectText, "META-INF/velocity/RegistrationEmail.vm", resources); } public EmailServiceTokenModel sendLostPasswordEmail(final EmailServiceTokenModel emailServiceTokenModel) { Map<String, String> resources = new HashMap<String, String>(); return sendVerificationEmail(emailServiceTokenModel, lostPasswordSubjectText, "META-INF/velocity/LostPasswordEmail.vm", resources); } private void addInlineResource(MimeMessageHelper messageHelper, String resourcePath, String resourceIdentifier) throws MessagingException { Resource resource = new ClassPathResource(resourcePath); messageHelper.addInline(resourceIdentifier, resource); } private EmailServiceTokenModel sendVerificationEmail(final EmailServiceTokenModel emailVerificationModel, final String emailSubject, final String velocityModel, final Map<String, String> resources) { MimeMessagePreparator preparator = new MimeMessagePreparator() { public void prepare(MimeMessage mimeMessage) throws Exception { MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, MimeMessageHelper.MULTIPART_MODE_RELATED, "UTF-8"); messageHelper.setTo(emailVerificationModel.getEmailAddress()); messageHelper.setFrom(emailFromAddress); messageHelper.setReplyTo(emailReplyToAddress); messageHelper.setSubject(emailSubject); Map model = new HashMap(); model.put("model", emailVerificationModel); String text = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, velocityModel, model); messageHelper.setText(new String(text.getBytes(), "UTF-8"), true); for(String resourceIdentifier: resources.keySet()) { addInlineResource(messageHelper, resources.get(resourceIdentifier), resourceIdentifier); } } }; LOG.debug("Sending {} token to : {}",emailVerificationModel.getTokenType().toString(), emailVerificationModel.getEmailAddress()); this.mailSender.send(preparator); return emailVerificationModel; } public void setEmailVerificationSubjectText(String emailVerificationSubjectText) { this.emailVerificationSubjectText = emailVerificationSubjectText; } public void setEmailRegistrationSubjectText(String emailRegistrationSubjectText) { this.emailRegistrationSubjectText = emailRegistrationSubjectText; } public void setLostPasswordSubjectText(String lostPasswordSubjectText) { this.lostPasswordSubjectText = lostPasswordSubjectText; } public void setEmailFromAddress(String emailFromAddress) { this.emailFromAddress = emailFromAddress; } public void setEmailReplyToAddress(String emailReplyToAddress) { this.emailReplyToAddress = emailReplyToAddress; } }