六、使用邮件模板来创建邮件
FreeMarker是一个被广泛使用的模板框架,Spring可以很好的支持该框架。Spring为FreeMarker提供了一个FreeMarkerConfigurer类,通过此类可方便地创建FreeMarker的基础环境,Spring提供FreeMarkerTemplateUtils工具类来完成解析模板的任务。
下面以用户注册成功后发送的模板文件registerUser.ftl,将该文件放在src/mailTemplate下:
6.1 模板文件
- <html>
- <head>
- <meta http-equiv="content-type" content="text/html;charset=utf8">
- </head>
- <body>
- 恭喜您成功注册!您的用户名为:<font color='red' size='30'>${username}</font>
- </body>
- </html>
<html> <head> <meta http-equiv="content-type" content="text/html;charset=utf8"> </head> <body> 恭喜您成功注册!您的用户名为:<font color='red' size='30'>${username}</font> </body> </html>
上面的${username}标签代表一个可被替换的动态属性。FreeMarker模板的标签支持级联属性,如${user.Id}则表示user对象的Id属性。
6.2 使用FreeMarker模板技术构造邮件内容
- package com.bb.spring.email;
- import org.springframework.ui.freemarker.*;
- import org.springframework.web.servlet.view.freemarker.*;
- import freemarker.template.*;
- import ......
- public class TemplateEmailService {
- private JavaMailSender sender;
- private FreeMarkerConfigurer freeMarkerConfigurer=null;//FreeMarker的技术类
- public void setFreeMarkerConfigurer(FreeMarkerConfigurer freeMarkerConfigurer) {
- this.freeMarkerConfigurer = freeMarkerConfigurer;
- }
- public void setSender(JavaMailSender sender) {
- this.sender = sender;
- }
- //通过模板构造邮件内容,参数username将替换模板文件中的${username}标签。
- private String getMailText(String username){
- String htmlText="";
- try {
- //通过指定模板名获取FreeMarker模板实例
- Template tpl=freeMarkerConfigurer.getConfiguration().getTemplate("registerUser.ftl");
- //FreeMarker通过Map传递动态数据
- Map map=new HashMap();
- map.put("username",username); //注意动态数据的key和模板标签中指定的属性相匹配
- //解析模板并替换动态数据,最终username将替换模板文件中的${username}标签。
- htmlText=FreeMarkerTemplateUtils.processTemplateIntoString(tpl,map);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return htmlText;
- }
- //发送模板邮件
- public void sendTemplateMail(String username) throws MessagingException{
- MimeMessage msg=sender.createMimeMessage();
- MimeMessageHelper helper=new MimeMessageHelper(msg,false,"utf8");//由于是html邮件,不是mulitpart类型
- helper.setFrom("dongsanbo@sina.com");
- helper.setTo("dongsanbo@sina.com");
- helper.setSubject("注册成功-模板邮件");
- String htmlText=getMailText(username);//使用模板生成html邮件内容
- helper.setText(htmlText, true);
- sender.send(msg);
- System.out.println("成功发送模板邮件");
- }
- public static void main(String[] args) throws MessagingException {
- // TODO Auto-generated method stub
- ApplicationContext ctx = new FileSystemXmlApplicationContext(
- "src/applicationContext.xml");
- TemplateEmailService ms=(TemplateEmailService) ctx.getBean("templateEmail");
- //发送模板邮件
- ms.sendTemplateMail("yefriend");
- }//end method
- }
package com.bb.spring.email; import org.springframework.ui.freemarker.*; import org.springframework.web.servlet.view.freemarker.*; import freemarker.template.*; import ...... public class TemplateEmailService { private JavaMailSender sender; private FreeMarkerConfigurer freeMarkerConfigurer=null;//FreeMarker的技术类 public void setFreeMarkerConfigurer(FreeMarkerConfigurer freeMarkerConfigurer) { this.freeMarkerConfigurer = freeMarkerConfigurer; } public void setSender(JavaMailSender sender) { this.sender = sender; } //通过模板构造邮件内容,参数username将替换模板文件中的${username}标签。 private String getMailText(String username){ String htmlText=""; try { //通过指定模板名获取FreeMarker模板实例 Template tpl=freeMarkerConfigurer.getConfiguration().getTemplate("registerUser.ftl"); //FreeMarker通过Map传递动态数据 Map map=new HashMap(); map.put("username",username); //注意动态数据的key和模板标签中指定的属性相匹配 //解析模板并替换动态数据,最终username将替换模板文件中的${username}标签。 htmlText=FreeMarkerTemplateUtils.processTemplateIntoString(tpl,map); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return htmlText; } //发送模板邮件 public void sendTemplateMail(String username) throws MessagingException{ MimeMessage msg=sender.createMimeMessage(); MimeMessageHelper helper=new MimeMessageHelper(msg,false,"utf8");//由于是html邮件,不是mulitpart类型 helper.setFrom("dongsanbo@sina.com"); helper.setTo("dongsanbo@sina.com"); helper.setSubject("注册成功-模板邮件"); String htmlText=getMailText(username);//使用模板生成html邮件内容 helper.setText(htmlText, true); sender.send(msg); System.out.println("成功发送模板邮件"); } public static void main(String[] args) throws MessagingException { // TODO Auto-generated method stub ApplicationContext ctx = new FileSystemXmlApplicationContext( "src/applicationContext.xml"); TemplateEmailService ms=(TemplateEmailService) ctx.getBean("templateEmail"); //发送模板邮件 ms.sendTemplateMail("yefriend"); }//end method }
6.3 applicationContext.xml配置文件
- <bean id="freeMarker" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
- <property name="templateLoaderPath" value="classpath:mailTemplate"/><!--指定模板文件目录-->
- <property name="freemarkerSettings"><!-- 设置FreeMarker环境属性-->
- <props>
- <prop key="template_update_delay">1800</prop><!--刷新模板的周期,单位为秒-->
- <prop key="default_encoding">UTF-8</prop><!--模板的编码格式 -->
- <prop key="locale">zh_CN</prop><!-- 本地化设置-->
- </props>
- </property>
- </bean>
- <bean id="templateEmail" class="com.bb.spring.email.TemplateEmailService">
- <property name="sender" ref="mailsender"></property>
- <property name="freeMarkerConfigurer" ref="freeMarker"></property>
- </bean>
<bean id="freeMarker" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath" value="classpath:mailTemplate"/><!--指定模板文件目录--> <property name="freemarkerSettings"><!-- 设置FreeMarker环境属性--> <props> <prop key="template_update_delay">1800</prop><!--刷新模板的周期,单位为秒--> <prop key="default_encoding">UTF-8</prop><!--模板的编码格式 --> <prop key="locale">zh_CN</prop><!-- 本地化设置--> </props> </property> </bean> <bean id="templateEmail" class="com.bb.spring.email.TemplateEmailService"> <property name="sender" ref="mailsender"></property> <property name="freeMarkerConfigurer" ref="freeMarker"></property> </bean>
在配置文件中已设置好模板目录,所以可在类中直接用模板文件名来定位模板文件。模板文件用UTF-8编码格式,避免中文乱码。通过设置template_update_delay属性,可让FreeMarker定期刷新模板,从而使应用程序在不重启下更新模板。
至此,可以运行TemplateEmailService类发送邮件,实验表明"yefriend"将替换${username}。