分类: 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. YSPASYS 中小型企业简单员工评价考核系统

    背景:公司运营接近2年时间了,随着不断的有员工入职.离职,使用信息化管理员工各类信息是一件很有必要的事儿.诸如员工基本信息,内部公告,资产盘点,客户管理,工作周报,优秀员工评选,请假.外出.报销.采购 ...

  2. javascript笔记---算法基础学习

  3. javascript笔记——placehold

    <input type="text" name="搜索" value="搜索" placeholder="搜索" ...

  4. Linux 下面对物理地址的访问

    参考链接:http://zhuhaibobb.blog.163.com/blog/static/2744006720101049030606/ Linux内核提供了/dev/mem驱动,提供了一种直接 ...

  5. 利用Linux下的pthread_mutex_t类型来实现哲学家进餐问题

    首先说一下什么是哲学家进餐问题,这是操作系统课程中一个经典的同步问题, 问题如下:如上图,有6个哲学家和6根筷子(那个蓝色部分表示哲学家,那个紫色长条部分表示筷子),他们分别被编了0~5的号!如果某个 ...

  6. 【原】Oracle查询指定表里的触发器

    select * from all_triggers WHERE table_name='表名'

  7. Java执行命令行脚本

    百度到的 Process p=Runtime.getRuntime().exec("C:\\test.cmd"); ProcessBuilder processBuilder=ne ...

  8. php中类的声明与使用

    <?php /**php语言是支持面向对象编程的,对于面向对象的编程,学过java和C++的人都知道啊! *如果不清楚的去baidu问一下就可以了. */ //我们来定义一个类,定义类的关键字是 ...

  9. 解决CxGrid Filter 后,通过 Dataset 循环时得出的结果与 Grid显示不同步的问题.

    // 方案1: 强制cxgrid 使用 dataset的 Filter GridMaster.DataController.Filter.AutoDataSetFilter := True; /// ...

  10. Oracle全表扫描

    优化器在形成执行计划时需要做的一个重要选择——如何从数据库查询出需要的数据.对于SQL语句存取的任何表中的任何行,可能存在许多存取路径(存取方法),通过它们可以定位和查询出需要的数据.优化器选择其中自 ...