一、前言

在今天,发送邮件几乎已成为每个网站必不可少的功能之一,如忘记密码,服务器异常警告通知,微服务中服务下线通知等等。接下来,笔者将会给同学们介绍使用spring boot1分钟内如何快速集成邮件服务。

Spring Mail抽象的核心是MailSender接口,MailSender的实现可以把Email发送给邮件服务器,由邮件服务器实现邮件发送的功能。

springboot qq邮箱25端口 springboot接收邮件_Java

二、获取邮箱授权码

· QQ邮箱获取授权码步骤

1、登录qq邮箱,进入主页点击设置

springboot qq邮箱25端口 springboot接收邮件_Email_02


2、点击账号

springboot qq邮箱25端口 springboot接收邮件_Spring Boot_03


3、开通相应的邮件协议,获取授权码

springboot qq邮箱25端口 springboot接收邮件_springboot qq邮箱25端口_04

· 163邮箱获取授权码步骤

1、同理,在163邮箱的设置中开通相应的邮件协议,获取授权码

springboot qq邮箱25端口 springboot接收邮件_springboot qq邮箱25端口_05

三、搭建步骤及简单使用

笔者将以qq邮箱为例,实现邮件发送功能。

· 增加pom依赖
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
· 增加application.yml的配置
spring:
  application:
    name: mail-sender
  mail:
    host: smtp.qq.com #发送邮件服务器
    username: xxxxxxx@qq.com    #ali邮箱
    password: xxxxxxxxxx #客户端授权码
    protocol: smtp #发送邮件协议
    properties.mail.smtp.auth: true
    properties.mail.smtp.port: 465 #端口号465或587
    properties.mail.smtp.starttls.enable: true
    properties.mail.smtp.starttls.required: true
    properties.mail.smtp.ssl.enable: true
    default-encoding: utf-8

server:
  port: 8081
· 邮件发送

话不多,下面直接上代码

1、文本邮件发送

@SpringBootTest
@RunWith(SpringRunner.class)
public class MailSenderApplicationTests {

    @Autowired
    private MailSender mailSender;

    @Test
    public void contextLoads() {
        sendTextEmail();
    }

    public void sendTextEmail() {
        SimpleMailMessage mimeMessage =new SimpleMailMessage();
        mimeMessage.setFrom("xxxxx@qq.com");
        mimeMessage.setTo("xxxxxx@163.com");
        mimeMessage.setSubject("邮件测试");
        mimeMessage.setText("Hello World");
        mailSender.send(mimeMessage);
    }
}

如下图所示,则说明邮件发送成功

springboot qq邮箱25端口 springboot接收邮件_springboot qq邮箱25端口_06


2、附件邮件发送

这里需要注意与文本邮件不同的是,附件邮件发送需要使用JavaMailSender接口

@SpringBootTest
@RunWith(SpringRunner.class)
public class MailSenderApplicationTests {

    @Autowired
    private JavaMailSender javaMailSender;

    @Test
    public void contextLoads() throws MessagingException {
        sendMiMultipartEmail();
    }

    public void sendMiMultipartEmail() throws MessagingException {
        MimeMessage mimeMailMessage = javaMailSender.createMimeMessage();

        MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true);
        mimeMessageHelper.setFrom("964549507@qq.com");
        mimeMessageHelper.setTo("15389078260@163.com");
        mimeMessageHelper.setSubject("附件邮件测试");
        mimeMessageHelper.setText("附件邮件测试");
        mimeMessageHelper.addAttachment("test.png", new ClassPathResource("static/test.png"));

        javaMailSender.send(mimeMailMessage);
    }

}

如下图所示,则说明邮件发送成功

springboot qq邮箱25端口 springboot接收邮件_springboot qq邮箱25端口_07


3、富文本邮件发送

上面两种发送邮件的方式,邮件内容没有任何的样式,大多时候并不能满足我们的需求。下来,笔者将介绍如何将邮件文本设置为HTML发送。

@SpringBootTest
@RunWith(SpringRunner.class)
public class MailSenderApplicationTests {

    @Autowired
    private JavaMailSender javaMailSender;

    @Test
    public void contextLoads() throws MessagingException {
        sendHtmlEmail();
    }

    public void sendHtmlEmail() throws MessagingException {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);

        mimeMessageHelper.setFrom("964549507@qq.com");
        mimeMessageHelper.setTo("15389078260@163.com");
        mimeMessageHelper.setSubject("富文本邮件测试");
        String html = "<html><body><h2>富文本邮件测试</h2><img width=100 height=100 src='cid:test' /></body></html>";
        mimeMessageHelper.setText(html, true);
        // 设置内嵌元素 cid,第一个参数表示内联图片的标识符,第二个参数标识资源引用
        mimeMessageHelper.addInline("test", new ClassPathResource("static/test.jpg"));
        javaMailSender.send(mimeMessage);
    }
}

如下图所示,则说明邮件发送成功

springboot qq邮箱25端口 springboot接收邮件_Email_08


4、使用Thymeleaf模板发送邮件

虽然使用富文本发送邮件也可以渲染邮件内容的样式,但是在代码中拼接HTML字符串是一件非常痛苦的事情,而且也非常容易出错。

因此,Spring Boot给出的解决方案是使用模板生产HTML, 笔者在下文将介绍使用Thymeleaf模板发送邮件(假设同学们已了解并掌握Thymeleaf)。

·引入Thymeleaf pom依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

·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:test'>
    <h4><span th:text="${title}">Craig Walls</span> says... </h4>
    <i><span th:text="${content}">Hello Boot!</span></i>
</body>
</html>

·发送Thymeleaf模板的邮件

@SpringBootTest
@RunWith(SpringRunner.class)
public class MailSenderApplicationTests {

    @Autowired
    private JavaMailSender javaMailSender;

    @Autowired
    private SpringTemplateEngine templateEngine;

    @Test
    public void contextLoads() throws MessagingException {
        sendThymeleafEmail();
    }

    public void sendThymeleafEmail() throws MessagingException {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
        mimeMessageHelper.setFrom("964549507@qq.com");
        mimeMessageHelper.setTo("15389078260@163.com");
        mimeMessageHelper.setSubject("ThymeLeaf模板邮件测试");

        // 利用 Thymeleaf 模板构建 html 文本
        Context ctx = new Context();
        ctx.setVariable("title", "ThymeLeaf模板邮件测试");
        ctx.setVariable("content", "Hello World!");
        String emailText = templateEngine.process("email", ctx);

        mimeMessageHelper.setText(emailText, true);
        // 设置内嵌元素 cid,第一个参数表示内联图片的标识符,第二个参数标识资源引用
        mimeMessageHelper.addInline("test", new ClassPathResource("static/test.jpg"));

        javaMailSender.send(mimeMessage);
    }
}

如下图所示,则说明邮件发送成功

springboot qq邮箱25端口 springboot接收邮件_Java_09

四、总结

使用Spring Boot实现邮件发送功能非常的简单快捷,通过上文的学习,再经过自己的实践,想必同学们以后实现发送邮件功能也是信手拈来的事。