使用 Spring Email 和 Thymeleaf 技术,向新注册用户发送激活邮件(一)

news2024/11/29 3:03:27

这篇内容对应"2.1 发送邮件"小节
对应视频:9-发送邮件
视频链接

邮箱设置

需要去邮箱对应的官方客户端软件或网站开启IMAP/SMTP服务或POP3/SMTP服务器
在这里插入图片描述
如果不开启,就无法使用第三方用户代理,只能走第官方的电子邮件客户端软件或网站,用户代理就是电子邮件客户端软件。

开启之后,我们就可以用Spring Email技术将整合的JavaMailSender作为发送邮件的用户代理。
在这里插入图片描述

Spring Email

导入Jar包

要想使用邮件Spring整合的邮件功能,需要导入spring boot start mail Jar包

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

邮箱参数配置

不要将邮箱相关参数写死在Java程序中,而是应该写作配置文件中,方便以后修改。
邮箱相关参数:

  • host:电子邮件服务器域名,Spring Email用户代理需要向那个服务器发送邮件
  • port:端口,20 世纪 90 年代,一些电子邮件服务提供商已开始使用 SMTPS,当时使用的是 安全套接字层协议 (SSL),这是 TLS 的原始版本,现已弃用。他们为此指定了端口 465,尽管没有任何官方互联网机构批准使用该端口。
  • protocol:用户代理向电子邮件服务器发送邮件所使用的协议,注意smtp与smtps不一样
  • username:邮件发送发的邮箱
  • password:邮件发送方的密码 因为SMTP协议认证要求必须提供账户名和密码才能登录服务器,其设计目的在于避免用户受到垃圾邮件的侵扰。
  • properties.mail.smtp.ssl.enable: 是否启用安全连接

配置文件如下:

spring:
    mail:
        host: smtp.sina.com    
        port: 465
        properties:
            mail:
                smtp:
                    ssl:
                        enable: true
        protocol: smtps
        username: nowcoder@sina.com
        password: nowcoder123

使用JavaMailSender发送邮件

JavaMailSender是一个接口类,我们通过其实现类JavaMailSenderImpl来进行邮件的发送,发送邮件的逻辑最好封装一下,这样可以反复的使用,复用代码。
所以,新建一个包,包名叫util,专门用于存放工具类
在这里插入图片描述
然后,在util报下新建一个MailClient类,邮箱客户端,因为JavaMailSender在发送邮件的过程中,扮演的角色是用户代理(电子邮件客户端软件)
在这里插入图片描述
所以将这个类取名为MaillClient。

一封邮件邮件的格式:
在这里插入图片描述
JavaMailSender接口源码:

public interface JavaMailSender extends MailSender {
    MimeMessage createMimeMessage();

    MimeMessage createMimeMessage(InputStream var1) throws MailException;

    void send(MimeMessage var1) throws MailException;

    void send(MimeMessage... var1) throws MailException;

    void send(MimeMessagePreparator var1) throws MailException;

    void send(MimeMessagePreparator... var1) throws MailException;
}

可以发现JavaMailSender 接口就两类方法
在这里插入图片描述
send方法从字面既可以理解,这是用于发邮件的。

createMimeMessage 方法是干什么的呢?

要想理解这个方法,主要是要理解中间Mime的含义,Mime全称是Multipurpose Internet Mail Extension,多用途因特网邮件拓展。

那这个MIME有什么用呢?前面我们在配置时,使用的邮件传输协议时smtps,该协议与smtp一样,都支持传输ASCCII码文本数据,不可以传输其他可执行文件或者二进制对象,甚至连中文文字都传输不了。

SMTP无法满足传送多媒体邮件(带有图片、音频或视频数据)的需要,并且许多非英语国家的文字也无法使用通过SMTP传输。所以,为了解决SMTP无法传输非ASCII码文本的问题,MIME(Multipurpose Internet Mail Extension,多用途因特网邮件拓展)应运而生了。MIME最主要的作用就是定义了传送编码,可对任意内容格式进行转换,而不会被邮件系统所改变。
在这里插入图片描述
MailClient 类源码:

