功能实现——采用 Hutool 工具发送邮件

news2024/9/22 1:08:21

目录

  • 1.需求分析
  • 2.准备工作:开通邮箱的 SMTP 服务
  • 3.项目环境搭建
  • 4.代码实现
    • mail.html
    • Employee.java
    • MailController.java
    • MailService.java
    • MailServiceImpl.java
  • 5.测试

1.需求分析

采用 Hutool 工具来实现发送邮件的功能,具体来说:为新员工发送一封入职欢迎邮件,在发送邮件时,需要先将新员工的相关信息(例如姓名、职位、职称、部门)设置到 HTML 模板中,然后再进行发送。

Hutool 工具中发送邮件的相关文档见邮件工具-MailUtil。

2.准备工作:开通邮箱的 SMTP 服务

(1)本文以 163 邮箱为例,先注册 163 邮箱,登录 163 邮箱后,开通邮箱的 SMTP 服务,具体步骤如下所示:

在这里插入图片描述

在这里插入图片描述

需要根据注册时的手机号发送的验证码来开通获取邮箱客户端授权码。开通成功后,会显示个人授权码(如下图所示),该授权码是后面通过 Java 发送邮件的认证密码,非常重要!

在这里插入图片描述

3.项目环境搭建

(1)在 IDEA 中创建一个 Spring Boot 项目,具体可以参考【环境搭建】使用IDEA创建SpringBoot项目详细步骤这篇文章。

(2)pom.xml 中添加如下依赖:

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

<!-- com.sun.mail 是 javax.mail 升级后的版本,新版本包名做了变更-->
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version>
</dependency>

(3)在 classpath(在标准 Maven 项目中为 src/main/resources)的 config 目录下新建 mail.setting 文件,里面设置相关的邮件配置:

# 邮件服务器的 SMTP 地址,可选,默认为 smtp.<发件人邮箱后缀>
host = smtp.163.com
# 邮件服务器的 SMTP 端口,可选,默认 25
port = 25
# 发件人(必须正确,否则发送失败)
from = xxx@163.com
# 用户名,默认为发件人邮箱前缀
user = xxx
# 密码(注意,某些邮箱需要为 SMTP 服务单独设置授权码,此处填上面获取到的授权码)
pass = xxx

注意:除了使用上述配置方式外,我们也可以在 Spring Boot 的配置文件(例如 application.yml)中进行邮件配置,然后在发送邮件时进行读取即可。使用上述方式的好处在于免去了读取这一步骤。

4.代码实现

mail.html

邮件模板 mail.html 如下:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>入职欢迎邮件</title>
    </head>
    <body>
      欢迎 <span th:text="${name}"></span> 加入 XXXX 大家庭,您的入职信息如下:
      <table border="1">
          <tr>
              <td>姓名</td>
              <td th:text="${name}"></td>
          </tr>
          <tr>
              <td>职位</td>
              <td th:text="${posName}"></td>
          </tr>
          <tr>
              <td>职称</td>
              <td th:text="${jobLevelName}"></td>
          </tr>
          <tr>
              <td>部门</td>
              <td th:text="${departmentName}"></td>
          </tr>
      </table>
      <p>我们公司的工作忠旨是严格,创新,诚信,您的加入将为我们带来新鲜的血液,带来创新的思维,
        以及为我们树立良好的公司形象!希望在以后的工作中我们能够齐心协力,与时俱进,团结协作!
        同时也祝您在本公司,工作愉快,实现自己的人生价值!希望在未来的日子里,携手共进!</p>
    </body>
</html>

Employee.java

员工实体类 Employee.java 如下:

package com.example.mailsend.entity;

import lombok.Data;

@Data
public class Employee {

    private String name;

    private String posName;

    private String jobLevelName;

    private String departmentName;

    private String mail;

}

MailController.java

package com.example.mailsend.controller;

import com.example.mailsend.entity.Employee;
import com.example.mailsend.service.MailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/mail")
public class MailController {

    @Autowired
    private MailService mailService;

    @PostMapping("/send")
    public String sendMail(@RequestBody Employee employee) {
        mailService.sendMail(employee);
        return "success";
    }
}

MailService.java

package com.example.mailsend.service;

import com.example.mailsend.entity.Employee;

public interface MailService {

    void sendMail(Employee employee);

}

MailServiceImpl.java

package com.example.mailsend.service.impl;

import cn.hutool.extra.mail.MailUtil;
import com.example.mailsend.entity.Employee;
import com.example.mailsend.service.MailService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

@Slf4j
@Service
public class MailServiceImpl implements MailService {

    @Autowired
    private TemplateEngine templateEngine;

