SpringBoot实现发送邮件功能

news2024/10/7 16:26:02

        平时注册或者登录一个网站时,可能收到过邮件用来发送验证码等,邮件在项目中经常会被用到,比如邮件发送通知,比如通过邮件注册,认证,找回密码,系统报警通知,报表信息等。

发送邮件用到了Spring Email的技术,我们这里使用的是SMTP。

1.邮箱打开SMTP服务

找一个邮箱用来给其他邮箱发送文件,要用SMTP服务发送邮件,所以邮箱要提前开启这个功能。

以163邮箱为例:(其他邮箱也是相同的操作)

开启SMTP服务后,会出现弹框,将授权密码记录下来,注意:只出现一次

还可以看到服务器地址 

2.SpringBoot集成Email

将下面的maven配置拷贝下来,集成到SpringBoot中。 

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mail -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
    <version>2.1.5.RELEASE</version>
</dependency>

3.邮箱参数配置

首先进行配置文件,配置文件的目的是告诉Spring需要用哪个邮箱来发送邮件

写到SpringBoot的yaml配置文件里面

(登录授权密码不是你邮箱的密码,是你邮箱开启SMTP服务后显示的那个授权密码)

spring:
  mail:
    #邮箱域名、端口、邮箱账号、登录授权密码、启用smtps安全协议、采用ssl安全链接
    host: smtp.163.com
    port: 465
    username: ************@163.com
    password: ************
    protocol: smtps
    properties:
      mail.smtp.ssl.enable: true

4.发送邮件工具类

package com.kyw.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;


@Component
public class MailClient {
    private static final Logger logger = LoggerFactory.getLogger(MailClient.class);

    @Autowired
    private JavaMailSender mailSender;

    //读取到配置类中的 “发送者”邮箱
    @Value("${spring.mail.username}")
    private String from;

    /**
     * 发送邮件
     * @param to        “接收者”邮箱
     * @param subject   邮件的主题
     * @param content   邮件的内容
     */
    public void sendMail(String to, String subject, String content) {
        try {
            MimeMessage mimeMessage = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setText(content,true);//表示可以发送HTML文件
            helper.setSubject(subject);
            mailSender.send(helper.getMimeMessage());
        } catch (MessagingException e) {
            logger.error("发送邮件失败:" + e.getMessage());
        }

    }
}

发送文本邮件测试

写一个测试类来测试,给我的qq邮箱发送一个邮件

package com.kyw;

import com.kyw.util.MailClient;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes  = SpringBootDemoApplication.class)
public class MailTests {
    @Autowired
    private MailClient mailClient;

    @Test
    public void testTextMail() {
        mailClient.sendMail("2370553834@qq.com","TEST","测试,你好");
    }
}

收到啦

发送HTML邮件

也是用Thymeleaf实现的,没有配置Thymeleaf先去集成一下,搜索SpringBoot集成Thymeleaf即可。

先写一个邮件模板页面,里面的username是动态的值,等待后端调用的时候填充

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>示例邮件</title>
</head>
<body>
<table cellpadding="0" cellspacing="0" border="0" width="100%" bgcolor="#f2f2f2">
  <tr>
    <td align="center" style="padding: 20px 0;">
      <table cellpadding="0" cellspacing="0" border="0" width="600" bgcolor="#ffffff">
        <tr>
          <td align="center" style="padding: 20px 0;">
            <img src="https://pic.izihun.com/pic/art_font/2019/01/16/10/png_temp_1570533438378_9814.jpg?imageMogr2/auto-orient/thumbnail/820x/format/jpeg" alt="公司标志"width="150" height="150">
          </td>
        </tr>
        <tr>
          <td style="padding: 20px;">
            <h1>欢迎来到我们的邮件示例</h1>
            <p>亲爱的收件人,<span th:text="${username}" ></span> </p>
            <p>这是一个示例邮件的内容。您可以在这里添加任何您想要的信息。</p>
            <p>感谢您的阅读。</p>
            <p>祝您一切顺利!</p>
          </td>
        </tr>
        <tr>
          <td align="center" style="background-color: #f2f2f2; padding: 20px;">
            <a href="https://www.baidu.com" style="text-decoration: none; background-color: #007BFF; color: #ffffff; padding: 10px 20px; border-radius: 5px; font-weight: bold;">访问我们的网站</a>
          </td>
        </tr>
      </table>
    </td>
  </tr>