package com.nowcoder.community.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;

/*
 * 表示说我这个bean需要有spring容器来管理,
 * 而且使用@Component注解表示说是一个比较通用的bean,
 * 在哪些层次都可以使用。
 * */
@Component
public class MailClient {

    private static final Logger logger = LoggerFactory.getLogger(MailClient.class);

    /*
     * 要使用的核心组件是JavaMailSender,这个注解已经由spring来管理了
     * 我们直接注入即可获取JavaMailSenderImpl实现类对象
     * */
    @Autowired
    private JavaMailSender mailSender;

    /*
     * 发送邮件需要几个条件:
     * 1、邮件发送方(由于是服务器发送邮件,所以这个是固定的)
     * 2、邮件接收方
     * 3、邮件主题
     * 4、邮件内容
     * */
    @Value("${spring.mail.username}")
    private String from;

    public void sendMail(String to, String subject, String content) {
        try {
            MimeMessage message = mailSender.createMimeMessage();

            /*
             * 这里通过message也可以实现setFrom,setTo等。
             * 但是MimeMessageHelper帮助我们进行一些基础功能的实现比如:
             * 邮箱地址检查是否满足格式、字符串是不是为空等等
             * */
            MimeMessageHelper helper = new MimeMessageHelper(message);

            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            /*
            * 表示运行支持html文本,将html转成字符传进来它也支持
            * */
            helper.setText(content, true);
            mailSender.send(helper.getMimeMessage());
        } catch (MessagingException e) {
            logger.error("发送邮件失败:" + e.getMessage());
        }
    }

}

            /*
            * 表示运行支持html文本,将html转成字符传进来它也支持
            * */
            helper.setText(content, true);

这里为什么要将传入true,因为我们要把html转成字符串设置从content,让MIME去解析。如果不设置为true,它就会当作不同字符串。
在这里插入图片描述

模板引擎

为什么要用模板引擎?

  1. 我们要发送HTML邮件(不用模板引擎也可以做到),HTML是静态页面。更美观的页面
  2. HTML里面有动态生成的激活码(根本原因)更丰富的信息

在这里插入图片描述

测试HTML页面发送

在templates/mail目录下,新建demo.html模板。demo.html内容如下:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>邮件示例</title>
</head>
<body>
    <p>欢迎你, <span style="color:red;" th:text="${username}"></span>!</p>
</body>
</html>

如何生成模板渲染后端html页面?

如果是在Spring MVC的情况下,非常简单。 在controller中,某个方法,直接return 模板的路径名称,让后Spring MVC会自动找到改模板,并将Model中的数据渲染到视图中。

如果不是在Spring MVC的情况下,需要程序员手动去调用代码实现这个过程。主动的去调用Thymeleaf模板引擎:

  1. 注入thymeleaf模板引擎对象,TemplateEngine
  2. 利用thymeleaf的上下文对象 Context,设置username的值
  3. 调用模板引擎TemplateEngine对象,将数据渲染到html,生成动态网页TemplateEngine中有一个process方法,传入视图的路径名称,和上下文对象。

在这里插入图片描述

如图所示,相当于我们是直接从红色部分区域开始的。
建立MailTests类,代码如下:

package com.nowcoder.community;

import com.nowcoder.community.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 = CommunityApplication.class)
public class MailTests {

    @Autowired
    private MailClient mailClient;

    @Autowired
    private TemplateEngine templateEngine;

    @Test
    public void testTextMail() {
        mailClient.sendMail("lihonghe@nowcoder.com", "TEST", "Welcome.");
    }

    @Test
    public void testHtmlMail() {
        Context context = new Context();
        context.setVariable("username", "sunday");

        String content = templateEngine.process("/mail/demo", context);
        System.out.println(content);

        mailClient.sendMail("lihonghe@nowcoder.com", "HTML", content);
    }

}

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

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