    @Override
    public void sendMail(Employee employee) {

        /**
         * Thymeleaf 模板引擎通过 Context 对象与数据进行绑定,将模板中的表达式与 Context 中的数据关联起来,
         * 在模板中可以直接引用 Context 中存储的数据,以便动态生成页面内容。
         * */
        Context context = new Context();
        context.setVariable("name", employee.getName());
        context.setVariable("posName", employee.getPosName());
        context.setVariable("jobLevelName", employee.getJobLevelName());
        context.setVariable("departmentName", employee.getDepartmentName());

        //收件人邮箱
        String to = employee.getMail();
        //邮件主题
        String subject = "欢迎入职";
        //邮件内容
        String htmlContent = templateEngine.process("mail", context);
        //邮件内容是否是 HTML 格式
        boolean isHtml = true;
        MailUtil.send(to, subject, htmlContent, isHtml);
    }
}

5.测试

启动项目后,在 Postman 中进行接口测试(注意是 POST 请求),根并在请求体中设置员工的相关信息(重点是员工邮箱):

http://localhost:8080/mail/send
{
    "name" : "Tom",
    "posName": "软件开发工程师",
    "jobLevelName" : "高级",
    "departmentName": "软件开发部",
    "mail": "xxx@qq.com"
}

运行成功后会发现员工邮箱已经受到的对应的邮件:

在这里插入图片描述

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

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

相关文章

准备笔试第21天,牛客.十字爆破牛客.比木名居的桃子牛客.chinka蜜柑01背包

目录 牛客.十字爆破 牛客.比木名居的桃子 牛客.chinka蜜柑 01背包 牛客.十字爆破 就是上下左右加上&#xff0c;但是会遇到的问题就是&#xff0c;这块并不容易去获取得分&#xff0c;如果可能要四重循环&#xff0c;遍历这一行&#xff0c;这一列&#xff0c;然后把他们存在…

解决Ubuntu报错:sudo: /etc/sudoers is world writable

1. 情况描述 /etc/sudoer这个文件的权限由440变成了777&#xff0c;由于账户下有多个子账户&#xff0c;导致子账户的sudo权限不能使用。报错如下&#xff1a; 2.解决办法 执行下面的语句就ok了 pkexec chmod 0440 /etc/sudoers 参考链接 3.总结 不要随便改系统文件的权…

模型组合、注意力机制在单步、多步、单变量、多变量预测中的应用

往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 VMD CEEMDAN 二次分解&#xff0c;Transformer-BiGRU预测模型-CSDN博客 独家原创 | 基于TCN-SENet BiGRU-GlobalAttention并行预测模型-CSDN博客 独家原创 | B…

a newer version of WinPcap,ensp安装时候winpcap软件报错

ensp安装时候winpcap软件报错 a newer version of WinPcap… 找到C盘路径下的文件Packet.dll C:\Windows\SysWOW64 修改为&#xff1a;Packet.dll.1&#xff08;后缀名随便改一下&#xff09; 再次安装&#xff0c;成功

在线PS快速抠出透明背景(纯色背景+复杂背景抠图操作)

电脑硬盘快爆了&#xff0c;没必要安装个PS了&#xff0c;网上找了几个在线的PS网站&#xff0c;还别说&#xff0c;一般的PS操作都可以满足 我们使用PS通常用的较多的是抠背景操作吧&#xff0c;接下来演示几个在在线PS网站上进行抠背景操作 一、在线PS网站 Photopea&#x…

程序员转型人工智能:从“996”困境到拥抱光明未来

前言 在这个充满挑战与机遇的时代&#xff0c;各行各业的辛酸各有不同&#xff0c;而程序员群体无疑有着自己的独特体验。他们学习着普通人难以理解的计算机语言&#xff0c;工作在“996”的高压环境中&#xff0c;还未及中年就可能面临“聪明绝顶”的尴尬。面对行业的快速更新…

树与二叉树【中】

目录 二. 二叉树2.1 二叉树的性质2.2 二叉树的存储结构2.2.1 二叉树的顺序存储&#xff08;只适合存储完全二叉树&#xff09;2.2.2 二叉树的链式存储 2.3 二叉树的遍历2.3.1 先序遍历2.3.2 中序遍历2.3.3 后序遍历2.3.4 二叉树的层序遍历2.3.5 由遍历序列构造二叉树2.3.5.1 前…

【HarmonyOS】HarmonyOS NEXT学习日记:八、组件通信

【HarmonyOS】HarmonyOS NEXT学习日记&#xff1a;八、组件通信 通过前面的学习我们基本上掌握了如何封装组件&#xff0c;但是实际使用过程中组件之间的状态需要互相之间关联通讯&#xff0c;涉及到父子组件&#xff0c;后代组件之间的相互通信。 State装饰器&#xff1a;组…

