Spring整合freemarker发送邮件

标签: spring freemarker 邮件 | 发表时间:2014-06-21 07:39 | 作者:zdp072
出处:http://blog.csdn.net

一. 背景知识

在上一篇博文:  使用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("[email protected]");
			helper.setTo("[email protected]");
			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;
	}
}
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. 效果图如下:




作者:zdp072 发表于2014-6-20 23:39:13 原文链接
阅读:7 评论:0 查看评论

相关 [spring freemarker 邮件] 推荐:

Spring整合freemarker发送邮件

- - CSDN博客推荐文章
在上一篇博文:  使用JavaMail发送邮件和接受邮件, 我们学习了原生的JavaApi发送邮件, 我们会发现代码比较多, 特别是当邮件内容很丰富的时候, 我们需要在Java中拼装Html, 是不是觉得非常麻烦. . 下面我们使用一种比较简单的方法: spring + javaMail + freemarker, 使用freemarker模板引擎后, 我们就不用再在Java中拼装html..

maven工程下整合spring+mybatis+freemarker

- - CSDN博客架构设计推荐文章
博客地址:http://zhengyinhui.com/?p=142. 由于工作主要是前端开发,做后端的项目比较少,最近自己做个项目,发觉好多的都忘了,这里写篇博客整理下maven工程下整合spring+mybatis+freemarker相关内容. 新建个Archetype为maven-archetype-webapp的maven项目(安装maven插件:http://download.eclipse.org/technology/m2e/releases),在pom文件添加相关依赖:.

freemarker生成word

- - 开源软件 - ITeye博客
freemarker生成word.          利用freemarker生成word,在项目中有用到,就单独写个测试以及用法列出来,欢迎圈错,共同学习.       一、应用场景和效果图.             1.应用场景:.                    a.xx项目里面需要定期生成xx报告,记录最近xx情况.

java导出word之freemarker导出

- - 企业架构 - ITeye博客
       一,简单模板导出(不含图片, 不含表格循环).          1, 新建一个word文档, 输入如下类容:.          2, 将该word文件另存为xml格式(注意是另存为,不是直接改扩展名).          3, 将xml文件的扩展名直接改为ftl.          4, 用java代码完成导出(需要导入freemarker.jar).

struts2中使用freemarker 生成静态页面

- - CSDN博客推荐文章
2.导入struts2的相关jar文件. 3.在web.xml中配置如下:. 4.创建struts.xml文件,具体内容如下:. 在配置视图类型时,也可以直接用type="freemarker"这个访问指定的模板,在这里我用的是动态访问生成的html页面. 5,创建javaBean  User.java.

基于springboot的freemarker创建指定格式的word文档

- - 互联网 - ITeye博客
       在web或其他应用中,经常我们需要导出或者预览word文档,比较实际的例子有招聘网站上预览或者导出个人简历,使用POI导出excel会非常的方便,但是如果想导出word,由于其格式控制非常复杂,故而使用POI将会非常麻烦,而FreeMarker则可以较好的解决这个问题;并且,根据FreeMarker的实现原理,预览word也会变得非常简单.

使用FreeMarker替换JSP的10个理由

- - ImportNew
你还在使用 Java 服务器页面(俗称JSP)吗. 我曾经也是,但是几年前我抛弃了它们,并且再也没有用过JSP了. JSP 是个很好的概念,但是它却剥夺了 web 开发的乐趣. 对我而言,这些都是小事,比如无法在页面模板上使用单独的文件header.jsp 和 footer.jsp,不能调用表达式语言的方法,在运行时无法合并,重新排列页面的各个部分.

FreeMarker 快速入门 - JavaEE教程 - SegmentFault 思否

- -
FreeMarker 快速入门. FreeMarker是一个很值得去学习的模版引擎. 它是基于模板文件生成其他文本的通用工具. 本章内容通过如何使用FreeMarker生成Html web 页面 和 代码自动生成工具来快速了解FreeMarker. FreeMarker是一款用java语言编写的模版引擎,它虽然不是web应用框架,但它很合适作为web应用框架的一个组件.

Spring详解

- - CSDN博客架构设计推荐文章
Spring是一个开源的控制反转(Inversion of Control ,IoC)和面向切面(AOP)的容器框架.它的主要目的是简化企业开发.. PersonDaoBean 是在应用内部创建及维护的. 所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的.

Spring定时

- - 行业应用 - ITeye博客
spring的定时任务配置分为三个步骤:. . . . . .