Spring 4 使用Freemarker模板发送邮件&添加附件
前言
Spring对Java的邮件发送提供了很好的支持,提供了超级简单的API,大大简化了Java邮件发送功能的开发。
Spring对Email的支持是基于JavaMail API开发的,所以,我们在使用Spring开发Java邮件发送功能时,需要引入javax.mail-api和其实现类mail包,如下:
<!-- JavaMail -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.5.5</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
另外,如果打算使用freemarker作为邮件主题的模板的话,还需引入freemarker:
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
最后,添加其它依赖spring-context-support、spring-context等;
Bean配置——JavaMailSenderImpl
Spring提供了两个基础接口用于发送邮件:
MailSender:发送简单的邮件信息,提供基本功能,如‘from’, ’to’, ’cc’, ’bcc’, ’subject’ 以及其它邮件属性。
JavaMailSender:对MailSender进行扩展,提供专业的JavaMail特性,如对MIME消息的支持。
JavaMailSenderImpl是JavaMailSender接口的实现,一般我们都会使用它来进行邮件发送,如下是javaMailSender bean的配置:
比较简单,就不细说了,注意下端口的配置,密码是邮件账号的密码,我这里改成了XXXXXX。
<bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="smtp.qq.com"></property>
<property name="port" value="25"></property>
<property name="username" value="928651551@qq.com"></property>
<property name="password" value="XXXXXX"></property>
<property name="defaultEncoding" value="UTF-8"></property>
<property name="javaMailProperties">
<props>
<prop key="mail.transport.protocol">smtp</prop>
<prop key="mail.smtp.auth">true</prop>
<!-- true for Gamil
<prop key="mail.smtp.starttls.enable">false</prop>
<prop key="mail.debug">true</prop>-->
</props>
</property>
</bean>
Bean配置——FreeMarkerConfigurationFactoryBean
因为我们使用了freemarker作为邮件主体的模板,所以这里对freeMarker做了下配置
<bean id="freeMarkerConfiguration" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
<property name="templateLoaderPath" value="classpath:emailtemplates" />
</bean>
另外,我们使用的freeMarker模板如下:
<html>
<body>
<h3>User name: ${user.name} has been deleted.</h3>
<h6>Detail:</h6>
<div>
<p>user id : ${user.id}.</p>
<p>user address : ${user.address}.</p>
</div>
<span>Sent using FreeMarker Template</span>
</body>
</html>
编写邮件发送Service
主要工作落在组装MIME消息,使用Freemarker模板生成邮件主体,另外我们还给邮件添加了一张图片作为附件,
package cn.edu.hdu.webbf.service.mail.impl; import java.util.HashMap;
import java.util.Map; import javax.mail.internet.MimeMessage; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.mail.MailException;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;
import org.springframework.stereotype.Service;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; import cn.edu.hdu.webbf.common.log.Logger;
import cn.edu.hdu.webbf.service.mail.IMailService;
import freemarker.template.Configuration; @Service("mailService")
public class MailServiceImpl implements IMailService
{ protected Logger logger = Logger.getLogger(this.getClass()); @Autowired
JavaMailSender mailSender; @Autowired
Configuration freemarkerConfiguration; @Override
public void sendEmail(Object obj)
{ MimeMessagePreparator preparator = getMessagePreparator(obj); try
{
mailSender.send(preparator);
logger.info("mail send sesuccss.");
}
catch (MailException ex)
{
logger.error(ex.getMessage(), ex);
}
} private MimeMessagePreparator getMessagePreparator(final Object obj)
{ MimeMessagePreparator preparator = new MimeMessagePreparator()
{ @Override
public void prepare(MimeMessage mimeMessage) throws Exception
{
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom("928651551@qq.com");
helper.setTo("928651551@qq.com");
helper.setSubject("mail test.");
Map<String, Object> model = new HashMap<String, Object>();
model.put("user", obj);
String text = geFreeMarkerTemplateContent(model);//Use Freemarker
helper.setText(text, true);
helper.addAttachment("userdel.png", new ClassPathResource("imgs/userdel.png"));
}
};
return preparator;
} public String geFreeMarkerTemplateContent(Map<String, Object> model)
{
StringBuffer content = new StringBuffer();
try
{
content.append(FreeMarkerTemplateUtils.processTemplateIntoString(
freemarkerConfiguration.getTemplate("fm_userDeleted.txt"), model));
return content.toString();
}
catch (Exception e)
{
logger.error("Exception occured while processing fmtemplate:" + e.getMessage(), e);
}
return "";
} }
Controller调用
删除用户的时候,发送一封通知邮件,说明那个用户被删除了。
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE, produces = "application/json; charset=utf-8")
public ResponseEntity<User> deleteUser(@PathVariable Long id)
{
User user = userService.findById(id);
if (user == null)
{
return new ResponseEntity<User>(HttpStatus.NOT_FOUND);
}
userService.deleteUser(id);
mailService.sendEmail(user);
return new ResponseEntity<User>(HttpStatus.NO_CONTENT);
}
结果验证
访问用户管理,并删除一个用户,然后查看邮件,结果如下:

