使用FreeMarker邮件模版来发送邮件
2017-04-13 10:22
169 查看
Spring为FreeMarker提供了一个FreeMarkerConfigurer类,通过此类可方便地创建FreeMarker的基础环境,Spring提供FreeMarkerTemplateUtils工具类来完成解析模板的任务。
下面以用户注册成功后发送的模板文件registerUser.ftl,将该文件放在src/mailTemplate下:
6.1
模板文件
上面的${username}标签代表一个可被替换的动态属性。FreeMarker模板的标签支持级联属性,如${user.Id}则表示user对象的Id属性。
6.2
使用FreeMarker模板技术构造邮件内容
6.3 applicationContext.xml配置文件
在配置文件中已设置好模板目录,所以可在类中直接用模板文件名来定位模板文件。模板文件用UTF-8编码格式,避免中文乱码。通过设置template_update_delay属性,可让FreeMarker定期刷新模板,从而使应用程序在不重启下更新模板。
至此,可以运行TemplateEmailService类发送邮件,实验表明"yefriend"将替换${username}。
以上来源:http://yefriendly.iteye.com/blog/404358
下面是自己的扩展:
实际项目中我们想要动态的指定数据源和模版,就需要如下构造获取方法:
这样就可以如下获取数据:
如果发件人固定,我们还可以让TemplateEmailService 继承org.springframework.mail.SimpleMailMessage这个类,以使用其中的From或to属性
我的类:
使用:
xml配置:
。。。
发送带附件的邮件:
发送成功后可使用
删除文件!
参考:http://freeman983.iteye.com/blog/208586
或:
。。。
详细参考:http://hi.baidu.com/sleep651/blog/item/90cbcd4635af6b046b63e5a4.html
下面以用户注册成功后发送的模板文件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>
上面的${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 }
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>
在配置文件中已设置好模板目录,所以可在类中直接用模板文件名来定位模板文件。模板文件用UTF-8编码格式,避免中文乱码。通过设置template_update_delay属性,可让FreeMarker定期刷新模板,从而使应用程序在不重启下更新模板。
至此,可以运行TemplateEmailService类发送邮件,实验表明"yefriend"将替换${username}。
以上来源:http://yefriendly.iteye.com/blog/404358
下面是自己的扩展:
实际项目中我们想要动态的指定数据源和模版,就需要如下构造获取方法:
public String getMailHtml(Map map, String templateName) { String htmlText = null; try { Template tpl = freeMarkerConfigurer.getConfiguration().getTemplate(templateName); htmlText = FreeMarkerTemplateUtils.processTemplateIntoString(tpl, map); } catch (IOException e) { e.printStackTrace(); } catch (TemplateException e) { e.printStackTrace(); } return htmlText; }
这样就可以如下获取数据:
Map<String,Object> map = amendEmailUtils.initAmendPendingEmailMap(hotelbookheader...); String html = mailSender.getMailHtml(map, "amendmentPending.ftl");
如果发件人固定,我们还可以让TemplateEmailService 继承org.springframework.mail.SimpleMailMessage这个类,以使用其中的From或to属性
我的类:
public class SimpleMailSender extends SimpleMailMessage { private JavaMailSender sender; private MimeMessageHelper messageHellper; private FreeMarkerConfigurer freeMarkerConfigurer;
使用:
//类属性
public SimpleMailSender mailSender;
//方法中
Map<String,Object> map = amendEmailUtils.initAmendPendingEmailMap(hotelbookheader...); String html = mailSender.getMailHtml(map, "amendmentPending.ftl");
MimeMessage mimeMessage = mailSender.GetSender().createMimeMessage();
MimeMessageHelper messageHellper = new MimeMessageHelper(mimeMessage, true, "utf-8");
messageHellper.setSubject(amendSubjectToUser);
messageHellper.setFrom(mailSender.getFrom());
//如果不继承,自定义类SimpleMailSender中就无from、to方法,就不可从配置文件中获取
xml配置:
<bean id="mailSender" class="com.techson.himsnanhwa.admin.mail.SimpleMailSender"> <property name="javaMailSender"><ref bean="sender"/></property> <property name="freeMarkerConfigurer" ref="freeMarker"></property> <property name="from"> <value>wy@techson.com.hk</value> </property> <property name="to"> <value>ming@techson.com.hk</value> </property> </bean> <!--配置邮件模板--> <bean id="freeMarker" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath" value="/mailTemplete"/> <property name="freemarkerSettings"> <props> <prop key="template_update_delay">15</prop> <prop key="default_encoding">UTF-8</prop> <prop key="locale">zh_CN</prop> </props> </property> </bean> <bean id="sender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> <property name="host"> <value>192.168.108.6</value> </property> <property name="javaMailProperties"> <props> <prop key="mail.smtp.auth">true</prop> <prop key="mail.smtp.timeout">25000</prop> </props> </property> <property name="username"> <value>wy</value> </property> <property name="password"> <value>wy</value> </property> </bean>
。。。
发送带附件的邮件:
MimeMessage message = mailSender.GetSender().createMimeMessage(); MimeMessageHelper messageHellper = new MimeMessageHelper(message, true, "utf-8"); messageHellper.setSubject(subject); messageHellper.setFrom(formMap.get("couemail") + ""); messageHellper.setFrom(sender); Multipart mp = new MimeMultipart(); MimeBodyPart mbp = new MimeBodyPart(); File file = new File("E:\\hotel_" + filename + ".xls"); FileDataSource fds=new FileDataSource(file); mbp.setDataHandler(new DataHandler(fds)); mbp.setFileName(fds.getName()); mp.addBodyPart(mbp); message.setContent(mp); message.saveChanges();
发送成功后可使用
fds.getFile().delete();
删除文件!
参考:http://freeman983.iteye.com/blog/208586
或:
String path = ServletActionContext.getServletContext().getRealPath("/download/"); String destinct = path + "/" + fileName + ".zip"; Resource file = new ServletContextResource(ServletActionContext.getServletContext(),destinct); helper.addAttachment("hotel_nh_"+countryCode + ".zip", file.getFile()); 或: message.addAttachment("myDocument.pdf", new ClassPathResource("doc/myDocument.pdf"));
。。。
详细参考:http://hi.baidu.com/sleep651/blog/item/90cbcd4635af6b046b63e5a4.html
相关文章推荐
- 使用FreeMarker邮件模版来发送邮件
- Java使用freemarker模版发送包含图片邮件
- 使用FreeMarker邮件模版来发送邮件
- 使用FreeMarker邮件模版来发送邮件
- Spring 4 使用Freemarker模板发送邮件&添加附件
- Spring 发送邮件 (3) Spring使用模板Freemarker
- Spring 4 使用Freemarker模板发送邮件&添加附件
- spring使用FreeMarker模板发送邮件及附件笔记
- SpringBoot使用FreeMarker模板发送邮件
- 使用freemarker作为报文发送模版
- 无xml配置——使用Spring发送自定义模版邮件通知
- java使用Freemarker模板发送固定格式邮件
- 使用Spring发送基于freemarker模板的邮件
- 使用 MAPI 实现邮件发送
- 使用.net的SmtpMail发送邮件及本机SMTP的简单配置
- C#使用CDO发送邮件
- C#使用CDO发送邮件
- 在Asp.Net中使用SmtpMail发送邮件的方法
- 使用.NET发送邮件
- 使用需要验证的邮件服务器发送邮件的方法