package org.xmx0632.deliciousfruit.utilities.email;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;
/**
* 发送MIME格式的通知邮件.
*/
public void sendNotificationMail(
SendNotificationMailParameter... mailParams) {
try {
List<MimeMessage> mimeMessages = new ArrayList<MimeMessage>();
for (SendNotificationMailParameter param : mailParams) {
MimeMessage msg = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(msg, true,
DEFAULT_ENCODING);
helper.setTo(param.getTo());
helper.setFrom(param.getFrom());
helper.setSubject(param.getSubject());
String content = generateContent(param.getUserName(),
param.getResetUrl());
helper.setText(content, true);
mimeMessages.add(msg);
logger.info("HTML版邮件已经准备好发送至{}", param.getTo());
}
logger.debug("start send mail");
mailSender.send(mimeMessages.toArray(new MimeMessage[mimeMessages
.size()]));
logger.debug("end send mail");
} catch (MessagingException e) {
logger.error("构造邮件失败", e);
} catch (Exception e) {
logger.error("发送邮件失败", e);
}
}
/**
* 使用Freemarker生成html格式内容.
*
*/
private String generateContent(String userName, String resetUrl)
throws MessagingException {
try {
Map<String, String> context = new HashMap<String, String>();
context.put("userName", userName);
context.put("url", resetUrl);
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);
}
}
/**
* 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);
}
}