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. 安装易邮邮件server, 这个我们在上一篇博文中有讲过, 这里就不再赘述.

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;
	}
}

解决名字乱码问题使用: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>

	<!-- 注意:这里的參数(如username、password)都是针对邮件发送者的 -->
	<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> <!-- 发送者username -->
        </property>
        <property name="password">
            <value>123</value> <!-- 发送者password -->
        </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. 效果图例如以下:

8. 源代码下载地址: http://download.csdn.net/detail/zdp072/7529157

时间: 2024-08-07 04:32:15

Spring整合freemarker发送邮件的相关文章

项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送邮件 5.基于poi实现分区导出

1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法   Shiro框架内部整合好缓存管理器,整合ehcache环境,只需要配置即可.     <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache-core</artifactId> <version>

Spring整合Quartz定时发送邮件

功能描述:刚开始接触Quartz,试着用Quartz整合spring实现每隔一分钟发送一封邮件连续发送10次 核心jar: 邮件发送:commons-email-1.2.jar mail.jar(必须的) quartz:quartz-all-1.8.3.jar quartz-all-1.8.3/lib/下所有jar spring:spring-context-support.ajr(必须的) 只贴出核心代码: Email发送:使用apache commons-email跟mail package

Spring mvc整合freemarker详解

1.什么是FreeMarker FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序 虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据(如下图) 2.FreeMarker特性 能够生成各种文本:HTML.XML.RTF.Java源代码等等 易于嵌入到你的产品中:轻量级:不需要Servl

使用Spring整合javaMail发用邮件

1.导入javamail.jar        自行百度下载 2.使用模板发送邮件架包 freemarker.jar 3.Spring配置文件  以及架包这里就不需要说了吧,如果不明白的发我Email :[email protected] //邮件信息设置类 main.java package cn.jbit.email; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.ut

springMVC+MyBatis+Spring 整合(4) ---解决Spring MVC 对AOP不起作用的问题

解决Spring MVC 对AOP不起作用的问题 分类: SpringMVC3x+Spring3x+MyBatis3x myibaits spring J2EE2013-11-21 11:22 640人阅读 评论(1) 收藏 举报 用的是 SSM3的框架 Spring MVC 3.1 + Spring 3.1 + Mybatis3.1第一种情况:Spring MVC 和 Spring 整合的时候,SpringMVC的springmvc.xml文件中 配置扫描包,不要包含 service的注解,S

springMvc整合Freemarker引入CSS,JS文件404的问题

在spring webmvcjar包中有个spring.ftl的文件 如下图: 你可以把他拷出来,放到你的目录下,也可以不拷出来,具体的用法就是 在你的freemaker模版开头加上 <#import "spring.ftl" as spring/> 如果你烤出了spring.ftl文件,像找存在感的话,比如拷到 当前项目路径的plugins文件下 那么就加上这个路径就好了<#import "plugins/spring.ftl" as sprin

Spring整合JMS(三)——MessageConverter介绍

Spring整合JMS(三)——MessageConverter介绍 博客分类: Spring Jms SpringjmsintegratemessageConverter 1.4     消息转换器MessageConverter MessageConverter的作用主要有两方面,一方面它可以把我们的非标准化Message对象转换成我们的目标Message对象,这主要是用在发送消息的时候:另一方面它又可以把我们的Message对象转换成对应的目标对象,这主要是用在接收消息的时候. 下面我们就

峰哥说技术:08-Spring Boot整合FreeMarker视图

Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 08  峰哥说技术:Spring Boot整合FreeMarker视图 前面带着大家整合了Thymeleaf视图,今天我们继续聊聊关于视图整合的话题.FreeMarker这是一个相当老牌的开源的免费的模版引擎.通过 Freemarker 模版,我们可以将数据渲染成 HTML 网页.电子邮件.配置文件以及源代码等.Freemarker 不是面向最终用户的,而是一个 Java 类库,我们可以将之作为一个普通

springMVC+MyBatis+Spring 整合(3)

spring mvc 与mybatis 的整合. 加入配置文件: spring-mybaits.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xm