使用FreeMarker邮件模版来发送邮件

来源:互联网 发布:软件 po 编辑:程序博客网 时间:2024/06/05 21:30

使用FreeMarker邮件模版来发送邮件

    博客分类: 
  • Spring
SpringBeanServletfreemarkerITeye 

Spring为FreeMarker提供了一个FreeMarkerConfigurer类,通过此类可方便地创建FreeMarker的基础环境,Spring提供FreeMarkerTemplateUtils工具类来完成解析模板的任务。

 

下面以用户注册成功后发送的模板文件registerUser.ftl,将该文件放在src/mailTemplate下:


6.1 模板文件

Java代码  收藏代码
  1. <html>  
  2.    <head>  
  3.       <meta http-equiv="content-type" content="text/html;charset=utf8">  
  4.    </head>  
  5.    <body>  
  6.        恭喜您成功注册!您的用户名为:<font color='red' size='30'>${username}</font>  
  7.    </body>  
  8. </html>  

 上面的${username}标签代表一个可被替换的动态属性。FreeMarker模板的标签支持级联属性,如${user.Id}则表示user对象的Id属性。

 

6.2 使用FreeMarker模板技术构造邮件内容

 

Java代码  收藏代码
  1. package com.bb.spring.email;  
  2. import org.springframework.ui.freemarker.*;  
  3. import org.springframework.web.servlet.view.freemarker.*;  
  4. import freemarker.template.*;  
  5. import ......  
  6. public class TemplateEmailService {  
  7.     private JavaMailSender sender;  
  8.     private FreeMarkerConfigurer freeMarkerConfigurer=null;//FreeMarker的技术类  
  9.       
  10.     public void setFreeMarkerConfigurer(FreeMarkerConfigurer freeMarkerConfigurer) {  
  11.         this.freeMarkerConfigurer = freeMarkerConfigurer;  
  12.     }  
  13.       
  14.     public void setSender(JavaMailSender sender) {  
  15.         this.sender = sender;  
  16.     }  
  17.   
  18.     //通过模板构造邮件内容,参数username将替换模板文件中的${username}标签。  
  19.     private String getMailText(String username){  
  20.         String htmlText="";  
  21.         try {  
  22.             //通过指定模板名获取FreeMarker模板实例  
  23.             Template tpl=freeMarkerConfigurer.getConfiguration().getTemplate("registerUser.ftl");  
  24.             //FreeMarker通过Map传递动态数据  
  25.             Map map=new HashMap();  
  26.             map.put("username",username); //注意动态数据的key和模板标签中指定的属性相匹配  
  27.             //解析模板并替换动态数据,最终username将替换模板文件中的${username}标签。  
  28.             htmlText=FreeMarkerTemplateUtils.processTemplateIntoString(tpl,map);  
  29.         } catch (Exception e) {  
  30.             // TODO Auto-generated catch block  
  31.             e.printStackTrace();  
  32.         }  
  33.         return htmlText;  
  34.     }  
  35.       
  36.     //发送模板邮件  
  37.     public void sendTemplateMail(String username) throws MessagingException{  
  38.         MimeMessage msg=sender.createMimeMessage();  
  39.         MimeMessageHelper helper=new MimeMessageHelper(msg,false,"utf8");//由于是html邮件,不是mulitpart类型  
  40.         helper.setFrom("dongsanbo@sina.com");  
  41.         helper.setTo("dongsanbo@sina.com");  
  42.         helper.setSubject("注册成功-模板邮件");  
  43.         String htmlText=getMailText(username);//使用模板生成html邮件内容  
  44.         helper.setText(htmlText, true);  
  45.           
  46.         sender.send(msg);  
  47.         System.out.println("成功发送模板邮件");  
  48.     }  
  49.     public static void main(String[] args) throws MessagingException {  
  50.         // TODO Auto-generated method stub  
  51.         ApplicationContext ctx = new FileSystemXmlApplicationContext(     
  52.         "src/applicationContext.xml");   
  53.         TemplateEmailService ms=(TemplateEmailService) ctx.getBean("templateEmail");  
  54.           
  55.         //发送模板邮件  
  56.         ms.sendTemplateMail("yefriend");  
  57.     }//end method  
  58. }  

 

6.3 applicationContext.xml配置文件  

Java代码  收藏代码
  1. <bean id="freeMarker" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">  
  2.   <property name="templateLoaderPath" value="classpath:mailTemplate"/><!--指定模板文件目录-->   
  3.   <property name="freemarkerSettings"><!-- 设置FreeMarker环境属性-->   
  4.       <props>  
  5.           <prop key="template_update_delay">1800</prop><!--刷新模板的周期,单位为秒-->   
  6.           <prop key="default_encoding">UTF-8</prop><!--模板的编码格式 -->  
  7.           <prop key="locale">zh_CN</prop><!-- 本地化设置-->  
  8.       </props>  
  9.   </property>  
  10. </bean>  
  11. <bean id="templateEmail" class="com.bb.spring.email.TemplateEmailService">  
  12.     <property name="sender" ref="mailsender"></property>  
  13.     <property name="freeMarkerConfigurer" ref="freeMarker"></property>  
  14. </bean>   
 

 

    在配置文件中已设置好模板目录,所以可在类中直接用模板文件名来定位模板文件。模板文件用UTF-8编码格式,避免中文乱码。通过设置template_update_delay属性,可让FreeMarker定期刷新模板,从而使应用程序在不重启下更新模板。

 

 至此,可以运行TemplateEmailService类发送邮件,实验表明"yefriend"将替换${username}。

以上来源:http://yefriendly.iteye.com/blog/404358


下面是自己的扩展:

 

实际项目中我们想要动态的指定数据源和模版,就需要如下构造获取方法:

Java代码  收藏代码
  1. public String getMailHtml(Map map, String templateName) {  
  2.         String htmlText = null;  
  3.         try {  
  4.             Template tpl = freeMarkerConfigurer.getConfiguration().getTemplate(templateName);  
  5.             htmlText = FreeMarkerTemplateUtils.processTemplateIntoString(tpl, map);  
  6.         } catch (IOException e) {  
  7.             e.printStackTrace();  
  8.         } catch (TemplateException e) {  
  9.             e.printStackTrace();  
  10.         }  
  11.         return htmlText;  
  12.     }  

 这样就可以如下获取数据:

Java代码  收藏代码
  1. Map<String,Object> map = amendEmailUtils.initAmendPendingEmailMap(hotelbookheader...);  
  2.         String html = mailSender.getMailHtml(map, "amendmentPending.ftl");  

 

如果发件人固定,我们还可以让TemplateEmailService 继承org.springframework.mail.SimpleMailMessage这个类,以使用其中的From或to属性

我的类:

Java代码  收藏代码
  1. public class SimpleMailSender extends SimpleMailMessage {  
  2.    
  3.     private JavaMailSender sender;  
  4.     private MimeMessageHelper messageHellper;  
  5.     private FreeMarkerConfigurer freeMarkerConfigurer;   

 使用:

Java代码  收藏代码
  1. //类属性  
  2. public SimpleMailSender mailSender;  
  3.   
  4. //方法中  
  5. Map<String,Object> map = amendEmailUtils.initAmendPendingEmailMap(hotelbookheader...);  
  6.         String html = mailSender.getMailHtml(map, "amendmentPending.ftl");        
  7.                   
  8.           
  9.         MimeMessage mimeMessage = mailSender.GetSender().createMimeMessage();  
  10.         MimeMessageHelper messageHellper = new MimeMessageHelper(mimeMessage, true"utf-8");  
  11.         messageHellper.setSubject(amendSubjectToUser);  
  12.   
  13.         messageHellper.setFrom(mailSender.getFrom());  
  14. //如果不继承,自定义类SimpleMailSender中就无from、to方法,就不可从配置文件中获取  

 

xml配置:

Java代码  收藏代码
  1. <bean id="mailSender"  
  2.         class="com.techson.himsnanhwa.admin.mail.SimpleMailSender">  
  3.         <property name="javaMailSender"><ref bean="sender"/></property>  
  4.         <property name="freeMarkerConfigurer" ref="freeMarker"></property>    
  5.         <property name="from">  
  6.             <value>wy@techson.com.hk</value>  
  7.         </property>  
  8.         <property name="to">  
  9.             <value>ming@techson.com.hk</value>  
  10.         </property>  
  11.     </bean>  
  12.   
  13. <!--配置邮件模板-->       
  14.     <bean id="freeMarker" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">        
  15.       <property name="templateLoaderPath" value="/mailTemplete"/>          
  16.       <property name="freemarkerSettings">                                
  17.           <props>        
  18.               <prop key="template_update_delay">15</prop>                
  19.               <prop key="default_encoding">UTF-8</prop>               
  20.               <prop key="locale">zh_CN</prop>                          
  21.           </props>        
  22.       </property>        
  23.     </bean>  
  24.   
  25. <bean id="sender"  
  26.         class="org.springframework.mail.javamail.JavaMailSenderImpl">  
  27.         <property name="host">  
  28.             <value>192.168.108.6</value>  
  29.         </property>  
  30.         <property name="javaMailProperties">  
  31.             <props>  
  32.                 <prop key="mail.smtp.auth">true</prop>  
  33.                 <prop key="mail.smtp.timeout">25000</prop>  
  34.             </props>  
  35.         </property>  
  36.         <property name="username">  
  37.             <value>wy</value>  
  38.         </property>  
  39.         <property name="password">  
  40.             <value>wy</value>  
  41.         </property>  
  42.     </bean>  

 。。。

 

 

发送带附件的邮件:

Java代码  收藏代码
  1. MimeMessage message = mailSender.GetSender().createMimeMessage();  
  2.     MimeMessageHelper messageHellper = new MimeMessageHelper(message, true"utf-8");  
  3.     messageHellper.setSubject(subject);  
  4.     messageHellper.setFrom(formMap.get("couemail") + "");  
  5.     messageHellper.setFrom(sender);  
  6.           
  7.     Multipart mp = new MimeMultipart();    
  8.     MimeBodyPart mbp = new MimeBodyPart();     
  9.     File file = new File("E:\\hotel_" + filename + ".xls");  
  10.     FileDataSource fds=new FileDataSource(file);   
  11.         mbp.setDataHandler(new DataHandler(fds));    
  12.         mbp.setFileName(fds.getName());   
  13.         mp.addBodyPart(mbp);    
  14.           
  15.         message.setContent(mp);  
  16.         message.saveChanges();  

 发送成功后可使用

Java代码  收藏代码
  1. fds.getFile().delete();  

 删除文件!

 

参考:http://freeman983.iteye.com/blog/208586

或:

Java代码  收藏代码
  1. String path = ServletActionContext.getServletContext().getRealPath("/download/");  
  2. String destinct = path + "/" + fileName + ".zip";  
  3.   
  4. Resource file = new ServletContextResource(ServletActionContext.getServletContext(),destinct);  
  5. helper.addAttachment("hotel_nh_"+countryCode + ".zip", file.getFile());  
  6.   
  7. 或:  
  8.  message.addAttachment("myDocument.pdf"new ClassPathResource("doc/myDocument.pdf"));  

 。。。

详细参考:http://hi.baidu.com/sleep651/blog/item/90cbcd4635af6b046b63e5a4.html

0 0
原创粉丝点击