分类: 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. windows API 核心编程学习心得

    一.错误处理 在内部,当windows函数检测到错误时,它会使用“线程本地存储区”的机制将相应的错误代码与“主调线程”关联到一起. winError.h 一般在C:\Program Files\Mic ...

  2. Poj 2109 / OpenJudge 2109 Power of Cryptography

    1.Link: http://poj.org/problem?id=2109 http://bailian.openjudge.cn/practice/2109/ 2.Content: Power o ...

  3. Windows Phone 为指定容器内的元素设置样式

    在Windows Phone中设置元素样式有多种 拿TextBlock来说 1.我们可以直接在控件上设置: <TextBlock Text="自身样式设置" Width=&q ...

  4. automake使用

    antuomake 流程图: http://blog.csdn.net/houwei544/article/details/8185916 这个教程不错 https://www.ibm.com/dev ...

  5. CSS3单位

    em 做前端的应该对em不陌生,不是什么罕见的单位,是相对单位,参考物是父元素的font-size,具有继承的特点.如果字体大小是16px(浏览器的默认值),那么 1em = 16px. 不过,这样使 ...

  6. Linux文件目录结构说明

  7. CentOS6.5下 yum安装LAMP

    CentOS下yum安装LAMP   1. 用yum安装Apache,Mysql,PHP. 1.1安装Apache yum install httpd httpd-devel 安装完成后,用/etc/ ...

  8. 我用的一些Node.js开发工具、开发包、框架等总结

    开发工具 1.WebStorm,毫无疑问非他莫属,跨平台,强大的代码提示,支持Nodejs调试,此外还支持vi编辑模式,这点我很喜欢. 2.做些小型项目用Sublime Text. 3.Browser ...

  9. 一些shell脚本实例

    在群里也混了不少时间了.总结一些实例 #统计QQ消息里面某个用户改名字的记录# awk -f# 聊改名字记录#特殊例子 例如#2013-11-28 9:23:56 北京-AA-Vip<12345 ...

  10. UltraEdit 列模式

    使用UltraEdit 列模式 1 进入UltraEdit列模式 a)       通过快捷方式 Alt +c b)       UltraEdit --> Column Mode