前言

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模板发送邮件&添加附件的更多相关文章

  1. Spring发送基于freemarker模板的邮件

    在项目开发过程中,我们经常会遇到需要发送邮件的场景,比如:用户验证邮箱的时候,有活动通知或者提醒通知的时候……有些时候我们可能只需要发送一些简单文本内容即可,但是大多数情况下我们更希望邮件的内容是丰富 ...

  2. spring mvc 集成freemarker模板

    主要使用到的jar 文件:spring mvc +freemarker.jar 第一步:spring mvc 集成 freemarker <!-- 定义跳转的文件的前后缀 ,视图模式配置--&g ...

  3. Spring Boot☞ 使用freemarker模板引擎渲染web视图

    效果图 代码 package com.wls.integrateplugs.hello.controller; /** * Created by wls on 2017/8/24. */ import ...

  4. idea 使用spring boot 搭建freemarker模板

      一丶新建maven spring boot 项目 新建好了开始使用模板 先看一个目录结构 二丶配置pox.xml <?xml version="1.0" encoding ...

  5. python3 发送邮件添加附件

    from email.header import Headerfrom email.mime.application import MIMEApplicationfrom email.mime.mul ...

  6. Spring框架集成FreeMarker

    一.Spring in Action (转自:http://blog.163.com/zhang-_-jie/blog/static/16178437820105821120822/ ) FreeMa ...

  7. Spring MVC 学习总结(七)——FreeMarker模板引擎与动态页面静态化

    模板引擎可以让程序实现界面与数据分离,业务代码与逻辑代码的分离,这就提升了开发效率,良好的设计也使得代码复用变得更加容易.一般的模板引擎都包含一个模板解析器和一套标记语言,好的模板引擎有简洁的语法规则 ...

  8. Spring Boot 系列(五)web开发-Thymeleaf、FreeMarker模板引擎

    前面几篇介绍了返回json数据提供良好的RESTful api,下面我们介绍如何把处理完的数据渲染到页面上. Spring Boot 使用模板引擎 Spring Boot 推荐使用Thymeleaf. ...

  9. Spring Boot 2.0 整合 FreeMarker 模板引擎

    本篇博文将和大家一起使用Spring Boot 2.0 和FreeMarker 模板引擎整合实战. 1. 创建新的项目 2. 填写项目配置信息 3. 勾选web 模块 4. 勾选freemarker模 ...

随机推荐

  1. JavaScript动画知多少?

    今天,小学生以自己浅薄的见地,在前辈大能的基础上写这篇文章,希望给大家打开一扇窥探JavaScript(以下简称JS)动画的窗户. JS如何制造出动画效果? 结合浏览器提供的 setInterval ...

  2. 每日设置Bing首页图片为壁纸

    闲来无事,手痒痒要做一个什么小工具. 于是乎便有了本文. 当有一个想法的时候,首先免不了网上搜索一番以便看一下有木有网友有过类似的想法. 很显然--有! 因此本文大代码是从几个地方搜索,然后组合的. ...

  3. Android开发学习之路-3DTouch效果模仿

    3D Touch是什么效果的大家应该都知道了.什么?不知道,那也没办法呀,我也没有iPhone 6s演示给你看的. 本篇博客要做的效果图: 来个低质量动图: 这个动图效果不是很好,实际上模糊效果应该是 ...

  4. 00.Web大前端时代之:HTML5+CSS3入门系列~Bug反馈文章

    感谢广大网友的热心提醒,现已发现如下错误: 感谢 “ ”对画布笔记系列的反馈(QQ:350223285) 这个是失误,strokeStyle和stroke对应 待续.... 欢迎提出更多问题,感谢大家 ...

  5. Parallel并行之乱用

    关于Parallel我也不细说了,一则微软封装的很好用,二来介绍这个的遍地都是. 我要说的是,要想成为一个优秀的标题党,一定要把重点放到别的地方,为了节省大家阅读时间,我先把结论说了,然后再慢慢从头说 ...

  6. 禁止页面后退JS(兼容各浏览器)

    <script src="${ctxPath}/media/lib/jquery.history.js"></script> <script> ...

  7. php后台增删改跳转

    php登录页面: <h1>登录界面</h1> <form action="dengluchuli.php" method="post&quo ...

  8. ASP.NET Core 中文文档 第四章 MVC(3.3)布局视图

    原文:Layout 作者:Steve Smith 翻译:娄宇(Lyrics) 校对:孟帅洋(书缘) 视图(View)经常共享视觉元素和编程元素.在本篇文章中,你将学习如何在你的 ASP.NET 应用程 ...

  9. 结合ABP源码实现邮件发送功能

    1. 前言 2. 实现过程 1. 代码图(重) 2.具体实现 2.1 定义AppSettingNames及AppSettingProvider 2.2 EmailSenderConfiguration ...

  10. scikit-learn一般实例之八:多标签分类

    本例模拟一个多标签文档分类问题.数据集基于下面的处理随机生成: 选取标签的数目:泊松(n~Poisson,n_labels) n次,选取类别C:多项式(c~Multinomial,theta) 选取文 ...