相关文章

GT收发器第一篇_总体结构介绍

文章目录 前言GT收发器介绍 前言 之前写过一篇简单介绍GT的文章https://blog.csdn.net/m0_56222647/article/details/136730026&#xff0c;可以先通过这篇文章对整体进行简单了解一下。 GT收发器介绍 参考xilinx手册ug476 对于7系列的FPGA&#xff0c;共有3个系列&#xf…

3D检测:从pointnet,voxelnet,pointpillar到centerpoint

记录centerpoint学习笔记。目前被引用1275次&#xff0c;非常高。 地址&#xff1a;Center-Based 3D Object Detection and Tracking (thecvf.com) GitHub - tianweiy/CenterPoint CenterPoint&#xff1a;三维点云目标检测算法梳理及最新进展&#xff08;CVPR2021&#xff…

【Java初阶(七)】接口

❣博主主页: 33的博客❣ ▶文章专栏分类: Java从入门到精通◀ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; 目录 1.前言2.接口2.1语法规则2.2接口使用2.3接口特性2.4实现多个接口2.5接口使用实例2.6Clonable接口和深拷贝 3.Object类3.1对象比较equals方法3.2hashcod…

Vivado使用(1)——综合的约束与策略

目录 一、概述 二、约束与策略 2.1 约束 2.1.1 物理约束 2.1.2 时序约束 2.2 综合策略 2.2.1 flatten_hierarchy 2.2.2 gated_clock_conversion 2.2.3 bufg 2.2.4 fanout_limit 2.2.5 directive 2.2.6 retiming 2.2.7 fsm_extraction 2.2.8 keep_equivalent_regi…

Uibot6.0 (RPA财务机器人师资培训第6天 )发票验真机器人案例实战

类似于小北的这篇博客&#xff1a;Uibot (RPA设计软件&#xff09;Mage AI智能识别&#xff08;发票识别&#xff09;———课前材料五_uibot 添加mageai-CSDN博客https://blog.csdn.net/Zhiyilang/article/details/135591297?spm1001.2014.3001.5501训练网站&#xff1a;泓江…

嵌入式科普(14)指针---这些年嵌入式工程师也不容易理解的词语

目录 一、指针&#xff08;Pointer&#xff09;&#xff1a; 1.1 动态内存管理&#xff1a; 1.2 数组和字符串操作&#xff1a; 1.3 函数参数传递&#xff1a; 1.4 数据结构实现&#xff08;链表&#xff09;&#xff1a; 1.5 实现回调函数&#xff1a; 1.6 提高性能&am…

Day63-LVS四层负载均衡及结合Nginx7层负载均衡实践

Day63-LVS四层负载均衡及结合Nginx7层负载均衡实践 1. LVS&#xff08;Linux Virtual Server&#xff09;介绍2. IPVS&#xff08;LVS&#xff09;发展史3. IPVS软件工作层次图4. LVS技术点小结5. LVS的4模式原理讲解5.1 NAT(Network AddressTranslation)&#xff0c;中文网络地…

纽扣电池CR1632没有电解决方案

使用环境 在使用小米的自拍杆时&#xff0c;发现纽扣电池没有电量了逛了下超市&#xff0c;结果发现都没有卖这个型号的电池&#xff0c;但是下午又要拍照&#xff0c;于是想起了应急的充电方法。声明一下&#xff0c;这个内置电池型号是CR1632&#xff0c;然而市面上&#xff…

vue基础教程(5)——十分钟吃透vue路由router

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、路由概念二、路由使用三、创建路由对应的组件四、给整个项目一个入口总结 前言 前面的文章运行成功后&#xff0c;页面显示如下&#xff1a; 在这个页面中&#xff0c;点击Home和About都会切换右面的页面内容&#…

什么是Redis数据一致性?如何解决?

