最近新项目要用mail,以前一直是java mail写的,要写的东西比较多,比较复杂。这次查了查spring mail,发现spring把java mail封装的很好,用起来很方便
1.下载spring和java mail的jar包,我是用的maven,大家可以去maven central去找,这里用的java mail是1.4.6,spring是3.1.1。因为还用到了邮件模板,所以引入了freemarker 2.3.19;
2.配置appContext.xml
<bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<!-- 服务器 -->
<property name="host" value="smtp.xxxx.com" />
<!-- 端口号 -->
<property name="port" value="25" />
<!-- 用户名 -->
<property name="username" value="xxx@xxx.com" />
<!-- 密码 -->
<property name="password" value="******" />
<!-- SMTP服务器验证 -->
<property name="javaMailProperties">
<props>
<!-- 验证身份 -->
<prop key="mail.smtp.auth">true</prop>
</props>
</property>
</bean>
<bean id="simpleMailMessage" class="org.springframework.mail.SimpleMailMessage">
<!-- 发件人email -->
<property name="from" value="xxx@xxx.com" />
</bean>
<bean id="emailManager" class="com.michael.mail.EmailManager">
<property name="javaMailSender" ref="javaMailSender" />
<property name="simpleMailMessage" ref="simpleMailMessage" />
</bean>
<!-- 配置freeMarkerConfigurer进行属性值的注入 -->
<bean id="freeMarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPaths" value="classpath:/free_marker_template" />
<property name="freemarkerSettings">
<props>
<prop key="template_update_delay">60000</prop><!-- 模版延时更新,也就是有模版缓存 -->
<prop key="default_encoding">UTF-8</prop>
<prop key="locale">zh_CN</prop>
</props>
</property>
</bean>
<bean id="freeMarkerManager" class="com.michael.freemarker.FreeMarkerManager">
<property name="freeMarkerConfigurer" ref="freeMarkerConfigurer" />
</bean>
3.编写Email数据类
public class Email {
private String subject;
private String content;
private String receiver;
private String[] receivers;
private String[] attachments;
private boolean isHtml = false;
public Email(String subject, String content, String receiver) {
this.subject = subject;
this.content = content;
this.receiver = receiver;
}
public Email(String subject, String content, String receiver,
String[] attachments) {
this.subject = subject;
this.content = content;
this.receiver = receiver;
this.attachments = attachments;
}
public Email(String subject, String content, String[] receivers) {
this.subject = subject;
this.content = content;
filterEmailAddr(receivers);
}
public Email(String subject, String content, String[] receivers,
String[] attachments) {
this.subject = subject;
this.content = content;
this.attachments = attachments;
filterEmailAddr(receivers);
}
/**
* 主题
*
* @return
*/
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
/**
* 内容
*
* @return
*/
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
/**
* 收件人
*
* @return
*/
public String getReceiver() {
return receiver;
}
public void setReceiver(String receiver) {
this.receiver = receiver;
}
/**
* 收件人列表
*
* @return
*/
public String[] getReceivers() {
return receivers;
}
public void setReceivers(String[] receivers) {
this.receivers = receivers;
}
/**
* 附件
*
* @return
*/
public String[] getAttachments() {
return attachments;
}
public void setAttachments(String[] attachments) {
this.attachments = attachments;
}
/**
* 是否是html文本,默认不是
*
* @return
*/
public boolean isHtml() {
return isHtml;
}
public void setHtml(boolean isHtml) {
this.isHtml = isHtml;
}
private void filterEmailAddr(String[] emails) {
if (emails == null || emails.length < 1)
return;
List<String> results = new ArrayList<String>();
for (String em : emails) {
if (MatcherUtil.isEmail(em))
results.add(em);
}
setReceivers(results.toArray(new String[results.size()]));
}
}
4.编写mail实现类
public class EmailManager {
private JavaMailSender javaMailSender;
private SimpleMailMessage simpleMailMessage;
/**
* 同步发送邮件
*
* @param email
*/
public void synSendMail(Email email) {
try {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(
mimeMessage, true, "UTF-8");
messageHelper.setFrom(simpleMailMessage.getFrom());
messageHelper.setSubject(email.getSubject());
messageHelper.setText(email.getContent(), email.isHtml());
if (email.getReceiver() == null)
messageHelper.setTo(email.getReceivers());
else
messageHelper.setTo(email.getReceiver());
List<FileSystemResource> fileResourceList = getAttachmentFile(email
.getAttachments());
for (FileSystemResource fr : fileResourceList) {
messageHelper.addAttachment(
MimeUtility.encodeWord(fr.getFilename()), fr);
}
javaMailSender.send(mimeMessage);
} catch (Exception e) {
LoggerUtil.error(EmailManager.class, "邮件发送失败:", e);
}
}
/**
* 异步发送邮件
*
* @param email
*/
public void asynSendMail(final Email email) {
Runnable thread = new Runnable() {
@Override
public void run() {
synSendMail(email);
}
};
new Thread(thread).start();
}
/**
* spring注入
*
* @param simpleMailMessage
*/
public void setSimpleMailMessage(SimpleMailMessage simpleMailMessage) {
this.simpleMailMessage = simpleMailMessage;
}
/**
* spring注入
*
* @param javaMailSender
*/
public void setJavaMailSender(JavaMailSender javaMailSender) {
this.javaMailSender = javaMailSender;
}
/**
* 获取附件信息
*
* @param filePath
* @return
*/
private List<FileSystemResource> getAttachmentFile(String[] filePath) {
List<FileSystemResource> fileResourceList = new ArrayList<FileSystemResource>();
if (filePath == null || filePath.length < 1)
return fileResourceList;
for (String file : filePath) {
File attachmentFile = new File(file);
if (attachmentFile.exists())
fileResourceList.add(new FileSystemResource(attachmentFile));
}
return fileResourceList;
}
}
5.编写freemarker管理类
/**
* FreeMarker管理类
*
* 说明:
*
* getHtmlText方法: 需要2个参数:contentMap和templateFilePath contentMap:
* 指的是模版需要的定制内容的key-value,比如, 模版中有${content},map就要put一个key是content的string
*
* templateFilePath: 是模版的路径,需要把你需要的模版放到所在项目
* 的classpath下的free_marker_template下,templateFilePath
* 指的是free_marker_template下的子目录,比如:getHtmlText(contentMap,"/sample.ftl")
*
* @author liuyang
*
*/
public class FreeMarkerManager {
private FreeMarkerConfigurer freeMarkerConfigurer;
/**
* 获取模版内容
*
* @param templateParamMap
* @param templateFilePath
* @return
*/
public String getHtmlText(Map<String, String> templateParamMap,
String templateFilePath) {
String htmlText = "";
Template tpl = null;
try {
tpl = freeMarkerConfigurer.getConfiguration().getTemplate(
templateFilePath);
htmlText = FreeMarkerTemplateUtils.processTemplateIntoString(tpl,
templateParamMap);
} catch (Exception e) {
LoggerUtil.error(FreeMarkerManager.class, "FreeMarker加载"
+ templateFilePath + "错误:", e);
}
return htmlText;
}
/**
* spring注入
*
* @param freeMarkerConfigurer
*/
public void setFreeMarkerConfigurer(
FreeMarkerConfigurer freeMarkerConfigurer) {
this.freeMarkerConfigurer = freeMarkerConfigurer;
}
}
6.freemarker模版
我这里把模版统一放到了classpath下面
<html>
<body>
${to}
${url}
</body>
</html>
测试
/**
* 发送注册验证邮件
*
* @param email
* @param securityCode
*/
private void sendRegisterEmail(String userEmail, String url) {
Map<String, String> contentMap = new HashMap<String, String>();
contentMap.put("to", userEmail);
contentMap.put("url", url);
String content = freeMarkerManager.getHtmlText(contentMap,
"/register_mail.ftl");
Email email = new Email("xxxxxxx", content, userEmail);
email.setHtml(true);
emailManager.asynSendMail(email);
}
项目中发邮件还是采用异步发送比较好,有时候smtp服务器会有延迟