`
wdmcygah
  • 浏览: 60361 次
社区版块
存档分类
最新评论

使用Spring发送基于freemarker模板的邮件

阅读更多

在项目开发过程中,我们经常会遇到需要发送邮件的场景,比如:用户验证邮箱的时候,有活动通知或者提醒通知的时候……有些时候我们可能只需要发送一些简单文本内容即可,但是大多数情况下我们更希望邮件的内容是丰富多彩,而且是“定制的”,能够灵活修改。这时候使用一个方便修改的邮件模板就显得非常必要了。

对于发送邮件,大家都知道Oracle提供了官方的JavaMail API,这个API没有包含在标准的JDK中,所以需要额外下载。JavaMail功能全而强大,但是在易用性方面还是略微差点,这方面Spring对JavaMail API的调用作了很好的封装,让开发者更多地考虑邮件的内容处理即可。至于邮件模板的生成,这里选用非常强大且好用的模板引擎Freemarker。

下面是简单的代码示例:
一、发送邮件处理类

FreemarkerMailService.java

/**
 * 使用freemarker文件作为模板发送邮件
 * @author wdmcygah
 *
 */
@Service
public class FreemarkerMailService {

	@Autowired
	private JavaMailSender mailSender;
	
	@Autowired
	private FreeMarkerConfigurer fmConfigurer;
	
	/**
	 * 发送邮件
	 * @param templateName 模板文件名
	 * @param toEmailAddr  要发送到的邮箱地址
	 * @param subject	邮件主题名
	 * @param content	邮件内容
	 */
	public void sendMail(String templateName,String toEmailAddr, String subject, Map<String,String> content){
		MimeMessage msg = mailSender.createMimeMessage();
		try {
			MimeMessageHelper helper=new MimeMessageHelper(msg,false,"utf-8");
			//要发送到的邮箱地址
			helper.setTo(toEmailAddr);
			//从哪发送的邮箱地址,自己改成真实的
			helper.setFrom("fromEmailAddress");
			helper.setSubject(subject);
			String text = getMailContent(content,templateName);
			helper.setText(text,true);
			helper.setSentDate(new Date());
			mailSender.send(helper.getMimeMessage());
		} catch (MessagingException e) {
			e.printStackTrace();
			System.out.println("发送邮件异常");
		}
		
	}

	/**
	 * 根据模板获得解析后的内容
	 * @param content	邮件内容
	 * @param templateName	邮件模板名
	 * @return
	 */
	private String getMailContent(Map<String,String> content, String templateName) {
		String result = null;
		try {
			Template template = fmConfigurer.getConfiguration().getTemplate(templateName);
			result = FreeMarkerTemplateUtils.processTemplateIntoString(template, content);
		} catch (IOException e) {
			e.printStackTrace();
			System.out.println("获得freemarker模板出错");
		} catch (TemplateException e) {
			e.printStackTrace();
			System.out.println("模板解析出错");
		}
		return result;
	}
}

 

二、关键配置文件

spring-mail.xml

<bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
		<!-- 这里选用163邮件服务器地址 -->
		<property name="host" value="smtp.163.com"></property>
		<!-- 用户名、密码改成自己真实的 -->
		<property name="username" value="real_username"></property>
		<property name="password" value="real_password"></property>
		<property name="defaultEncoding" value="UTF-8"></property>
		<property name="javaMailProperties">
			<props>
				<prop key="mail.smtp.auth">true</prop>
			</props>
		</property>
	</bean>	

	<bean id="freeMarker" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">  
      <property name="templateLoaderPath" value="classpath:/freemarker"/><!--指定模板文件目录-->   
      <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> 
 

 

三、Freemarker模板文件

hello.ftl

恭喜你,${name}!你已经用spring+freemarker发送了一封模板邮件!

 

四、主要依赖包

<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>4.0.0.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>javax.mail</groupId>
			<artifactId>mail</artifactId>
			<version>1.4.7</version>
		</dependency>
<dependency>
			<groupId>org.freemarker</groupId>
			<artifactId>freemarker</artifactId>
			<version>2.3.21</version>
		</dependency>

 

五、测试类

public class FreemarkerMailServiceTest extends BaseTest{

  @Autowired
  private FreemarkerMailService fmService;
	
  @Test
  public void sendMail() {
	  String templateName = "hello.ftl";
	  Map<String,String> content = new HashMap<String, String>();
	  content.put("name", "wdmcygah");
	  String addr = "ToEmailAddress";
	  String subject = "测试";
	  fmService.sendMail(templateName, addr, subject, content);
  }
}

 

如果想看完整源码,可以到我的Github仓库查看:https://github.com/wdmcygah/research-spring
另外有些时候你可能只是想发送简单文本,那就在设置邮件内容(setText)的时候设置简单文本即可,同时比如邮件里面希望附带附件之类的,只需调用MimeMessageHelper的addAttachment方法即可。类似下面的这种处理方式:

JavaMailService.java

 

/**
 * 邮件发送处理类
 * @author wdmcygah
 *
 */
@Service
public class JavaMailService {

	@Autowired
	private JavaMailSender mailSender;
	
	/**
	 * 发送简单文本
	 */
	public void sendSimpleMail(){
		MimeMessage javaMailMessage = mailSender.createMimeMessage();
		MimeMailMessage msgWrapper = new MimeMailMessage(javaMailMessage);
		msgWrapper.setTo("toEmailAddress");
		msgWrapper.setFrom("fromEmailAddress");
		msgWrapper.setSubject("测试");
		msgWrapper.setText("测试的内容.");
		msgWrapper.setSentDate(new Date());
		mailSender.send(msgWrapper.getMimeMessage());
		System.out.println("发送成功........");
	}
	
	/**
	 * 发送更多内容邮件
	 */
	public void sendMultiMail(){
		mailSender.send(new MimeMessagePreparator() {
			public void prepare(MimeMessage mimeMessage) throws Exception {
				MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true,"UTF-8");
				helper.setTo("toEmailAddress");
				helper.setFrom("fromEmailAddress");
				helper.setSubject("测试");
				StringBuilder sb = new StringBuilder("<html><body>hello..</body></html>");
				helper.setText(sb.toString(),true);
				helper.addInline("inlinePng", new ClassPathResource("/multisource/test.jpg"));
				helper.addAttachment("test.png", new ClassPathResource("/multisource/test.png"));
			}
		});
	}
	
}

 


扩展链接:
1. JavaMail官网地址
2. JavaMail官方说明文档地址
3. Freemarker中文手册下载地址

分享到:
评论

相关推荐

    Spring mvc 发送邮件功能

    基于spring mvc 框架,用freemarker创建邮件模板,包括详细邮件发送功能的spring配置和实现代码

    spring4.1核心包

    UI方面的用来与模板(Templating)引擎如 Velocity、FreeMarker、JasperReports集成的类, 6. spring-core-4.1.1.RELEASE.jar spring核心包 7. spring-expression-4.1.1.RELEASE.jar spring表达语言 SpEL以"#{...}...

    spring in action英文版

     7.4.1 使用JMS模板发送消息  7.4.2 消费消息  7.4.3 转换消息  7.5 小结 第三部分 Spring在Web层的应用  第8章 建立Web层  8.1 开始Spring MVC之旅  8.1.1 请求生命中的一天  8.1.2 配置...

    Spring in Action(第2版)中文版

    14.2使用spring模板 14.2.1绑定表单数据 14.2.2渲染被存储在外部的文本 14.2.3显示错误 14.3使用tile设计页面布局 14.3.1tile视图 14.3.2tile控制器 14.4使用jsp的替代技术 14.4.1使用velocity模板 14.4.2...

    springboot学习

    chapter3-1-3:使用Freemarker模板引擎渲染web视图 chapter3-1-4:使用Velocity模板引擎渲染web视图 chapter3-1-5:使用Swagger2构建RESTful API chapter3-1-6:统一异常处理 chapter3-1-7:使用Java 8中LocalDate等...

    Spring in Action(第二版 中文高清版).part2

    14.2 使用Spring模板 14.2.1 绑定表单数据 14.2.2 渲染被存储在外部的文本 14.2.3 显示错误 14.3 使用Tile设计页面布局 14.3.1 Tile视图 14.3.2 Tile控制器 14.4 使用JSP的替代技术 14.4.1 使用Velocity...

    Spring in Action(第二版 中文高清版).part1

    14.2 使用Spring模板 14.2.1 绑定表单数据 14.2.2 渲染被存储在外部的文本 14.2.3 显示错误 14.3 使用Tile设计页面布局 14.3.1 Tile视图 14.3.2 Tile控制器 14.4 使用JSP的替代技术 14.4.1 使用Velocity...

    Spring-Reference_zh_CN(Spring中文参考手册)

    12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用服务器...

    Spring中文帮助文档

    12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用...

    Spring API

    12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用...

    Spring 2.0 开发参考手册

    12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用...

    spring chm文档

    12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用...

    spring boot demo 是一个用来深度学习并实战 spring boot 的项目

    plus(快速操作Mybatis)、BeetlSQL(强大的ORM框架)、upload(本地文件上传和七牛云文件上传)、redis(缓存)、ehcache(缓存)、email(发送各种类型邮件)、task(基础定时任务)、quartz(动态管理定时任务)、xxl-job(分布式...

    基于springboot+MyBatis实现的某房产平台系统源码+项目说明(毕设).zip

    Spring Mail + Spring Task完成异步发送激活链接,邮件发送,验证 Jquery BootStrap Ajax springBoot Guava Cache(java工具类集的基础库,注册key的绑定) Druid(监控目的的数据库连接池),配置文件里面...

    基于Java Web(springboot)实现房产平台 【100011241】

    Spring Mail + Spring Task完成异步发送激活链接,邮件发送,验证;Druid(监控目的的数据库连接池),配置文件里面加密数据库密码;Freemarker:基于Java的生成html的模板引擎,用来前后端交互等等。 项目功能目标 ...

    spring-boot-demo_xkcoding.tar.gz

    plus(快速操作Mybatis)、BeetlSQL(强大的ORM框架)、upload(本地文件上传和七牛云文件上传)、redis(缓存)、ehcache(缓存)、email(发送各种类型邮件)、task(基础定时任务)、quartz(动态管理定时任务)、xxl-job(分布式...

    spring boot集成demo大全.zip

    该项目已成功集成 actuator(`监控`)、admin(`可视化监控`)、logback(`日志`)、aopLog(`通过AOP记录web请求日志`)、统一异常处理(`json级别和页面级别`)、freemarker(`模板引擎`)、thymeleaf(`模板引擎`)、Beetl(`...

    Demo-Java-RestService

    Demo-Java-RestService 这是我的历史... 基于 FreeMarker 的电子邮件模板支持。 短信发送者(需要第三个服务提供商) 基于 Hibernate 的 OR 映射。 朱尼特登录Maven注意:我更新了一些代码,所以这个项目不能直接运行。

    springboot参考指南

    发送邮件 xi. 32. 使用JTA处理分布式事务 i. 32.1. 使用一个Atomikos事务管理器 ii. 32.2. 使用一个Bitronix事务管理器 iii. 32.3. 使用一个J2EE管理的事务管理器 iv. 32.4. 混合XA和non-XA的JMS连接 v. 32.5. 支持...

    基于SSH框架的BBS论坛JavaEE项目源码

    JEEBBS最新版本采用hibernate3+spring mvc+spring3+freemarker技术架构,重新设计了jeebbs,重新架构后的JEEBBS性能得到了很大的提升,功能相比jeebbs v1.0也丰富了许多。 jeebbsV4.0功能列表 1、论坛APP 2、...

Global site tag (gtag.js) - Google Analytics