在系统中缓存最常用的策略是&#xff1a;服务端需要同时维护DB和cache&#xff0c;并且是以DB的结果为准–Cache-Aside Pattern&#xff08;缓存分离模式、旁路缓存&#xff09; 读数据 单纯的读数据是不会产生数据不一致&#xff0c;只有并发下读和写才会存在数据不一致。 写…

插入排序---算法

1、算法概念 插入排序&#xff1a;它的工作原理是通过构建有序排序&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置插入。 2、算法步骤 将第一待排序序列第一个元素看作一个有序序列&#xff0c;把第二个元素到最后一个元素当成是…

3万字80道Java基础经典面试题总结(2024修订版)

大家好&#xff0c;我是哪吒。 本系列是《10万字208道Java经典面试题总结(附答案)》的2024修订版。 目录 1、说说跨平台性2、Java是如何实现跨平台性的&#xff1f;3、JDK 和 JRE 有什么区别&#xff1f;4、为何要配置Java环境变量&#xff1f;5、Java都有哪些特性&#xff1f…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《偏远地区能源自洽系统源储容量协同配置方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

AcWing 4405. 统计子矩阵:做题笔记

目录 暴力思路 代码 前缀和双指针 代码 解释 推荐博客 这道题的主要思路就是枚举所有的子矩阵&#xff0c;判断符合条件的子矩阵的个数。 暴力思路 我服了&#xff0c;其实我最开始没有想到 &#xff1a;枚举所有的子矩阵 这样一个很有总结性的要点。 我是想着哦我先…

Mysql数据库:MHA高可用架构

目录 前言 一、MHA概述 1、什么是MHA 2、MHA的特点 3、MHA的组成 4、MHA的工作原理 5、故障切换备选主库的算法 二、部署MHA高可用架构 1、环境部署 2、部署主从同步 2.1 修改主配置文件并创建软链接 2.1.1 master 修改主配置文件并创建软连接 2.1.2 slave1 修改主…

WIFI驱动移植实验:将 rtl8188EUS驱动添加到 Linux 内核中

一. 简介 正点原子的 I.MX6U-ALPHA 开发板目前支持两种接口的 WIFI &#xff1a; USB 和 SDIO &#xff0c;其中 USB接口的WIFI 使用使用的芯片为 RTL8188EUS 或 RTL8188CUS &#xff0c; SDIO 接口的 WIFI 使用芯片为 RTL8189FS &#xff0c;也叫做 RTL8189FT…

尚医通day1

1 创建项目 doc 窗口 pnpm create vite 填写项目名 vue-syt选择框架 vuetypeScript 2整理项目 删除 /src/assets/vue.svg 文件&#xff0c;删除 /src/components 下的 helloWorld.vue删除app.vue内容&#xff0c;快捷键v3ts 生成模板内容去掉 /src/style.css 样式文件&…

仿微信领红包HTML源码

源码介绍 仿微信领红包HTML源码&#xff0c;将代码放到一个空白的HTML文件里面保存&#xff0c;鼠标双击即可查看效果&#xff0c;一个微信发送消息提示&#xff0c;弹窗就出来了&#xff0c;关闭之后&#xff0c;出现完整的微信红包领取界面&#xff0c;源码HTML&#xff0c;…

GS1-全球分类标准

GS1 GS1是一个中立的全球合作平台&#xff0c;汇集行业领袖、政府、监管机构、学术界和协会&#xff0c;共同开发基于标准的解决方案&#xff0c;以应对数据交换的挑战。我们的规模和影响力——遍布 116 个国家/地区的当地会员组织、超过 200 万家用户公司和每天 100 亿笔交易—…

conda 创建 python3.10.12 环境

conda 创建 python3.10.12 环境 介绍使用前置条件&#xff1a;安装 conda配置环境变量验证 Conda 安装结果创建环境&#xff1a;python激活 Anaconda 环境 验证 Python 版本。 介绍 Conda是一个开源的包管理和环境管理系统&#xff0c;由Continuum Analytics公司开发。它可以安…