分类: freemarker spring 2014-06-20 23:39 752人阅读 评论(0) 收藏 举报

一. 背景知识

在上一篇博文: 使用JavaMail发送邮件和接受邮件, 我们学习了原生的JavaApi发送邮件, 我们会发现代码比较多, 特别是当邮件内容很丰富的时候, 我们需要在Java中拼装Html, 是不是觉得非常麻烦.

下面我们使用一种比较简单的方法: spring + javaMail + freemarker, 使用freemarker模板引擎后, 我们就不用再在Java中拼装html.

二. 环境准备

废话不多说了, 下面我们准备下开发环境:

1. 所需Jar包:

spring.jar(2.5), commons-logging.jar, mail.jar, freemarker.jar, spring-webmvc.jar, activation.jar

2. 安装易邮邮件服务器, 这个我们在上一篇博文中有讲过, 这里就不再赘述.

3. D盘中放一张图片 "welcome.gif" 和一个word文件 "欢迎注册.docx" 以填充邮件内容.

三. 代码实现

1. 代码结构图如下:

2. 实体Bean:

  1. /**
  2. * 用户对象
  3. */
  4. public class User {
  5. private String username;
  6. private String password;
  7. public String getUsername() {
  8. return username;
  9. }
  10. public void setUsername(String username) {
  11. this.username = username;
  12. }
  13. public String getPassword() {
  14. return password;
  15. }
  16. public void setPassword(String password) {
  17. this.password = password;
  18. }
  19. }

2. 发邮件业务接口

  1. public interface EmailService {
  2. public void sendEmail(User user);
  3. }

3. 发邮件实现

  1. public class EmailServiceImpl implements EmailService {
  2. private JavaMailSender mailSender;
  3. private FreeMarkerConfigurer freeMarkerConfigurer;
  4. private static final String ENCODING = "utf-8";
  5. public void setMailSender(JavaMailSender mailSender) {
  6. this.mailSender = mailSender;
  7. }
  8. public void setFreeMarkerConfigurer(FreeMarkerConfigurer freeMarkerConfigurer) {
  9. this.freeMarkerConfigurer = freeMarkerConfigurer;
  10. }
  11. /**
  12. * 发送带附件的html格式邮件
  13. */
  14. public void sendEmail(User user) {
  15. MimeMessage msg = null;
  16. try {
  17. msg = mailSender.createMimeMessage();
  18. MimeMessageHelper helper = new MimeMessageHelper(msg, true, ENCODING);
  19. helper.setFrom("service@estore.com");
  20. helper.setTo("zhangsan@estore.com");
  21. helper.setSubject(MimeUtility.encodeText("estore注册成功提示邮件", ENCODING, "B"));
  22. helper.setText(getMailText(user), true); // true表示text的内容为html
  23. // 添加内嵌文件,第1个参数为cid标识这个文件,第2个参数为资源
  24. helper.addInline("welcomePic", new File("d:/welcome.gif")); // 附件内容
  25. // 这里的方法调用和插入图片是不同的,解决附件名称的中文问题
  26. File file = new File("d:/欢迎注册.docx");
  27. helper.addAttachment(MimeUtility.encodeWord(file.getName()), file);
  28. } catch (Exception e) {
  29. throw new RuntimeException("error happens", e);
  30. }
  31. mailSender.send(msg);
  32. System.out.println("邮件发送成功...");
  33. }
  34. /**
  35. * 通过模板构造邮件内容,参数content将替换模板文件中的${content}标签。
  36. */
  37. private String getMailText(User user) throws Exception {
  38. // 通过指定模板名获取FreeMarker模板实例
  39. Template template = freeMarkerConfigurer.getConfiguration().getTemplate("registe.html");
  40. // FreeMarker通过Map传递动态数据
  41. Map<String, String> map = new HashMap<String, String>();
  42. map.put("username", user.getUsername()); // 注意动态数据的key和模板标签中指定的属性相匹配
  43. map.put("password", user.getPassword());
  44. // 解析模板并替换动态数据,最终content将替换模板文件中的${content}标签。
  45. String htmlText = FreeMarkerTemplateUtils.processTemplateIntoString(template, map);
  46. return htmlText;
  47. }
  48. }

解决名字乱码问题使用:MimeUtility.encodeText(name, "UTF-8", "B")
因为Email的规范,在smtp传输中不可使用中文字符。所以可以使用内置类的MimeUtility方法encodeText将收件人、发件人名字编码即可。

编码方式有两种:"B"代表Base64、"Q"代表QP(quoted-printable)方式。

注意:

1. 不能将名字和email地址一起编码,如直接编码 "Name " 后当做收件人就会出错。

2. Mail的Subject和Content不需要我们显式的编码,在Set的时候这两项会被javax.mail自动编码。