</table>
</body>
</html>

后端测试类

package com.kyw;

import com.kyw.util.MailClient;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes  = SpringBootDemoApplication.class)
public class MailTests {
    @Autowired
    private MailClient mailClient;

    /**
     *发送文本文件
     */
    @Test
    public void testTextMail() {
        mailClient.sendMail("2370553834@qq.com","TEST","测试,你好");
    }

    @Autowired
    private TemplateEngine templateEngine;

    /**
     *使用Thymeleaf 发送HTML邮件
     */
    @Test
    public void testHtmlMail() {
        Context context = new Context();
        context.setVariable("username","张三");

        String content =  templateEngine.process("/mail/maildemo",context);
        System.out.println(content);
        mailClient.sendMail("2370553834@qq.com","TEST",content);
    }
}

注意路径要按照Thymeleaf的规范来

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/973773.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第一次做接口测试用例

一、简介 在开始接口测试之前&#xff0c;我们想一下&#xff0c;接口测试的流程是什么&#xff1f;说到这里&#xff0c;有些人就会产生好奇和疑问&#xff0c;心里mmp&#xff1a;接口测试要什么流程哈&#xff1f;&#xff1f;&#xff1f;不就是参考接口文档&#xff0c;直…

金蝶云星空对接打通赛意SMOM委外退料单接口与保存ASN数据接口

金蝶云星空对接打通赛意SMOM委外退料单接口与保存ASN数据接口 对接源平台:金蝶云星空 金蝶K/3Cloud&#xff08;金蝶云星空&#xff09;是移动互联网时代的新型ERP&#xff0c;是基于WEB2.0与云技术的新时代企业管理服务平台。金蝶K/3Cloud围绕着“生态、人人、体验”&#xff…

数据结构(一)Trie字符串统计

目录 代码 &#xff08;一&#xff09;输入cat son[p][u],p表示儿子&#xff0c;u表示第几个儿子 0的根的节点编号为idx -------------------------------------------------------- 根是0的有个儿子c&#xff0c;编号为1的节点有个子节点为a&#xff0c;a的编号是2&#xf…

SegNeXt学习记录(一):配置环境 测试代码

安装配置MMSegmentation环境 为了验证 MMSegmentation 和所需的环境是否安装正确&#xff0c;我们可以运行示例 python 代码来初始化分段器并推断演示图像&#xff1a; from mmseg.apis import inference_segmentor, init_segmentor import mmcvconfig_file configs/pspnet/…

一辆新能源汽车的诞生之旅:比亚迪常州工厂探营

作为在新能源汽车领域首屈一指的国产品牌&#xff0c;比亚迪近年来可以说是捷报频传&#xff0c;高奏凯歌。 以比亚迪常州工厂为例&#xff0c;据介绍该工厂当初规划设计时定下的生产目标&#xff0c;是年产量能够达到20万辆。然而在2023年上半年&#xff0c;该工厂光是主要销往…

美元的吸血鬼攻击

今日荐读&#xff1a;9.3教链内参《摩根大通认为SEC将被迫批准现货ETF》。刘教链Pro《为什么我写了PGP》。 * * * 刘教链 原创 * * * 自2022年3月16日美联储议息会议后决定开始加息25bp以来&#xff0c;今天&#xff08;2023.9.4&#xff09;已经是本轮加息周期的第537天。在…

网络编程面试题

计算机网络体系结构 在计算机网络的基本概念中&#xff0c;分层次的体系结构是最基本的。计算机网络体系结构的抽象概念较多&#xff0c;在学习时要多思考。这些概念对后面的学习很有帮助。 网络协议是什么&#xff1f; 在计算机网络要做到有条不紊地交换数据&#xff0c;就…

全栈监控,可视化整个堆栈

IT 管理员能够监## 标题控终端设备已有一段时间了&#xff0c;但随着现代基础架构和向混合云架构的转型&#xff0c;端到端可见性至关重要&#xff0c;混合云环境的行为可能不可预测&#xff0c;因此传统技术通常是不够的。传统基础结构监视方法的最大缺点是缺乏对环境特定部分…

Pandas DataFrame 数据存储格式比较

Pandas 支持多种存储格式&#xff0c;在本文中将对不同类型存储格式下的Pandas Dataframe的读取速度、写入速度和大小的进行测试对比。 创建测试Dataframe 首先创建一个包含不同类型数据的测试Pandas Dataframe。 import pandas as pdimport randomimport stringimport numpy …

