当前位置:   article > 正文

SpringBoot发送邮件

springboot发送邮件


SpringBoot发送邮件
邮件发送是一个很常见的功能,注册身份认证,找回密码等场景都会用到邮件发送。Spring Boot提供了MailSenderAutoConfiguration 对邮件的发送做了进一步简化。

SMTP是一种提供可靠且有效的电子邮件传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。
也就是说 abc@qq.com 用户先将邮件投递到腾讯的 SMTP 服务器这个过程就使用了 SMTP 协议,然后腾讯的 SMTP 服务器将邮件投递到网易的 SMTP 服务器这个过程也依然使用了 SMTP 协议,SMTP 服务器就是用来收邮件。

POP3 协议全称为 Post Office Protocol ,译作邮局协议,它定义了邮件客户端与 POP3 服务器之间的通信规则,那么该协议在什么场景下会用到呢?当邮件到达网易的 SMTP 服务器之后,abc@163.com 用户需要登录服务器查看邮件,这个时候就该协议就用上了:邮件服务商都会为每一个用户提供专门的邮件存储空间,SMTP 服务器收到邮件之后,就将邮件保存到相应用户的邮件存储空间中,如果用户要读取邮件,就需要通过邮件服务商的 POP3 邮件服务器来完成。


申请开通POP3/SMTP服务

文章以qq邮箱的方式(其他邮箱步骤相同)
进入邮箱——>打开设置——>账户
在这里插入图片描述

  1. 找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务
  2. 打开POP3/SMTP服务,开启服务后保存好授权码
    在这里插入图片描述
    授权码可以配置多个,如果忘记授权码可以重新申请。

环境搭建

1.引入依赖

<!-- Spring Mail依赖(发送邮件) -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

2.配置邮箱信息

server:
  port: 8080
spring:
  mail:
    # 配置 SMTP 服务器地址
    host: smtp.qq.com
    # 发送者邮箱,已开通POP3/SMTP服务的邮箱,也就是你自己的
    username: xxxxx@qq.com
    # 配置密码,注意不是真正的密码,而是刚刚申请到的授权码
    password: 123456
    # 发送人昵称
    nickname: ufo_21
    # 端口号465或587(QQ邮箱发送邮件仅支持587端口协议)
    port: 587
    # 默认的邮件编码为UTF-8
    default-encoding: UTF-8
    # 配置SSL 加密工厂
    properties:
      mail:
        smtp:
          socketFactoryClass: javax.net.ssl.SSLSocketFactory
        #表示开启 DEBUG 模式,这样,邮件发送过程的日志会在控制台打印出来,方便排查错误
        debug: true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
邮箱类型SMTP服务器地址端口号
QQ邮箱smtp.qq.com465或587
sina邮箱smtp.sina.cn465或587
126邮箱smtp.126.com465或994
aliyun邮箱smtp.aliyun.com465或994
163邮箱smtp.163.com465或994
yeah邮箱smtp.yeah.net465或994

普通邮件发送

package com.ufo.maildemo;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;

import java.util.Date;

@SpringBootTest
class MailDemoApplicationTests {
    
    @Autowired
    private JavaMailSender javaMailSender;

    // 获取yml配置的发送者邮箱
    @Value("${spring.mail.username}")
    private String mainUserName;

    //发送人昵称
    @Value("${spring.mail.nickname}")
    private String nickname;

    /**
     * 普通邮件发送
     */
    @Test
    public void sendSimpleMail() {
        // 构建一个邮件对象
        SimpleMailMessage message = new SimpleMailMessage();
        // 设置邮件主题
        message.setSubject("测试邮件");
        // 设置邮件发送者,昵称+<邮箱地址>
        message.setFrom(nickname+'<'+mainUserName+'>');
        // 设置邮件接收者,可以有多个接收者,多个接受者参数需要数组形式
        message.setTo("y****@163.com");
        // 设置邮件抄送人,可以有多个抄送人
        message.setCc("12****32*qq.com");
        // 设置隐秘抄送人,可以有多个
        message.setBcc("7******9@qq.com");
        // 设置邮件发送日期
        message.setSentDate(new Date());
        // 设置邮件的正文
        message.setText("hello,do you one more");
        // 发送邮件
        javaMailSender.send(message);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

发送效果如下:
在这里插入图片描述

FreeMarker模板发送邮件

对于格式比较复杂的邮件,推荐使用HTML模板

  1. 引入FreeMarker依赖
<!-- FreeMarker模板 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  1. 定义模板文件

在resources目录创建templates文件,把模板保存在templates下

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta charset="utf-8">
    <title>${title}</title>
    <style>
        .hello {
            display: flex !important;
            justify-content: center !important;
        }

        .areaBox {
            width: 500px;
            box-sizing: border-box;
        }

        .areaBox > .title {
            font-size: 2em;
        }


        .text {
            margin-bottom: 20px;
            color: #536AD8;
        }

    </style>
</head>
<body>
<div class="hello">
    <div class="areaBox">
        <p class="title">${title}</p>
        <p class="text">这是个模板</p>
    </div>
</div>
</body>
</html>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  1. 使用FreeMarker模版渲染出邮件内容(代码)
    /**
     * FreeMarker模板发送邮件
     */
    @Test
    public void sendFreeMarkerMail() throws IOException, MessagingException, TemplateException {
        // 首先配置 FreeMarker 模版位置
        Configuration configuration = new Configuration(Configuration.VERSION_2_3_0);
        // MailDemoApplication是启动类类名
        ClassLoader loader = MailDemoApplication.class.getClassLoader();
        configuration.setClassLoaderForTemplateLoading(loader, "templates");
        // 配置模版文件
        Template template = configuration.getTemplate("mail.ftl");
        // 渲染模版
        StringWriter mail = new StringWriter();
        HashMap<String, Object> map = new HashMap<>();
        map.put("title", "FreeMarker标题");
        template.process(map, mail);

        // 构建一个邮件对象
        MimeMessage message = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        // 设置邮件发送者
        message.setFrom(nickname+'<'+mainUserName+'>');
        // 设置邮件接收者
        helper.setTo("y******9@163.com");
        // 设置邮件的主题
        message.setSubject("FreeMarker模板发送邮件");
        // 设置邮件的正文
        helper.setText(mail.toString(), true);
        // 发送邮件
        javaMailSender.send(message);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

发送效果如下:
在这里插入图片描述

如果想使用Thymeleaf模板发送邮件也是可以的,照葫芦画瓢。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/553183
推荐阅读
相关标签
  

闽ICP备14008679号