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

这篇内容对应"2.1 发送邮件"小节

邮箱设置

需要去邮箱对应的官方客户端软件或网站开启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: 465properties:mail:smtp:ssl:enable: trueprotocol: smtpsusername: nowcoder@sina.compassword: 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实现类对象* */@Autowiredprivate 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 {@Autowiredprivate MailClient mailClient;@Autowiredprivate TemplateEngine templateEngine;@Testpublic void testTextMail() {mailClient.sendMail("lihonghe@nowcoder.com", "TEST", "Welcome.");}@Testpublic 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.rhkb.cn/news/292803.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024-03-26 Android8.1 px30 WI-FI 模块rtl8821cu调试记录

一、kernel 驱动&#xff0c;我这里使用v5.8.1.2_35530.20191025_COEX20191014-4141这个版本&#xff0c;下载这个版本的驱动可以参考下面的文章。 2021-04-12 RK3288 Android7.1 USB wifi bluetooth 模块RTL8821CU 调试记录_rk平台rtl8821cu蓝牙调试-CSDN博客 二、Makefile文…

C++从入门到精通——引用()

C的引用 前言一、C引用概念二、引用特性交换指针引用 三、常引用保证值不变权限的方法权限的放大权限的缩小权限的平移类型转换临时变量 四、引用的使用场景1. 做参数2. 做返回值 五、传值、传引用效率比较值和引用的作为返回值类型的性能比较 六、引用和指针的区别引用和指针的…

web 技术中前端和后端交互过程

1、客户端服务器交互过程 客户端:上网过程中,负责浏览资源的电脑,叫客户端服务器:在因特网中,负责存放和对外提供资源的电脑叫服务器 服务器的本质: 就是一台电脑,只不过相比个人电脑它的性能高很多,个人电脑中可以通过安装浏览器的形式,访问服务器对外提供的各种资源。 个人…

Electron 读取本地配置 增加缩放功能(ctrl+scroll)

最近&#xff0c;一个之前做的electron桌面应用&#xff0c;需要增加两个功能&#xff1b;第一是读取本地的配置文件&#xff0c;然后记载配置文件中的ip地址&#xff1b;第二就是增加缩放功能&#xff1b; 第一&#xff0c;配置本地文件 首先需要在vue工程根目录中&#xff0…

切换ip地址的app,简单易用,保护隐私

在数字化时代&#xff0c;IP地址作为网络设备的标识&#xff0c;不仅承载着数据在网络间的传输任务&#xff0c;还在一定程度上关联着用户的隐私和安全。因此&#xff0c;切换IP地址的App应运而生&#xff0c;为用户提供了一种便捷的方式来改变其网络身份&#xff0c;实现匿名浏…

【Spring MVC】快速学习使用Spring MVC的注解及三层架构

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【Spring MVC】快速学习使用Spring MVC的注解及三层架构 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 Spring Web MVC一: 什么是Spring Web MVC&#xff1…

【应用笔记】LAT1413+快速开关蓝牙导致设备无广播

1. 问题背景 客户使用 BlueNRG-345MC 开发了一个 BLE 外设&#xff0c;和手机连接。在测试中发现&#xff0c;手机连接上外设之后&#xff0c;不断地在手机上点击蓝牙的开关按钮&#xff0c;造成设备不断地断开、重连&#xff1b;少则几次&#xff0c;多则几十次。点击之后&am…

【Entity Framework】创建并配置模型

【Entity Framework】创建并配置模型 文章目录 【Entity Framework】创建并配置模型一、概述二、使用fluent API配置模型三、分组配置四、对实体类型使用EntityTypeConfigurationAttribute四、使用数据注释来配置模型五、实体类型5.1 在模型中包含类型5.2 从模型中排除类型5.3 …

loadbalancer 引入与使用

在消费中pom中引入 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> 请求调用加 LoadBalanced 注解 进行服务调用 默认负载均衡是轮训模式 想要切换…

【数据结构与算法】二叉树的遍历及还原

树形结构 - 有向无环图 树是图的一种。 树形结构有一个根节点树形结构没有回路根节点&#xff1a;A叶子节点&#xff1a;下边没有其他节点了节点:既不是根节点,又不是叶子节点的普通节点树的度:这棵树最多叉的节点有多少叉&#xff0c;这棵树的度就为多少树的深度&#xff1a…

实例、构造函数、原型、原型对象、prototype、__proto__、原型链……

学习原型链和原型对象&#xff0c;不需要说太多话&#xff0c;只需要给你看看几张图&#xff0c;你自然就懂了。 prototype 表示原型对象__proto__ 表示原型 实例、构造函数和原型对象 以 error 举例 图中的 error 表示 axios 抛出的一个错误对象&#xff08;实例&#xff0…

WiFiSpoof for Mac wifi地址修改工具

WiFiSpoof for Mac&#xff0c;一款专为Mac用户打造的网络隐私守护神器&#xff0c;让您在畅游互联网的同时&#xff0c;轻松保护个人信息安全。 软件下载&#xff1a;WiFiSpoof for Mac下载 在这个信息爆炸的时代&#xff0c;网络安全问题日益凸显。WiFiSpoof通过伪装MAC地址&…

C++入门知识详细讲解

C入门知识详细讲解 1. C简介1.1 什么是C1.2 C的发展史1.3. C的重要性1.3.1 语言的使用广泛度1.3.2 在工作领域 2. C基本语法知识2.1. C关键字(C98)2.2. 命名空间2.2 命名空间使用2.2 命名空间使用 2.3. C输入&输出2.4. 缺省参数2.4.1 缺省参数概念2.4.2 缺省参数分类 2.5. …

GRE和MGRE综合实验

实际网段划分 分配IP 1.IP划分 [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip add 192.168.1.254 24 Mar 29 2024 16:42:44-08:00 r1 %%01IFNET/4/LINK_STATE(l)[3]:The line protocol IP on the interface GigabitEthernet0/0/0 has entered the UP state. [r1-Gigabi…

飞天使-k8s知识点28-kubernetes散装知识点5-helm安装ingress

文章目录 安装helm添加仓库下载包配置创建命名空间安装 安装helm https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gztar -xf helm-v3.2.3-linux-amd64.tar.gzcd linux-amd64mv helm /usr/local/bin修改/etc/profile 文件&#xff0c;修改里面内容,然后重新启用export PATH$P…

动态规划-----背包类问题(0-1背包与完全背包)详解

目录 什么是背包问题&#xff1f; 动态规划问题的一般解决办法&#xff1a; 0-1背包问题&#xff1a; 0 - 1背包类问题 分割等和子集&#xff1a; 完全背包问题&#xff1a; 完全背包类问题 零钱兑换II: 什么是背包问题&#xff1f; 背包问题(Knapsack problem)是一种…

Windows-安装infercnv包(自备)

目录 安装基础 ①安装JAGS a,找到适配版本 b&#xff0c;install for me only安装路径 ②安装"rjags"包 ③安装inferCNV 安装基础 版本&#xff1a; R version 4.2.2 (2022-10-31 ucrt) -- "Innocent and Trusting"安装的JAGS版本为JAGS 4.3.1 首…

GPT提示词分享 —— 智能域名生成器

提示词&#x1f447; 我希望你能充当一个聪明的域名生成器。我将告诉你我的公司或想法是什么&#xff0c;你将根据我的提示回复我一份域名备选清单。你只需回复域名列表&#xff0c;而不是其他。域名应该是最多 7-8 个字母&#xff0c;应该简短但独特&#xff0c;可以是朗朗上口…

C易错注意之分支循环,悬空else,短路表达式,函数static

接下来的日子会顺顺利利&#xff0c;万事胜意&#xff0c;生活明朗-----------林辞忧 前言&#xff1a; c语言中一些关于分支循环中continue常混淆&#xff0c;悬空esle问题&#xff0c;短路表达式&#xff0c;static ,extern在使用时稍不注意就会出错的点,接下来我们将介绍…

Monkey工具之fastbot-iOS实践

Monkey工具之fastbot-iOS实践 背景 目前移动端App上线后 crash 率比较高&#xff0c; 尤其在iOS端。我们需要一款Monkey工具测试App的稳定性&#xff0c;更早的发现crash问题并修复。 去年移动开发者大会上有参加 fastbot 的分享&#xff0c;所以很自然的就想到Fastbot工具。…