SpringBoot 之集成邮件服务.
一、前言
Spring Email 抽象的核心是 MailSender 接口,MailSender 的实现能够把 Email 发送给邮件服务器,由邮件服务器实现邮件发送的功能。

Spring 自带了一个 MailSender 的实现 JavaMailSenderImpl,它会使用 JavaMail API 来发送 Email。Spring 或 SpringBoot 应用在发送 Email 之前,我们必须要 JavaMailSenderImpl 装配为 Spring应用上下文的一个 bean。
二、配置
1、pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2、application.yml
spring:
mail:
host: smtp.163.com
port: 25
username: 159****2662@163.com
password: ***********
host 属性默认是 JavaMail 会话的主机;port 端口默认监听标准的 SMTP 端口25;如果邮件服务器需要认证的,还需要设置 userrname 和 password。
这里我用的是 163 的邮件服务器,需要在 163 邮箱中开启客户端授权密码,否则会报 550 认证错误。

3、EmailConfig.java
在这里,我们把 JavaMailSenderImpl 装配为 Spring 应用上下文的一个 Bean。同时需要注意的是,这里使用了@ConfigurationProperties 注解,该注解需要属性有 setter 方法并在启动类中使用 @EnableConfigurationProperties 注解使之生效。
@Configuration
@ConfigurationProperties(prefix = "spring.mail")
public class EmailConfig { private String host;
private Integer port;
private String username;
private String password; @Bean
public MailSender javaMailSender() {
JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
javaMailSender.setHost(host);
javaMailSender.setPort(port);
javaMailSender.setUsername(username);
javaMailSender.setPassword(password);
return javaMailSender;
} public void setHost(String host) {
this.host = host;
}
public void setPort(Integer port) {
this.port = port;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
}
三、发送
有了 javaMailSender,那么邮件发送就是一件再简单不过的事情了。我们只需要将 javaMailSender 的 Bean 注入到我们自己的实现类中,然后使用 JavaMail API 来发送 Email。
1、文本邮件发送
public void sendSimpleEmail() {
// 构造Email消息
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom("159****2662@163.com");
message.setTo("****@qianxx.com");
message.setSubject("邮件主题");
message.setText("邮件内容");
javaMailSender.send(message);
}
纯文本的 Email 在于构造 SimpleMailMessage 实例,这个对象可以很便捷地发送Email消息。
2、附件邮件发送
Spring 的 Email 功能并不局限于纯文本的 Email。我们还可以添加附件。如果要发送带有附件的 Email,关键技巧是创建 multipart 类型的消息 ———— Email由多个部分组成,其中一部分是 Email 体,其他部分是附件。为了发送 multipart 类型的 Email,你需要创建一个MIME(Multipurpose Internet Mail Extensions)的消息。
public void mimeEmail() throws MessagingException {
// MimeMessage 本身的 API 有些笨重,我们可以使用 MimeMessageHelper
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
// 第二个参数是 true ,表明这个消息是 multipart类型的/
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
mimeMessageHelper.setFrom("159****2662@163.com");
mimeMessageHelper.setTo("****@qianxx.com");
mimeMessageHelper.setSubject("附件邮件主题");
mimeMessageHelper.setText("附件邮件内容");
//添加附件,第一个参数表示添加到 Email 中附件的名称,第二个参数是图片资源
mimeMessageHelper.addAttachment("boot.png", new ClassPathResource("public/images/boot.png"));
javaMailSender.send(mimeMessage);
}
3、富文本邮件发送
Spring 的 Email 功能除了可以添加附件外,甚至可以使用 HTML 来美化消息体的内容。发送富文本的 Email 与发送简单文本的 Email 并没有太大区别,关键是将setText() 方法的消息文本设置为 HTML,并将第二个参数设置为 true,表示这是 HTML 的富文本。
public void htmlEmail() throws MessagingException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
mimeMessageHelper.setFrom("159****2662@163.com");
mimeMessageHelper.setTo("****@qianxx.com");
mimeMessageHelper.setSubject("富文本邮件主题");
String html = "<html><body><h4>Hello,SpringBoot</h4><img src='cid:boot' /></body></html>";
mimeMessageHelper.setText(html, true);
// 设置内嵌元素 cid,第一个参数表示内联图片的标识符,第二个参数标识资源引用
mimeMessageHelper.addInline("boot", new ClassPathResource("public/images/boot.png"));
javaMailSender.send(mimeMessage);
}
四、使用 Thymeleaf 模板
HTML 标签的字符串拼接是一件很棘手的事。因为在你的大脑中解析HTML标签并想象它在渲染时会是什么样子是挺困难的。而将HTML混合在Java代码中又会使得这个问题更加复杂。
因此 Spring 给出的解决方案是:使用模板生成 HTML 文本,有多种模板方案可供选择,包括Apache Velocity和Thymeleaf。这里仅介绍 Thymeleaf 模板的用法(假设读者已经熟悉了 Thymeleaf 模板并知道如何在 SpringBoot 中使用它们)。
1、Thymeleaf 模板 — email.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Email</title>
</head>
<body>
<img src='cid:boot'>
<h4><span th:text="${title}">Craig Walls</span> says... </h4>
<i><span th:text="${content}">Hello Boot!</span></i>
</body>
</html>
2、邮件发送
@RunWith(SpringRunner.class)
@SpringBootTest
public class ThymeleafApplicationTests { @Autowired
private JavaMailSender javaMailSender;
@Autowired
private SpringTemplateEngine templateEngine; @Test
public void contextLoads() throws MessagingException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
mimeMessageHelper.setFrom("159****2662@163.com");
mimeMessageHelper.setTo("****@qianxx.com");
mimeMessageHelper.setSubject("ThymeLeaf 模板邮件");
// 利用 Thymeleaf 模板构建 html 文本
Context ctx = new Context();
ctx.setVariable("title", "Craig Walls");
ctx.setVariable("content", "Hello Boot!");
String emailText = templateEngine.process("email/email", ctx);
mimeMessageHelper.setText(emailText, true);
// 设置内嵌元素 cid,第一个参数表示内联图片的标识符,第二个参数标识资源引用
mimeMessageHelper.addInline("boot", new ClassPathResource("/static/img/boot.png"));
javaMailSender.send(mimeMessage);
}
}
演示源代码:https://github.com/JMCuixy/Boot
SpringBoot 之集成邮件服务.的更多相关文章
- springboot集成邮件服务
一.前言 Spring Email 抽象的核心是 MailSender 接口,MailSender 的实现能够把 Email 发送给邮件服务器,由邮件服务器实现邮件发送的功能. Spring 自带了一 ...
- springboot(十):邮件服务
springboot仍然在狂速发展,才五个多月没有关注,现在看官网已经到1.5.3.RELEASE版本了.准备慢慢在写写springboot相关的文章,本篇文章使用springboot最新版本1.5. ...
- 五、springboot 简单优雅是实现邮件服务
前言 spring boot 的项目放下小半个月没有更新了,终于闲下来可以开心的接着写啦. 之前我们配置好mybatis 多数据源的,接下来我们需要做一个邮件服务.比如你注册的时候,需要输入验证码来校 ...
- Springboot】Springboot整合邮件服务(HTML/附件/模板-QQ、网易)
介绍 邮件服务是常用的服务之一,作用很多,对外可以给用户发送活动.营销广告等:对内可以发送系统监控报告与告警. 本文将介绍Springboot如何整合邮件服务,并给出不同邮件服务商的整合配置. 如图所 ...
- spring-boot(六) 邮件服务
学习文章来自:springboot(十):邮件服务 简单使用 1.pom包配置 pom包里面添加spring-boot-starter-mail包引用 <dependencies> < ...
- SpirngBoot之整合邮件服务
一.集成邮件服务 1.1 获取客户端授权码 1.2 引入依赖 <dependencies> ...... <dependency> <groupId>org.spr ...
- springboot集成mail实现邮件服务
1,新建mailconfig类,对邮件服务固定配置进行实体封装: import java.util.Properties; import org.springframework.beans.facto ...
- SpringBoot系列(十四)集成邮件发送服务及邮件发送的几种方式
往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件详解 SpringBoot系列(四)web静 ...
- SpringBoot之邮件服务
springboot 邮件服务 今天在看网上学习微服务的时候顺遍看到了一些关于springboot的文章,写的springboot拓展功能就顺遍学习了一下,接下来给大家分享一下springboot封装 ...
随机推荐
- 05 详解C# 迭代器
迭代器模式是设计模式中行为模式(behavioral pattern)的一个例子,他是一种简化对象间通讯的模式,也是一种非常容易理解和使用的模式. 简单来说,迭代器模式使得你能够获取到序列中的所有元素 ...
- 【高速接口-RapidIO】4、Xilinx RapidIO核详解
一.RapidIO核概述 RapidIO核的设计标准来源于RapidIO Interconnect Specification rev2.2,它支持1x,2x和4x三种模式,每通道的速度支持1.25G ...
- BCrypt加密算法
用户表的密码通常使用MD5等不可逆算法加密后存储,为防止彩虹表破解更会先使用一个特定的字符串(如域名)加密,然后再使用一个随机的salt(盐值)加密. 特定字符串是程序代码中固定的,salt是每个密码 ...
- 【渗透攻防】深入了解Windows
前言 本篇是基础教程,带大家了解Windows常用用户及用户组,本地提取用户密码,远程利用Hash登录到本地破解Hash.初步掌握Windows基础安全知识. 目录 第一节 初识Windows 第二节 ...
- IDEA远程Debug
进行远程debug是我们排查线上bug的一个最常用的工具,本篇博文就简单介绍一下如何使用IDEA来进行远程debug 1. 修改Tomcat配置文件 修改bin目录下的catalina.sh文件,在文 ...
- 第84节:Java中的网络编程(中)
第84节:Java中的网络编程(中) 实现客户端和服务端的通信: 客户端需要的操作,创建socket,明确地址和端口,进行键盘录入,获取需要的数据,然后将录入的数据发送给服务端,为socket输出流, ...
- oracle select in超过1000条报错解决方法
本博客介绍oracle select in超过1000条数据的解决方法,java框架是采用mybatis的,这可以说是一种比较常见的错误:select * from A where id in(... ...
- C#--对象转Json序列化
前言 最近在研究Android项目,其中涉及到Android中解析Json数据的问题,需要模拟网络中传递Json数据的模式,因为以前是.net的工程师,所以想着从.net的平台开发服务,传递Json格 ...
- Singly linked list algorithm implemented by Java
Jeff Lee blog: http://www.cnblogs.com/Alandre/ (泥沙砖瓦浆木匠),retain the url when reproduced ! Thanks ...
- struts2--使用<s:token></s:token>标签防止重复提交
取个小例子:这是网页: <body> <s:actionerror/> <s:form action="LoginAction" method=&qu ...