一、前言

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);
}
}

springboot集成邮件服务的更多相关文章

  1. Springboot】Springboot整合邮件服务(HTML/附件/模板-QQ、网易)

    介绍 邮件服务是常用的服务之一,作用很多,对外可以给用户发送活动.营销广告等:对内可以发送系统监控报告与告警. 本文将介绍Springboot如何整合邮件服务,并给出不同邮件服务商的整合配置. 如图所 ...

  2. SpringBoot集成邮件发送

    一:简述 在日常中的工作中难免会遇到程序集成邮件发送功能.接收功能:此篇文章我将使用SpringBoot集成邮件发送功能和接收功能:若对邮件一些基本协议和发送流程不懂的请务必参考我之前写的博客或者浏览 ...

  3. SpringBoot之邮件服务

    springboot 邮件服务 今天在看网上学习微服务的时候顺遍看到了一些关于springboot的文章,写的springboot拓展功能就顺遍学习了一下,接下来给大家分享一下springboot封装 ...

  4. spring-boot(六) 邮件服务

    学习文章来自:springboot(十):邮件服务 简单使用 1.pom包配置 pom包里面添加spring-boot-starter-mail包引用 <dependencies> < ...

  5. springboot系列九,springboot整合邮件服务、整合定时任务调度

    一.整合邮件服务 如果要进行邮件的整合处理,那么你一定需要有一个邮件服务器,实际上 java 本身提供有一套 JavaMail 组件以实现邮件服务器的搭建,但是这个搭建的服务器意义不大,因为你现在搭建 ...

  6. SpringBoot 之集成邮件服务.

    一.前言 Spring Email 抽象的核心是 MailSender 接口,MailSender 的实现能够把 Email 发送给邮件服务器,由邮件服务器实现邮件发送的功能. Spring 自带了一 ...

  7. springboot(七)邮件服务

    简单使用 发送邮件应该是网站的必备功能之一,什么注册验证,忘记密码或者是给用户发送营销信息.最早期的时候我们会使用JavaMail相关api来写发送邮件的相关代码,后来spring退出了JavaMai ...

  8. springboot的邮件服务

    作者:纯洁的微笑出处:http://www.ityouknow.com/ 版权归作者所有,转载请注明出处 springboot仍然在狂速发展,才五个多月没有关注,现在看官网已经到1.5.3.RELEA ...

  9. SpringBoot集成Socket服务后打包(war包)启动时如何启动Socket服务(web应用外部tomcat启动)

      1.首先知道SpringBoot打包为jar和war包是不一样的(只讨论SpringBoot环境下web应用打包)     1.1.jar和war包的打开方式不一样,虽然都依赖java环境,但是j ...

随机推荐

  1. 为什么要使用rem

    为什么要使用rem 今天2019年4月16号更新,模仿网易移动端的的写法: html { font-size: 13.33333vw } @media screen and (max-width:32 ...

  2. [AIR] 利用File获取应用程序根目录

    import flash.filesystem.File; var file1:File = new File(File.applicationDirectory.resolvePath(" ...

  3. React Native 一些事

    ReactJS 是否准备好 有时候我们常常需要监听 ReactJS 的的加载情况. 比如说,当获取一条推送,应用还没有起来,通过点击推送启动应用后,而推送中包含一些我们感兴趣的字段需要处理,我们如果直 ...

  4. maven中archetype(原型)的使用

    原文链接:https://www.cnblogs.com/snowstar123/p/3449349.html 最近项目组做好一套框架,为了推广需要创建一些空白项目给项目组使用,因为所有的空白项目里面 ...

  5. centos yum安装php5.6.19 remi源按照

    yum安装php5.6 多版本php共存 remi安装方法 http://www.servermom.org/how-to-enable-remi-repo-on-centos-7-6-and-5/2 ...

  6. SpringBoot入门(IDEA篇)(三)

    一.什么是JPA JPA(Java Persistence API)定义了一系列对象持久化的标准,目前实现这一规范的产品有Hibernate.TopLink等. 二.Mysql数据库示例 1.在app ...

  7. git的使用(入门)

    针对linux系统,全部采用shell命令的方式实现 一.查看相关信息 which -a git 查看git的安装位置git version 查看git的版本git help 学习相关的命令 二.gi ...

  8. C# Directory和DirectoryInfo类(文件目录操作)

    对目录操作例子: using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

  9. python学习,day3:文件的修改

    对文件进行修改,对不起,在原文修改比较难,只能采用循环覆盖的方法 # coding=utf-8 # Author: RyAn Bi f = open('yesterday2','r',encoding ...

  10. [转] kerberos安装配置与使用

    [From] https://blog.csdn.net/lovebomei/article/details/79807484 1.Kerberos协议: Kerberos协议主要用于计算机网络的身份 ...