package org.springside.examples.showcase.email;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.Map;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.ui.freemarker.FreeMarkerTemplateUtils;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
/**
* MIME邮件服务类.
*
* 演示由Freemarker引擎生成的的html格式邮件, 并带有附件.
*
* @author calvin
*/
public class MimeMailService {
private static final String DEFAULT_ENCODING = "utf-8";
private static Logger logger = LoggerFactory.getLogger(MimeMailService.class);
private JavaMailSender mailSender;
private Template template;
/**
* Spring的MailSender.
*/
public void setMailSender(JavaMailSender mailSender) {
this.mailSender = mailSender;
}
/**
* 注入Freemarker引擎配置,构造Freemarker 邮件内容模板.
*/
public void setFreemarkerConfiguration(Configuration freemarkerConfiguration) throws IOException {
//根据freemarkerConfiguration的templateLoaderPath载入文件.
template = freemarkerConfiguration.getTemplate("mailTemplate.ftl", DEFAULT_ENCODING);
}
/**
* 发送MIME格式的用户修改通知邮件.
*/
public void sendNotificationMail(String userName) {
try {
MimeMessage msg = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(msg, true, DEFAULT_ENCODING);
helper.setTo("springside3.demo@gmail.com");
helper.setFrom("springside3.demo@gmail.com");
helper.setSubject("用户修改通知");
String content = generateContent(userName);
helper.setText(content, true);
File attachment = generateAttachment();
helper.addAttachment("mailAttachment.txt", attachment);
mailSender.send(msg);
logger.info("HTML版邮件已发送至springside3.demo@gmail.com");
} catch (MessagingException e) {
logger.error("构造邮件失败", e);
} catch (Exception e) {
logger.error("发送邮件失败", e);
}
}
/**
* 使用Freemarker生成html格式内容.
*/
@SuppressWarnings("unchecked")
private String generateContent(String userName) throws MessagingException {
try {
Map context = Collections.singletonMap("userName", userName);
return FreeMarkerTemplateUtils.processTemplateIntoString(template, context);
} catch (IOException e) {
logger.error("生成邮件内容失败, FreeMarker模板不存在", e);
throw new MessagingException("FreeMarker模板不存在", e);
} catch (TemplateException e) {
logger.error("生成邮件内容失败, FreeMarker处理失败", e);
throw new MessagingException("FreeMarker处理失败", e);
}
}
/**
* 获取classpath中的附件.
*/
private File generateAttachment() throws MessagingException {
try {
Resource resource = new ClassPathResource("/email/mailAttachment.txt");
return resource.getFile();
} catch (IOException e) {
logger.error("构造邮件失败,附件文件不存在", e);
throw new MessagingException("附件文件不存在", e);
}
}
}