4. spring核心配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
  4. xmlns:tx="http://www.springframework.org/schema/tx"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  7. http://www.springframework.org/schema/aop
  8. http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
  9. http://www.springframework.org/schema/tx
  10. http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
  11. <bean id="freeMarker" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  12. <property name="templateLoaderPath" value="classpath:" /> <!-- 指定模板文件目录  -->
  13. <property name="freemarkerSettings"><!-- 设置FreeMarker环境属性 -->
  14. <props>
  15. <prop key="template_update_delay">1800</prop> <!--刷新模板的周期,单位为秒 -->
  16. <prop key="default_encoding">UTF-8</prop> <!--模板的编码格式 -->
  17. <prop key="locale">zh_CN</prop> <!--本地化设置-->
  18. </props>
  19. </property>
  20. </bean>
  21. <!-- 注意:这里的参数(如用户名、密码)都是针对邮件发送者的 -->
  22. <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
  23. <property name="host">
  24. <value>localhost</value>
  25. </property>
  26. <property name="javaMailProperties">
  27. <props>
  28. <prop key="mail.smtp.auth">true</prop>
  29. <prop key="mail.smtp.timeout">25000</prop>
  30. </props>
  31. </property>
  32. <property name="username">
  33. <value>service</value> <!-- 发送者用户名 -->
  34. </property>
  35. <property name="password">
  36. <value>123</value> <!-- 发送者密码 -->
  37. </property>
  38. </bean>
  39. <bean id="emailService" class="com.zdp.service.impl.EmailServiceImpl">
  40. <property name="mailSender" ref="mailSender"></property>
  41. <property name="freeMarkerConfigurer" ref="freeMarker"></property>
  42. </bean>
  43. </beans>

5. 模板文件:

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <html>
  3. <head>
  4. <meta http-equiv="content-type" content="text/html;charset=utf8">
  5. </head>
  6. <body>
  7. 恭喜您成功注册estore!<br/>
  8. 您的用户名为:<font color='red' size='20'>${username}</font>,
  9. 您的密码为:<font color='red' size='20'>${password}</font>  <img src='cid:welcomePic'/>
  10. </body>
  11. </html>

6. 单元测试:

  1. public class EmailServiceImplTest {
  2. @Test
  3. public void testSendEmail() {
  4. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  5. EmailService emailService = (EmailService) context.getBean("emailService");
  6. User user = new User();
  7. user.setUsername("zhangsan");
  8. user.setPassword("123");
  9. emailService.sendEmail(user);
  10. }
  11. }

7. 效果图如下:

8. 源码下载地址: http://download.csdn.net/detail/zdp072/7529157

Spring整合freemarker发送邮件的更多相关文章

  1. java Spring整合Freemarker的详细步骤

    java Spring整合Freemarker的详细步骤 作者: 字体:[增加 减小] 类型:转载 时间:2013-11-14我要评论 本文对Spring整合Freemarker步骤做了详细的说明,按 ...

  2. 项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送邮件 5.基于poi实现分区导出

    1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法   Shiro框架内部整合好缓存管理器, ...

  3. spring整合freemarker

    一.配置maven <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...

  4. spring整合freemarker 自定义标签

    1.自定义标签实现 TemplateDirectiveModel 接口 2.spring 配置,注意标红的两行 <bean id="freemarkerConfig" cla ...

  5. spring 整合freemarker 实现模板继承

    <!--freemarker 配置--> <bean id="freemarkerConfig" class="org.springframework. ...

  6. Spring整合MyBatis

    前言:MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis 使用简单的XML或注解用 ...

  7. SpringMVC整合freeMarker实现页面静态化+SpringMVC配置多视图

    一.背景 1.什么是FreeMarker FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于 ...

  8. 【转载】Spring MVC 整合 Freemarker

    前言 1.为什么要使用Spring MVC呢? 2.为什么要使用Freemarker呢? 3.为什么不使用Struts2呢? 此示例出现的原因就是发现了struts2的性能太差,所以学习Spring ...

  9. Spring mvc整合freemarker详解

    1.什么是FreeMarker FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式 ...

随机推荐

  1. JavaScript、jQuery、HTML5、Node.js实例大全-读书笔记1

    技术很多,例子很多,只好慢慢学,慢慢实践!!现在学的这本书是[JavaScript实战----JavaScript.jQuery.HTML5.Node.js实例大全] 第 3 章 用 JavaScri ...

  2. C++四种强制类型转换关键字

    C语言使用强制类型转换(Type Cast)很简单,不管什么类型的转换,形式都如下: TYPE b = (TYPE)a; c++提供了4种类型转换操作符来应对不同场合的应用. const_cast   ...

  3. C# 代理HTTP请求

    目的: 应该有不少人需要去某些网站不停爬取数据,有时会使用HTTPRequest一直请求某个网站的某个网址.有的网站比如 QQ空间,赶集网(这是我测试的网站),不停刷新会提醒你的账号异常,可能会查封你 ...

  4. c# Aes加解密和对象序列化

    aes加解密 public class AesCryptto { private string key = "hjyf57468jhmuist"; private string i ...

  5. mysql配置优化测试

    http://bjlfp.blog.163.com/blog/static/77368461201211695924524/ 感觉真不错啊.观察几天看看

  6. html5 全屏滚动活动页学习

    先看几个具体的实例: 1.腾讯娱乐:http://ent.qq.com/zt2014/qqent/h5.htm?from=groupmessage&isappinstalled=0 2.苏宁互 ...

  7. Dapper.ColumnMapper 的使用

    using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; usin ...

  8. Python数据结构——二叉树的实现

    1. 二叉树 二叉树(binary tree)中的每个节点都不能有多于两个的儿子. 1.1 二叉树列表实现 如上图的二叉树可用列表表示: tree=['A', #root ['B', #左子树 ['D ...

  9. Fedora 17安装NFS

    1.NFS概述 NFS(Network File System)是一种分布式文件系统,允许网络中的安装不同操作系统的计算机间共享文件和外设,所以它的通讯协定设计与主机及作业系统无关. 它是由SUN公司 ...

  10. 【IOS】分享下近一年IOS开发的经验总结

    从上个暑假末到现在,自己做IOS开发也快一年了.从一开始的什么都不知道,到现在大多事都能搭上一两手,期间经历了很多事情.下面来和大家分享一下心得和感触. 1.现在移动领域的知识更新的很快,无论是IOS ...