前言

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. Spark笔记:复杂RDD的API的理解(下)

    本篇接着谈谈那些稍微复杂的API. 1)   flatMapValues:针对Pair RDD中的每个值应用一个返回迭代器的函数,然后对返回的每个元素都生成一个对应原键的键值对记录 这个方法我最开始接 ...

  2. Windows 2008 R2 安装sp1时未知错误的解决办法

    最近在为Windows Server 2008 R2 打sp1补丁时出现“发生未知错误”,详细信息错误:0x800f0818: google后找到解决问题步骤,参照:http://www.wikiho ...

  3. canvas第一天

    第一次接触canvas,<canvas></canvas>是html5出现的新标签,IE9开始支持,像所有的dom对象一样它有自己本身的属性.方法和事件,其中就有绘图的方法,j ...

  4. My First Android Application Project 第一个安卓应用

    一.前言: 安卓(Android):是一种基于Linux的自由及开放源代码的操作系统,主要用在移动设备上,如手机.平板电脑.其他的设备也有使用安卓操作系统,比如:电视机,游戏机.数码相机等等. 二.具 ...

  5. 【Win 10 应用开发】多媒体转码

    上次本来说好,今天咱们来讨论 socket 相关的话题,但,对于 socket ,老周还有一些问题没弄清楚,等弄清楚了,再和大伙伴们一起探讨.故,今天咱们扯一扯多媒体转码的事. 听起来挺复杂的,不过, ...

  6. 别语言之争了,最牛逼的语言不是.NET,也不是JAVA!

    谁都不用说,博客园明显的偏.NET,C#的讨论一出现,推荐讨论热火朝天,而发点JAVA的东西,应者寥寥.一旦有出现两大派系的竞争,那绝对是头条.每天都看,早就麻木了. 研二的我浸淫.NET已经三四年, ...

  7. 如何在删除ibdata1和ib_logfile的情况下恢复MySQL数据库

    昨天,有个朋友对公司内部使用的一个MySQL实例开启binlog,但是在启动的过程中失败了(他也没提,为何会失败),在启动失败后,他删除了ibdata1和ib_logfile,后来,能正常启动了,但所 ...

  8. 【基于WinForm+Access局域网共享数据库的项目总结】之篇三:Access远程连接数据库和窗体打包部署

    篇一:WinForm开发总体概述与技术实现 篇二:WinForm开发扇形图统计和Excel数据导出 篇三:Access远程连接数据库和窗体打包部署 [小记]:最近基于WinForm+Access数据库 ...

  9. Oracle数据库文件路径变更

    环境:RHEL 6.4 + Oracle 11.2.0.3 情景一:只是部分普通数据文件迁移,可以在线操作. 1.将对应表空间offline,移动数据文件到新路径 2.数据文件alter databa ...

  10. C# 文件下载 : WinINet

    在 C# 中,除了 WebClient 我们还可以使用一组 WindowsAPI 来完成下载任务.这就是 Windows Internet,简称 WinINet.本文通过一个 demo 来介绍 Win ...