Loader QML Type

文章目录 Loader QML Type描述属性&#xff08;Properties&#xff09;active : boolasynchronous : bool&#xff08;异步&#xff09;item : objectprogress : realsource : urlsourceComponent : Componentstatus : enumeration 信号&#xff08;Signal Documentation&#…

四,搭建环境:表述层

四&#xff0c;搭建环境&#xff1a;表述层 文章目录 四&#xff0c;搭建环境&#xff1a;表述层设定 Web 工程web.xml 的配置编写配置 ContextLoaderListener配置 DispatcherServlet配置 CharacterEncodingFilter配置 HiddenHttpMethodFilter 配置 Spring MVC配置视图解析相关…

【JKI SMO】框架讲解(九)

本节内容将演示如何向SMO框架添加启动画面。 1.打开LabVIEW新建一个空白项目&#xff0c;并保存。 2.找到工具&#xff0c;打开SMO Editor。 3.新建一个SMO&#xff0c;选择SMO.UI.Splash。 4. 打开LabVIEW项目&#xff0c;可以看到项目里多了一个SystemSplash类。 打开Process…

c++11-lambda表达式,包装器function,bind

lambda表达式 lambda表达式在很多语言都是有的&#xff0c;c当然是有的&#xff0c;但是像C语言就没有这个。和很多语言相同c的lambda表达式都是为了简化代码&#xff0c;当我们需要传函数的时候我们就可以用lambda表达式写一个匿名函数。 书写格式&#xff1a; [capture-li…

【Log4j2】代码执行漏洞复现!

执行以下命令 启动命令 systemctl start dockercd vulhub/log4j/CVE-2021-44228docker-compose up -d # 访问网址 http://192.168.3.42&#xff1a;xxxx/solr/#/ 启动靶场环境并在浏览器访问!!! 先在自己搭建的DNSLOG平台上获取一个域名来监控我们注入的效果. 可以发现 /solr…

人工智能:所有144本SCI期刊都在这里(20本Top,4本On Hold)

本周投稿推荐 SCI&EI • 4区“水刊”&#xff0c;纯正刊&#xff08;来稿即录&#xff09; • CCF-B类&#xff0c;IEEE一区-Top&#xff08;3天初审&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09; 知网&#xff08;CNKI&#xff09;、谷歌学术 …

CS61C | lecture5

CS61C | lecture5 浮点数的表示 用一个小数点作为边界分隔整数部分和小数部分。 10.101 0 2 1 2 1 1 2 − 1 1 2 − 3 2.62 5 10 10.1010_{2}1\times2^11\times2^{-1}1\times2^{-3}2.625_{10} 10.10102​12112−112−32.62510​ Scientific Notation(Binary) 单精度…

.JPG图片,各种压缩率下的文件尺寸

测试结果 不改变图片幅面的情况下&#xff0c;cv2 jpg压缩算法&#xff1a; 默认quality是9550时&#xff0c;相应的图片尺寸是95的1/3 可用。25时&#xff0c;图片尺寸是1/4&#xff0c;仍可用。 2024/07/31 16:31 85,305 out_10.jpg 2024/07/31 16:31 …

不要怕,手把手带你做好小程序关键词优化

要想让小程序在众多同类中脱颖而出&#xff0c;吸引更多的用户&#xff0c;就必须进行有效的关键词优化。优化小程序关键词是提升小程序搜索排名和吸引目标用户的重要手段。以下是一些优化小程序关键词的具体步骤和策略&#xff1a; 一、关键词研究与选择 1.了解用户搜索习惯…

文件解析漏洞

IIS解析漏洞 在windows Server 2003安装iis 1.IIS6.X 1.1 目录解析 在网站下建立文件夹的名字为 .asp/.asa 的文件夹&#xff0c;其目录内的任何扩展名的文件都被IIS当作asp文件来解析并执行。 先创建一个1.asp文件夹 再创建一个1.txt 里面写 <%now()%> 2.1 畸形文件…

go test单元测试

go test Go语言中的测试依赖go test命令。 go test 命令是用来运行测试代码的工具。测试代码通常与要测试的代码放在同一个包中&#xff0c;并且测试文件通常以 _test.go 结尾。 go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内&#xff0c;所有以_tes…

中国星坤拨码开关系列:为电子设备控制的提供可靠连接

在电子设备日益复杂的今天&#xff0c;控制和设置的简便性成为了用户体验的关键。中国星坤推出的拨码开关以其直观的操作界面和高可靠性&#xff0c;正在引领电子设备控制的新纪元。本文将深入探讨星坤拨码开关的主要特性、应用场景及其在现代电子设备中的重要性。 直观的人机界…