史上最详细的Springboot发送各类邮件教程

一、获取服务器授权码

简单来说,就是你需要使用什么邮箱来发送邮件,需要获取到这个发送邮箱的授权码才能有这个权限,这里使用 QQ 邮箱为例
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这个就是 QQ 邮箱的授权码,请妥善保管

二、基本配置

1. 添加相关的 POM 文件

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

2. 配置 yml 文件

spring:
  mail:
    # 配置 SMTP 服务器地址
    host: smtp.qq.com
    # 发送者邮箱
    username: xxxx@qq.com
    # 配置密码,注意不是真正的密码,而是刚刚申请到的授权码
    password: xxxxxx
    # 端口号465或587
    port: 587
    # 默认的邮件编码为UTF-8
    default-encoding: UTF-8
    # 配置SSL 加密工厂
    properties: # 设置邮件超时时间防止服务器阻塞
      timeout: 5000
      connection-timeout: 5000
      write-timeout: 5000
      mail:
        smtp:
          socketFactoryClass: javax.net.ssl.SSLSocketFactory
        #表示开启 DEBUG 模式,这样,邮件发送过程的日志会在控制台打印出来,方便排查错误
        debug: true

126 邮箱 SMTP 服务器地址:smtp.126.com,端口号:465 或者 994
2163 邮箱 SMTP 服务器地址:smtp.163.com,端口号:465 或者 994
yeah 邮箱 SMTP 服务器地址:smtp.yeah.net,端口号:465 或者 994
qq 邮箱 SMTP 服务器地址:smtp.qq.com,端口号 465 或 587

三、邮件服务

1. 定义邮件接口

public interface IEmailService {


    /**
     * 普通邮件发送
     *
     * @param form    发送人
     * @param to      发送对象
     * @param subject 主题
     * @param content 内容
     */
    void sendText(String form, String to, String subject, String content);

    /**
     * Html邮件发送
     *
     * @param form    发送人
     * @param to      发送对象
     * @param subject 主题
     * @param content 内容
     */
    void sendHtml(String form, String to, String subject, String content);

    /**
     * 邮件发送
     *
     * @param name    发送人名称
     * @param form    发送人
     * @param to      发送对象
     * @param subject 主题
     * @param content 内容
     * @param isHtml  是否为html
     * @param cc      抄送,多人用逗号隔开
     * @param bcc     密送,多人用逗号隔开
     * @param files   文件
     */
    void send(String name, String form, String to, String subject, String content, Boolean isHtml, String cc, String bcc, List<File> files);


}

这里我定义了三个邮件发送的接口,一个是普通文本,一个是 HTML 的,最后一个是综合类型的,可以根据参数自己配置内容

2. 邮件实现类

@Slf4j
@Service
public class EmailServiceImpl implements IEmailService {

    @Autowired
    private JavaMailSender javaMailSender;//注入邮件工具类

    @Override
    public void send(String name, String form, String to, String subject, String content, Boolean isHtml, String cc, String bcc, List<File> files) {

        if (StringUtils.isAnyBlank(form, to, subject, content)) {
            throw new ServiceException("发送人,接收人,主题,内容均不可为空");
        }
        try {
            //true表示支持复杂类型
            MimeMessageHelper messageHelper = new MimeMessageHelper(javaMailSender.createMimeMessage(), true);
            //邮件发信人
            messageHelper.setFrom(new InternetAddress(name + "<" + form + ">"));
            //邮件收信人
            messageHelper.setTo(to.split(","));
            //邮件主题
            messageHelper.setSubject(subject);
            //邮件内容
            messageHelper.setText(content, isHtml);
            //抄送
            if (!StringUtils.isEmpty(cc)) {
                messageHelper.setCc(cc.split(","));
            }
            //密送
            if (!StringUtils.isEmpty(bcc)) {
                messageHelper.setCc(bcc.split(","));
            }
            //添加邮件附件
            if (CollectionUtil.isNotEmpty(files)) {
                for (File file : files) {
                    messageHelper.addAttachment(file.getName(), file);
                }
            }
            // 邮件发送时间
            messageHelper.setSentDate(new Date());
            //正式发送邮件
            javaMailSender.send(messageHelper.getMimeMessage());
        } catch (Exception e) {
            throw new ServiceException("邮件发送失败", e);
        }
    }


    @Override
    public void sendText(String form, String to, String subject, String content) {
        this.send("评论提醒", form, to, subject, content, false, null, null, null);
    }

    @Override
    public void sendHtml(String form, String to, String subject, String content) {
        this.send("评论提醒", form, to, subject, content, true, null, null, null);
    }

}