详解TCP/IP的三次握手和四次挥手

文章目录 前言一、TCP/IP协议的三次握手1.1 三次握手流程 二、TCP/IP的四次挥手2.1 四次挥手流程 三、主要字段3.1、标志位&#xff08;Flags&#xff09;3.2、序号&#xff08;sequence number&#xff09;3.3、确认号&#xff08;acknowledgement number&#xff09; 四、状态…

如何让图片动起来?拿捏这个方法轻松做到

现在&#xff0c;越来越多的人开始使用手机来制作动态图片&#xff0c;因为手机上的应用程序使得这个过程变得简单而有趣。下面我们来探讨一些如何让图片动起来的方法以及在手机上制作时需要注意的事项。 制作动态图片的方法 首先我们先准备好需要制作动态特效的图片&#xff…

Wireshark抓包常用指令

1.常用过滤规则 指定源地址&#xff1a; ip.src 10.0.1.123ip.src 10.0.1.123 && udphttp数据链路层&#xff1a;筛选mac地址为04:f9:38:ad:13:26的数据包----eth.src 04:f9:38:ad:13:26筛选源mac地址为04:f9:38:ad:13:26的数据包----eth.src 04:f9:38:ad:13:26网…

Python 之 match 表达式

Python 从 3.10 版本开始增加了 match 语句&#xff0c;和其他语言常见的 switch 语句极其相似&#xff0c;但功能更加强大。 本文通过实例&#xff0c;了解下其用法。 基本的 match 语句 def http_code(status): match status: case 400 | 404 | 418: …

STL ---- vector 使用

单纯的使用vector不和algorithm连用. vector自带的方法: push_back(num) pop_back() push_back 添加元素, pop_back删除元素.添加和删除都是在末尾添加和删除的. void assign(const_iterator first,const_iterator last); // 相当于拷贝函数 void assign(size_type n,const…

长胜证券:创业板上市容易吗?

创业板是我国股市的一个板块&#xff0c;特点是适合一些新式企业在股市进行融资。与A股比较&#xff0c;创业板上市门槛相对较低&#xff0c;整个上市过程相对简单和方便&#xff0c;似乎对于草创企业来说十分有利。但是&#xff0c;实际上&#xff0c;创业板上市虽然相对简单&…

陶氏公司将出席2023第二届中国汽车碳中和峰会

2023第二届中国汽车碳中和峰会将于10月19日-20日在上海举办。 本次峰会将为行业领导者、政策制定者和专家提供一个平台&#xff0c;讨论汽车行业减少碳排放的策略。专家们将从政策、供应链、ESG、替代能源解决方案、汽车材料创新、法律等不同领域分享碳中和与可持续策略。 通…

HDFS HA 高可用集群搭建详细图文教程

目录 一、高可用&#xff08;HA&#xff09;的背景知识 1.1 单点故障 1.2 如何解决单点故障 1.2.1 主备集群 1.2.2 Active、Standby 1.2.3 高可用 1.2.4 集群可用性评判标准&#xff08;x 个 9&#xff09; 1.3 HA 系统设计核心问题 1.3.1 脑裂问题 1.3.2 数据状…

项目(智慧教室)第三部分,人机交互在stm32上的实现

一。使用软件 1.stm32cubemx中针对汉字提供的软件 2.对数据进行处理 2.上面点击ok--》这里选择确定 3.这里选择保存即可由字符库&#xff0c;但是需要占用内存太大&#xff0c;需35M&#xff0c;但是stm32只有几百k&#xff0c;所以需要自己删减。 生成中文字符&#xff08;用…

UML基础

统一建模语言&#xff08;UML是 Unified Modeling Language的缩写, 是用来对软件系统进行可视化建模的一种语言。UML为面向对象开发系统的产品 进行说明、可视化、和编制文档的一种标准语言。 共有9种图 UML中的图其实不止九种 (相同的图还可能会有不同的名称), 这里的九种图是…

写字楼远程预付费抄表系统

写字楼远程预付费抄表系统是一种现代化的智能抄表解决方案&#xff0c;具有许多优点&#xff0c;例如&#xff1a;提高抄表效率&#xff0c;降低人力成本&#xff0c;减少误差&#xff0c;防止偷漏电等问题。下面就由小编来为大家来讲解下写字楼远程预付费抄表系统吧&#xff0…