源码参考
https://github.com/peterchenhdu/webbf
参考资料
http://websystique.com/spring/spring-4-email-integration-tutorial/
http://websystique.com/spring/spring-4-email-using-velocity-freemaker-template-library/
Spring 4 使用Freemarker模板发送邮件&添加附件的更多相关文章
- Spring发送基于freemarker模板的邮件
在项目开发过程中,我们经常会遇到需要发送邮件的场景,比如:用户验证邮箱的时候,有活动通知或者提醒通知的时候……有些时候我们可能只需要发送一些简单文本内容即可,但是大多数情况下我们更希望邮件的内容是丰富 ...
- spring mvc 集成freemarker模板
主要使用到的jar 文件:spring mvc +freemarker.jar 第一步:spring mvc 集成 freemarker <!-- 定义跳转的文件的前后缀 ,视图模式配置--&g ...
- Spring Boot☞ 使用freemarker模板引擎渲染web视图
效果图 代码 package com.wls.integrateplugs.hello.controller; /** * Created by wls on 2017/8/24. */ import ...
- idea 使用spring boot 搭建freemarker模板
一丶新建maven spring boot 项目 新建好了开始使用模板 先看一个目录结构 二丶配置pox.xml <?xml version="1.0" encoding ...
- python3 发送邮件添加附件
from email.header import Headerfrom email.mime.application import MIMEApplicationfrom email.mime.mul ...
- Spring框架集成FreeMarker
一.Spring in Action (转自:http://blog.163.com/zhang-_-jie/blog/static/16178437820105821120822/ ) FreeMa ...
- Spring MVC 学习总结(七)——FreeMarker模板引擎与动态页面静态化
模板引擎可以让程序实现界面与数据分离,业务代码与逻辑代码的分离,这就提升了开发效率,良好的设计也使得代码复用变得更加容易.一般的模板引擎都包含一个模板解析器和一套标记语言,好的模板引擎有简洁的语法规则 ...
- Spring Boot 系列(五)web开发-Thymeleaf、FreeMarker模板引擎
前面几篇介绍了返回json数据提供良好的RESTful api,下面我们介绍如何把处理完的数据渲染到页面上. Spring Boot 使用模板引擎 Spring Boot 推荐使用Thymeleaf. ...
- Spring Boot 2.0 整合 FreeMarker 模板引擎
本篇博文将和大家一起使用Spring Boot 2.0 和FreeMarker 模板引擎整合实战. 1. 创建新的项目 2. 填写项目配置信息 3. 勾选web 模块 4. 勾选freemarker模 ...
随机推荐
- 使用Metrics监控应用程序的性能
在编写应用程序的时候,通常会记录日志以便事后分析,在很多情况下是产生了问题之后,再去查看日志,是一种事后的静态分析.在很多时候,我们可能需要了解整个系统在当前,或者某一时刻运行的情况,比如当前系统中对 ...
- C++的性能C#的产能?! - .Net Native 系列四:性能测试方法(PerfView)
之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...
- clearfix的最佳方案----在路上(22)
clearfix的纠结 骨灰级解决办法: .clear{clear:both;height:0;overflow:hidden;} 上诉办法是在需要清除浮动的地方加个div.clear或者br.cle ...
- 使用Red Gate Sql Data Compare 数据库同步工具进行SQL Server的两个数据库的数据比较、同步
Sql Data Compare 是比较两个数据库的数据是否相同.生成同步sql的工具. 这一款工具由Red Gate公司出品,我们熟悉的.NET Reflector就是这个公司推出的,它的SQLTo ...
- 解析大型.NET ERP系统架构设计 Framework+ Application 设计模式
我对大型系统的理解,从数量上面来讲,源代码超过百万行以上,系统有超过300个以上的功能,从质量上来讲系统应该具备良好的可扩展性和可维护性,系统中的功能紧密关联.除去业务上的复杂性,如何设计这样的一个协 ...
- VS 2015相当不错的功能:C#交互窗口
按照惯例,老周是先吹牛后讲正事.今天就给大伙吹吹这个事. 有网友不知道是不是昨晚喝高了,居然研究起老周来了.实话告诉你,老周没什么好研究的,老周又不是编译器,老周只是一个游离于大善大恶之间的平凡人,说 ...
- ASP.NET Core 1.0中实现文件上传的两种方式(提交表单和采用AJAX)
Bipin Joshi (http://www.binaryintellect.net/articles/f1cee257-378a-42c1-9f2f-075a3aed1d98.aspx) Uplo ...
- Android 中关于Fragment嵌套Fragment的问题
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5802146.html 问题描述: 在项目中Activity A中嵌套Fragment B,Fragment ...
- 【分布式】Zookeeper客户端
一.前言 前篇博客分析了Zookeeper的序列化和通信协议,接着继续学习客户端,客户端是开发人员使用Zookeeper最主要的途径,很有必要弄懂客户端是如何与服务端通信的. 二.客户端 2.1 客户 ...
- ASP.NET Core 中文文档 第三章 原理(2)中间件
原文:Middleware 作者:Steve Smith.Rick Anderson 翻译:刘怡(AlexLEWIS) 校对:许登洋(Seay) 章节: 什么是中间件 用 IApplicationBu ...