测试发送

每一行代码的注释我也都注释了,不难解释,这里我提出一点的是

//邮件发信人
messageHelper.setFrom(new InternetAddress(name + "<" + form + ">"));

这里是为了发送邮件的时候的发送者名称可以自定义,而不是上述中的邮箱名称

这样是不是好看多了

3.HTML 邮件

有时候,我们需要展示好看的邮件格式用 HTML 编写,然后使用占位符填充 HTML 的内容,所以这里使用TemplateEngine来做

  1. 新增 POM
<!--thymeleaf-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
  1. 创建 HTML 模板
    在 resoureces 文件夹下创建 template.html 文件

这里还是以我博主评论回复发送的邮件为例

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>评论提醒</title>
    <style>
        .button {
            background-color: rgb(14 165 233);
            border-radius: 10px;
            border: #181818;
            color: white;
            padding: 6px 10px;
        }

        .avatar {
            width: 60px;
            height: 60px;
            border-radius: 9px;
        }
    </style>
</head>
<body>
<div>
    <div style="display: flex;align-items: center">
        <img class="avatar" src="https://q1.qlogo.cn/headimg_dl?dst_uin=1032065316&spec=100" alt="头像">
        <div style="display: block;margin-left: 10px">
            <p th:text="'您好,'+${oldNickname}"></p>
            <p>您在本站的留言收到了回复:</p>
        </div>
    </div>
    <p><strong>您的评论内容:</strong></p>
    <p th:text="${oldContent}"></p>
    <p><strong th:text="${nickname}+'回复内容:'"></strong></p>
    <p th:text="${newContent}"><strong></strong></p>
    <button class="button">
        <a th:href="${url}">查看详细内容</a>
    </button>
    <p>此邮件由系统自动发出,请勿直接回复</p>
</div>
</body>
</html>

这里的${}就是占位符,在发送的时候填充数据即可,具体的thymeleaf相关语法写法可以去百度找找

  1. 发送 HTML 邮件
@SpringBootTest
public class EmailTest implements Serializable {

    @Autowired
    private IEmailService emailService;

    @Autowired
    private TemplateEngine templateEngine;

    @Test
    public void test_email_text() {
        Context context = new Context();
        context.setVariable("avatar", "https://q1.qlogo.cn/headimg_dl?dst_uin=1032065316&spec=100");
        context.setVariable("nickname", "Mr.Sun");
        context.setVariable("newContent", "测试新的评论");
        context.setVariable("oldContent", "这是旧的评论");
        context.setVariable("oldNickname", "腾讯视频");
        context.setVariable("url", "https://www.xiaoquanya.com");
        String content = templateEngine.process("commentTemplate.html", context);
        emailService.sendHtml("xxxx@qq.com", "xxxx@qq.com", "您在 『 Mr.Sun的博客 』上的留言有新的回复", content);
    }

}

这里使用Context context = new Context();来填充刚刚的 html 中的数据,然后发送就可以了

  • 24
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个用于快速开发和构建可独立运行的、基于Spring框架的Java应用程序的工具。它可以轻松地创建、配置和管理Spring项目,减少了开发者的配置和部署工作量,使开发人员能够更专注于业务逻辑的实现。 Spring Boot的设计理念是约定优于配置,它提供了一种通过少量的配置文件和注解来进行项目配置的方式。通过自动配置和起步依赖,开发者可以快速搭建一个独立可运行的Spring应用程序。 Spring Boot的主要特点包括以下几个方面: 1. 快速搭建:Spring Boot提供了一系列的起步依赖,可以快速创建一个可运行的应用程序。开发者只需要选择所需功能的起步依赖,Spring Boot就会自动提供对应的配置和依赖。 2. 自动配置:Spring Boot根据项目的依赖和配置情况,自动进行配置。开发者无需手动配置,大部分情况下只需要提供一些关键的配置信息。 3. 内嵌容器:Spring Boot可以将应用程序打包成一个可执行的JAR文件,并且内置了Tomcat、Jetty等多个常用的Web容器,无需单独安装和配置容器。 4. 优化性能:Spring Boot通过使用线程池、缓存、异步处理等技术手段,来优化应用程序的性能。 5. 多数据源支持:Spring Boot支持多个数据源的配置和管理,可以轻松实现多个数据库的读写操作。 总之,Spring Boot具备快速搭建、自动配置、内嵌容器等特点,极大地简化了Spring项目的开发和部署工作量,使得开发者能够更加高效地开发应用程序。它是Spring框架的有力补充,为Java开发者提供了更加便捷的开发方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值