分类: 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. php和apache的关系和作用()

    出处:http://blog.csdn.net/hongweideng/article/details/41723465 php和apache的关系和作用是很多学习php的朋友非常关注的问题 首先在一 ...

  2. 指针与strncpy---内存

    指针的形式的赋值和strncpy的赋值 e.SetAttr("Amt", ToString(dAmt)      ); e.SetAttr("Amt", sAm ...

  3. PHP 跨域写cookie

    实际工作中,类似这样的要求很多,比如说,我们有两个域名,我们想实现在一个域名登录后,能自动完成另一个域名的登录,也就是PASSPORT的功能. 我只写一个大概,为了测试的方便,先编辑hosts文件,加 ...

  4. Ecshop实现仿Taobao地区运费模板

    目录: 1.Ecshop后台配送方式创建 2.商品绑定配送方式的运费模板 2.1 数据表“ecs_goods”增加一个字段,执行下面SQL语句: 2.2 后台添加/编辑 商品 调出已经安装配送方式 & ...

  5. 增加p()函数,方便开发中对变量打印调试

    在开发的过程中,我们经常要输出一下变量看看得到的结果是什么,我们就要根据变量的类型选择使用echo,print_r或者var_dump,brophp框架中的p()函数会自动根据变量类型选择用什么方法为 ...

  6. Nat网络地址转换

    Nat中的术语 -------------------------------------------------------------------------------------------- ...

  7. hdu 4641 K-string SAM的O(n^2)算法 以及 SAM+并查集优化

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4641 题意:有一个长度为n(n < 5e4)的字符串,Q(Q<=2e5)次操作:操作分为:在末 ...

  8. 【转】perl 变量 $/ 的用法解析 上下文为行模式时,$/ 定义以什么来区分行

    默认状态下,很显然都是用\n来区分行,\n也被我们称作为换行符. 当读取序列时,按行来读取时,就是以换行符为标准. 读取的strawberry1.gb的文件内容如下: LOCUS JX118024 4 ...

  9. Linux C程序的编译过程

    Linux C程序的编译过程 学习一门语言程序,本人觉得还是得学习它的编译规则,现在,通过小例子小结下自己对C编译的认识. /*test.c     了解C程序的编译*/ #include <s ...

  10. Unity3d + UGUI 的多分辨率适配

    原文地址:http://blog.csdn.net/dingkun520wy/article/details/49471789 1.Canvas的属性配置 2.Canvas Scaler的属性配置 3 ...