Spring整合freemarker发送邮件
一. 背景知识
在上一篇博文: 使用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:
- /**
- * 用户对象
- */
- public class User {
- private String username;
- private String password;
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- }
2. 发邮件业务接口
- public interface EmailService {
- public void sendEmail(User user);
- }
3. 发邮件实现
- public class EmailServiceImpl implements EmailService {
- private JavaMailSender mailSender;
- private FreeMarkerConfigurer freeMarkerConfigurer;
- private static final String ENCODING = "utf-8";
- public void setMailSender(JavaMailSender mailSender) {
- this.mailSender = mailSender;
- }
- public void setFreeMarkerConfigurer(FreeMarkerConfigurer freeMarkerConfigurer) {
- this.freeMarkerConfigurer = freeMarkerConfigurer;
- }
- /**
- * 发送带附件的html格式邮件
- */
- public void sendEmail(User user) {
- MimeMessage msg = null;
- try {
- msg = mailSender.createMimeMessage();
- MimeMessageHelper helper = new MimeMessageHelper(msg, true, ENCODING);
- helper.setFrom("service@estore.com");
- helper.setTo("zhangsan@estore.com");
- helper.setSubject(MimeUtility.encodeText("estore注册成功提示邮件", ENCODING, "B"));
- helper.setText(getMailText(user), true); // true表示text的内容为html
- // 添加内嵌文件,第1个参数为cid标识这个文件,第2个参数为资源
- helper.addInline("welcomePic", new File("d:/welcome.gif")); // 附件内容
- // 这里的方法调用和插入图片是不同的,解决附件名称的中文问题
- File file = new File("d:/欢迎注册.docx");
- helper.addAttachment(MimeUtility.encodeWord(file.getName()), file);
- } catch (Exception e) {
- throw new RuntimeException("error happens", e);
- }
- mailSender.send(msg);
- System.out.println("邮件发送成功...");
- }
- /**
- * 通过模板构造邮件内容,参数content将替换模板文件中的${content}标签。
- */
- private String getMailText(User user) throws Exception {
- // 通过指定模板名获取FreeMarker模板实例
- Template template = freeMarkerConfigurer.getConfiguration().getTemplate("registe.html");
- // FreeMarker通过Map传递动态数据
- Map<String, String> map = new HashMap<String, String>();
- map.put("username", user.getUsername()); // 注意动态数据的key和模板标签中指定的属性相匹配
- map.put("password", user.getPassword());
- // 解析模板并替换动态数据,最终content将替换模板文件中的${content}标签。
- String htmlText = FreeMarkerTemplateUtils.processTemplateIntoString(template, map);
- return htmlText;
- }
- }
解决名字乱码问题使用: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核心配置
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
- <bean id="freeMarker" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
- <property name="templateLoaderPath" value="classpath:" /> <!-- 指定模板文件目录 -->
- <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="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
- <property name="host">
- <value>localhost</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>service</value> <!-- 发送者用户名 -->
- </property>
- <property name="password">
- <value>123</value> <!-- 发送者密码 -->
- </property>
- </bean>
- <bean id="emailService" class="com.zdp.service.impl.EmailServiceImpl">
- <property name="mailSender" ref="mailSender"></property>
- <property name="freeMarkerConfigurer" ref="freeMarker"></property>
- </bean>
- </beans>
5. 模板文件:
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <meta http-equiv="content-type" content="text/html;charset=utf8">
- </head>
- <body>
- 恭喜您成功注册estore!<br/>
- 您的用户名为:<font color='red' size='20'>${username}</font>,
- 您的密码为:<font color='red' size='20'>${password}</font> <img src='cid:welcomePic'/>
- </body>
- </html>
6. 单元测试:
- public class EmailServiceImplTest {
- @Test
- public void testSendEmail() {
- ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
- EmailService emailService = (EmailService) context.getBean("emailService");
- User user = new User();
- user.setUsername("zhangsan");
- user.setPassword("123");
- emailService.sendEmail(user);
- }
- }
7. 效果图如下:
Spring整合freemarker发送邮件的更多相关文章
- java Spring整合Freemarker的详细步骤
java Spring整合Freemarker的详细步骤 作者: 字体:[增加 减小] 类型:转载 时间:2013-11-14我要评论 本文对Spring整合Freemarker步骤做了详细的说明,按 ...
- 项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送邮件 5.基于poi实现分区导出
1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法 Shiro框架内部整合好缓存管理器, ...
- spring整合freemarker
一.配置maven <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...
- spring整合freemarker 自定义标签
1.自定义标签实现 TemplateDirectiveModel 接口 2.spring 配置,注意标红的两行 <bean id="freemarkerConfig" cla ...
- spring 整合freemarker 实现模板继承
<!--freemarker 配置--> <bean id="freemarkerConfig" class="org.springframework. ...
- Spring整合MyBatis
前言:MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis 使用简单的XML或注解用 ...
- SpringMVC整合freeMarker实现页面静态化+SpringMVC配置多视图
一.背景 1.什么是FreeMarker FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于 ...
- 【转载】Spring MVC 整合 Freemarker
前言 1.为什么要使用Spring MVC呢? 2.为什么要使用Freemarker呢? 3.为什么不使用Struts2呢? 此示例出现的原因就是发现了struts2的性能太差,所以学习Spring ...
- Spring mvc整合freemarker详解
1.什么是FreeMarker FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式 ...
随机推荐
- 使用Ctex总结1
使用Ctex应该是每一个做学术研究的人要学会掌握的. 它的基本结构: \documentclass[11pt,two side,a4paper]{cctart}%使用cctart可以让摘要变成中文,比 ...
- (转)Redis 集群方案
根据一些测试整理出来的一份方案: 1. Redis 性能 对于redis 的一些简单测试,仅供参考: 测试环境:Redhat6.2 , Xeon E5520(4核)*2/8G,1000M网卡 Redi ...
- pickle模块的基本使用
pickle是python的biult-in模块: python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储 ...
- 《编写高质量代码-Web前端开发修改之道》笔记--第二章 团队合作
本章内容: 揭秘前端开发工程师 欲精一行,必先通十行 增加代码的可读性--注释 提高重用性--公共组件和私有组件的维护 冗余和精简的矛盾--选择集中还是选择分散 磨刀不误砍柴工--前期的构思很重要 制 ...
- DTCMS,手机网站访问跳转到DTCMS官网解决方法
mobile\js\base.js main\js\common.js 去掉location.href = 'http://m.dtcms.net'; 也可以设定手机访问跳转到指定域名
- AngularJS(10)-数据验证
AngularJS 表单和控件可以提供验证功能,并对用户输入的非法数据进行警告.客户端的验证不能确保用户输入数据的安全,所以服务端的数据验证也是必须的. <!DOCTYPE html> & ...
- HttpClient SSL示例(转)
原文地址: http://www.cnblogs.com/jerry19890622/p/4291053.html package com.jerry.httpclient; import java. ...
- Websocket协议之php实现
前面学习了HTML5中websocket的握手协议.打开和关闭连接等基础内容,最近用php实现了与浏览器websocket的双向通信.在学习概念的时候觉得看懂了的内容,真正在实践过程中还是会遇到各种问 ...
- zhuan: ubuntu 安装 apache2
安装 用 sudo apt-get install apache2 sudo /etc/init.d/apache2 restart 如果发现错误: 以下from:http://cache.baid ...
- RedHat6.4 用UDEV配置ASM所需磁盘
同事在装一套RAC测试环境,结果发现原来用ASMLIB来配置磁盘,在安装GRID的时候,最终报错了,经过检查发现居然两边的磁盘不匹配.A机的sdb,sdc分别对应OCRVOL1,OCRVOL2,但是B ...