小工具      在线工具  汉语词典  css  js  c++  java

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

Java基础,spring boot,java,后端 额外说明

收录于:40天前

一、获取服务器授权码

简单来说,就是你需要使用什么邮箱来发送邮件,需要获取到这个发送邮箱的授权码才能有这个权限,这里使用 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: [email protected]
    # 配置密码,注意不是真正的密码,而是刚刚申请到的授权码
    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("[email protected]", "[email protected]", "您在 『 Mr.Sun的博客 』上的留言有新的回复", content);
    }

}

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

. . .

相关推荐

额外说明

将本地包pom引入maven jar包的两种方式

项目中有些jar包是第三方的,maven官方仓库没有, 需要使用mvn install命令打包到本地,然后将其写入到pom.xml的依赖中, maven仓库有的jar包则从maven官网找到对应版本的depdency写入pom文件里面,这样maven打包

额外说明

转载:汇编语言指令英文含义

目录 一.通用数据传送指令 二、算术运算指令 三、逻辑运算指令 四、串指令 五、程序转移指令 六、伪指令 一.通用数据传送指令 MOV----> move MOV dest,src ;dest←src MOV指令把一个字节或字的操作数从源地址src传送至

额外说明

day31_spring简介与配置

1. spring概述 1.1 Spring是什么(理解) Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Pr

额外说明

C#——事件

事件 类 或对象可以通过事件向其他类或对象通知发生的相关事情。 发送(或引发)事件的类称为“发布者”,接收(或处理)事件的类称为“订阅者”。 在典型的 C# Windows 窗体或 Web 应用程序中,可订阅由按钮和列表框等控件引发的事件。 可以使用 V

额外说明

阿里云 CentOS7.9 搭建 Hexo 个人博客教程

前言 最近买了个阿里云服务器,于是打算搭建一个个人博客网站,使用的是 Hexo,下面是搭建的过程。 搭建过程 本次个人博客大致的搭建步骤如下: 购买阿里云服务器 配置阿里云服务器 服务端安装 Nodejs 服务端安装 Git 服务端安装 Nginx 客户

额外说明

Servlet中主要的内置对象

Servlet中有一些内置对象,它们提供了与 Web 容器和客户端交互的功能。这些对象在开发Servlet时可以直接使用,无需显式创建。 一些主要的内置对象包括: HttpServletRequest:代表客户端的HTTP请求,提供访问请求的内容,如参数

额外说明

java keytool 深入理解

关于 Java Keytool 的基本介绍可以参考: Java Keytool 命令行工具 本篇主要解决如下问题: -genkeypair 命令产生的究竟是什么呢? -genkey 和-genkeypair 的关系是怎样的呢? 使用Java代码如何获取k

额外说明

Linux rpm 命令使用详解

rpm 执行安装包有二进制包(Binary)以及源代码包(Source)两种。二进制包可以直接安装在计算机中,而源代码包将会由 RPM自动编译、安装。源代码包经常以src.rpm作为后缀名。 常用命令组合 -ivh:安装显示安装进度–install–ve

额外说明

SpringBoot【问题 03】BindingException\MalformedInputException\Error querying database(sqlite数据库)

1.类文件具有错误的版本 61.0, 应为 52.0 # JDK8+SpringBoot3.1.0 java.lang.UnsupportedClassVersionError: ch/qos/logback/classic/spi/LogbackSe

额外说明

JSONObject(com.alibaba)详解-fastjson2

前言 fastjson2是FASTJSON项目的重要升级。目标是为未来十年提供高性能的 JSON 库。 fastjson2的性能相比原来老的fastjson有了很大的提升,并且fastjson2更加安全。 autoType白名单被彻底删除,提高了fast

ads via 小工具