Spring Boot学习笔记:JavaMailSender发送邮件
项目中经常会有这样的需求,用户注册成功,需要给用户发送一封邮件。邮件需要有一定格式和样式。本次例子中用freemarker做样式,其他的模版引擎类似。
首先Spring Boot项目,项目结构如下

在pom.xml文件中添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
配置发件人信息,发件人邮箱需要开通POP3/SMTP服务,如下图(我是采用126邮箱):

然后在application.properties中添加配置文件:

然后在service层中添加MailService类,代码如下
import freemarker.core.ParseException;
import freemarker.template.MalformedTemplateNameException;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateNotFoundException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.springframework.util.ResourceUtils;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfig; import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map; @Service
public class MailService { private final static Logger logger = LoggerFactory.getLogger(MailService.class); @Value("${spring.mail.username}")
private String from; @Autowired
private JavaMailSender mailSender; @Autowired
private FreeMarkerConfig freeMarkerConfig; // send simple email
public String sendSimple(String to, String title, String content) {
SimpleMailMessage message = new SimpleMailMessage(); message.setFrom(from);
message.setTo(to);
message.setSubject(title);
message.setText(content); mailSender.send(message); logger.info("{} send email to {}", from, to);
return "SUCESS";
} // send template mail
public String sendTemplateMail(String to, String title) {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper;
try {
helper = new MimeMessageHelper(mimeMessage, true); helper.setFrom(from);
helper.setTo(to);
helper.setSubject(title); Map<String, Object> model = new HashMap<>();
model.put("params", from);
Template template = freeMarkerConfig.getConfiguration().getTemplate("message.ftl");
String text = FreeMarkerTemplateUtils.processTemplateIntoString(template, model); helper.setText(text, true); mailSender.send(mimeMessage); } catch (MessagingException e) {
e.printStackTrace();
} catch (MalformedTemplateNameException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (TemplateNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
} return "SUCEESS";
} // send template mail with attachment
public String sendAttactmentMail(String to, String title){
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper;
try {
helper = new MimeMessageHelper(mimeMessage, true); helper.setFrom(from);
helper.setTo(to);
helper.setSubject(title); // add template
Map<String, Object> model = new HashMap<>();
model.put("params", from);
Template template = freeMarkerConfig.getConfiguration().getTemplate("message.ftl");
String text = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
helper.setText(text, true); // add attachment
File file = ResourceUtils.getFile("classpath:static/flcl.jpg");
helper.addAttachment(file.getName(), file); mailSender.send(mimeMessage); } catch (MessagingException e) {
e.printStackTrace();
} catch (MalformedTemplateNameException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (TemplateNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
return "SUCCESS";
}
}
这个service中写了三个方法,三个方法的作用分别对应于:发送简单邮件、发送模版邮件、发送带附件的模版邮件
核心方法是 mailSender.send(message) ,message对象根据发送的邮件类型不同而不同,主要有MimeMessage MimeMessageHelper
发送带附件的模板邮件方式是三者中最复杂,首先创建邮件对象MimeMessage ,然后通过MimeMessage对象创建MimeMessageHelper(此对象的作用:向MimeMessage对象中填充数据的助手),通过向MimeMessageHelper对象中添加一些属性,例如发件人、收件人、邮件主题、模版、附件。其中freemarker模板文件xxx.ftl放在resources文件夹下中template(通过FreemakrerConfig获取xxx.ftl的Template对象,然后转换为String),其中附件flcl.jpg放在resources文件夹中的static中(通过ResourceUtils获取文件对象File)。属性添加完成后,就可以发送了。
然后在controller或者其他service层中调用该方法就可以了。
补充:
message.ftl文件内容如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<h1>Send email</h1>
<div>this email come from ${params}</div>
</body>
</html>
发送成功后,可在收件箱中收到邮件

Spring Boot学习笔记:JavaMailSender发送邮件的更多相关文章
- Spring Boot学习笔记2——基本使用之最佳实践[z]
前言 在上一篇文章Spring Boot 学习笔记1——初体验之3分钟启动你的Web应用已经对Spring Boot的基本体系与基本使用进行了学习,本文主要目的是更加进一步的来说明对于Spring B ...
- Spring Boot中使用JavaMailSender发送邮件
相信使用过Spring的众多开发者都知道Spring提供了非常好用的JavaMailSender接口实现邮件发送.在Spring Boot的Starter模块中也为此提供了自动化配置.下面通过实例看看 ...
- Spring Boot 学习笔记(六) 整合 RESTful 参数传递
Spring Boot 学习笔记 源码地址 Spring Boot 学习笔记(一) hello world Spring Boot 学习笔记(二) 整合 log4j2 Spring Boot 学习笔记 ...
- Spring Boot 学习笔记1——初体验之3分钟启动你的Web应用[z]
前言 早在去年就简单的使用了一下Spring Boot,当时就被其便捷的功能所震惊.但是那是也没有深入的研究,随着其在业界被应用的越来越广泛,因此决定好好地深入学习一下,将自己的学习心得在此记录,本文 ...
- Spring Boot 学习笔记1---初体验之3分钟启动你的Web应用
前言 早在去年就简单的使用了一下Spring Boot,当时就被其便捷的功能所震惊.但是那是也没有深入的研究,随着其在业界被应用的越来越广泛,因此决定好好地深入学习一下,将自己的学习心得在此记录,本文 ...
- Spring Boot 学习笔记--整合Thymeleaf
1.新建Spring Boot项目 添加spring-boot-starter-thymeleaf依赖 <dependency> <groupId>org.springfram ...
- 我的第一个spring boot程序(spring boot 学习笔记之二)
第一个spring boot程序 写在前面:鉴于spring注解以及springMVC的配置有大量细节和知识点,在学习理解之后,我们将直接进入spring boot的学习,在后续学习中用到注解及其他相 ...
- Java框架spring Boot学习笔记(六):Spring Boot事务管理
SpringBoot和Java框架spring 学习笔记(十九):事务管理(注解管理)所讲的类似,使用@Transactional注解便可以轻松实现事务管理.
- Spring Boot学习笔记---Spring Boot 基础及使用idea搭建项目
最近一段时间一直在学习Spring Boot,刚进的一家公司也正好有用到这个技术.虽然一直在学习,但是还没有好好的总结,今天周末先简单总结一下基础知识,等有时间再慢慢学习总结吧. Spring Boo ...
随机推荐
- break
public class b { public static void main(String[] args) { int i=0; for(;i<=10;i++){ if (i&g ...
- 前端、数据库、Django简单的练习
一.前端 1.前端页面由哪几层构成,分别是什么,作用是什么? 分为:结构层(html),表示层(css),行为层(js). 结构层 超文本标记语言.由HTML或XHTML之类的标记语言负责创建.标签, ...
- shell中参数的传递
1.命令行参数 向shell脚本传递数据的最基本方式是使用命令行参数. (1) 读取参数 读取输入的参数的变量为位置参数,位置参数通过标准数字表示, 其中$0为程序名称,$1为第一个参数,$2为第二个 ...
- 设置获取cookie,setCookie,getCookie
设置cookie: function setCookie(name,value) { var Days = 30; var exp = new Date(); exp.setTime(exp.getT ...
- mysql 5.6 datetime 保存精确到秒
mysql中的CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP 设置默认值 now(3) datetime 长度 3 保存精确到秒
- composer ip2city配置
//根据ip获取地址信息composer require "mylukin/ip2city: dev-master" // vendor/mylukin/ip2city/src/I ...
- Bootstrap(6)辅组类和响应式工具
一.辅助类 Bootstrap 在布局方面提供了一些细小的辅组样式,用于文字颜色以及背景色的设置.显示关闭图标等等. 1.情景文本颜色 各种色调的字体 <p class="text-m ...
- jsplumb流程器使用3--connector
jsPlumb.getInstance内可以放一个对象 对象内可选地提供默认值: connector: 连接器(直线--a straight line, 贝塞尔曲线--a Bezier curv ...
- mysql decimal(10,2)对应java类型
下面我给出MYSQL类型与JAVA类型对应表,希望能够帮到您: 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) VARCHAR L+N VARCHAR java.lang.S ...
- rosrun和roslaunch
rosrun allows you to run an executable(可执行) in an arbitrary(任意) package without having to cd (or ros ...