前言

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. Entity Framework 6 Recipes 2nd Edition(13-6)译 -> 自动编译的LINQ查询

    问题 你想为多次用到的查询提高性能,而且你不想添加额外的编码或配置. 解决方案 假设你有如Figure 13-8 所示的模型 Figure 13-8. A model with an Associat ...

  2. atitit.软件与sql设计模式原理与本质 大总结attialx总结v6 qc26.docx

    atitit.软件与sql设计模式原理与本质 大总结attialx总结v6 qc26.docx 1.1. 版本历史2 2. 设计模式是什么2 2.1. 模式就是在一种场合下对某个问题的一个解决方案.& ...

  3. Java Map hashCode深究

    [Java心得总结七]Java容器下——Map 在自己总结的这篇文章中有提到hashCode,但是没有细究,今天细究整理一下hashCode相关问题 1.hashCode与equals 首先我们都知道 ...

  4. redis命令1

    SADD numbers 1 3 5 创建一个名为numbers的intset SADD fruites "apple" "peach" 创建一个hashtab ...

  5. VS2015企业版,社区版,专业版详细对比

    VS2015 微软出了3个大版本,其实在前天晚上就放出了三个版本的对比说明.,但是昨天挂掉了..今天特意去看了..截取了自己觉得比较重要的分享一下. 首先我们最常用的 诊断调试工具 其次测试工具(区别 ...

  6. IE6+未知尺寸元素水平垂直居中

    首先讨论在IE8以上(也就是支持伪元素after的基础上)的2种情况 当有一段不知道长度大小的文字在你面前,你需要使它垂直居中的时候,你肯定会想到:1.text-align:center;水平居中没错 ...

  7. 利用fis3自动化处理asp.net项目静态资源时遇到的一个编码问题

    fis3是一款强大的前端自动化构建工具,提供了很多非常实用的功能,具体参考http://fis.baidu.com/,使用该工具需要安装node环境. 最近在部署网站的时候尝试了一下使用该工具对前端资 ...

  8. .NET 同步与异步之封装成Task(五)

    本随笔续接:.NET 实现并行的几种方式(四) 前篇随笔已经介绍了几种可以实现并发的方式,其中异步方法.是最简便的方式.而 异步方式是基于 Task 和 async修饰符和await运算符实现的. 换 ...

  9. 类型“System.Data.Linq.DataContext”在未被引用的程序集中定义。必须添加对程序集“System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”的引用。

    解决方法:添加System.Data.Linq.dll引用 http://www.cnblogs.com/m84641693/archive/2010/07/26/1785100.html http: ...

  10. MahApps.Metro使用

    # MahApps.Metro使用 # ## 下载MahApps.Metro ## PM> Install-Package MahApps.Metro ## MainWindow.xaml中添加 ...