SpringBoot整合腾讯云邮件发送服务非STMP

news2024/11/27 14:45:47

SpringBoot整合腾讯云邮箱服务

1、pom配置

<!--       腾讯云邮箱服务-->
       <dependency>
          <groupId>com.tencentcloudapi</groupId>
          <artifactId>tencentcloud-sdk-java</artifactId>
          <!-- go to https://search.maven.org/search?q=tencentcloud-sdk-java and get the latest version. -->
          <!-- 请到https://search.maven.org/search?q=tencentcloud-sdk-java查询所有版本,最新版本如下 -->
          <version>3.1.830</version>
       </dependency>

2、yaml配置

tenxun:
#  secretId和secretKey来自于:https://console.cloud.tencent.com/cam/capi
  secretId: ""
  secretKey: ""
#  使用腾讯云的接口
  httpProfile: "ses.tencentcloudapi.com"
# 使用的服务器
  sesClient: "ap-hongkong"
# 发送邮箱的一些配置就是昵称,和发送域名
  fromEmailAddress : "云图柜 <kzzby@mail.kzzby.cn>"
# 配置的模板 id 按道理说这里是自定义的,但是由于本系统只能
  templateID : 120897

3、邮箱服务的模板配置

fromEmailAddress来自发信地址 - 邮件配置 - 邮件推送 - 控制台 (tencent.com)

image-20240329153740423

templateID来自

img

模板配置:

image-20240329153914744

这里使用的模板是

image-20240329153940409

html代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>验证码模板</title>
<style>
  body, html {
    height: 100%;
    margin: 0;
    display: flex;
    justify-content: center;
    align-items: center;
    background-color: #f0f0f0;
    font-family: Arial, sans-serif;
  }

  .verify-container {
    max-width: 600px;
    padding: 20px;
    border-radius: 10px;
    background-color: #ffffff;
    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    gap: 10px;
  }

  .verify-description {
    font-size: 14px;
    color: #666;
    padding: 0 20px;
  }

  .verify-code {
    font-size: 24px;
    font-weight: bold;
    letter-spacing: 3px;
    color: #333;
    margin: 10px 0;
    padding: 10px 20px;
    border: 1px solid #ddd;
    border-radius: 5px;
  }

  .warning {
    font-size: 12px;
    color: #999;
  }
</style>
</head>
<body>

<div class="verify-container">
  <div class="verify-description">您好,您本次操作的验证码为:</div>
  <span class="verify-code">{{Verify}}</span>
  <div class="verify-description">请在5分钟内完成验证。请注意,验证码仅用于本次验证且不可重复使用。为保障账户安全,请勿泄露验证码。</div>
  <div class="warning">超时或一次性使用后验证码将失效。感谢您的理解与配合。</div>
</div>
</body>
</html>

模板等待审核通过后即可使用

需要注意的是变量要变成这样{{Verify}}

  <span class="verify-code">{{Verify}}</span>

4、设置基础配置的bean

package com.hj.imgadmin.tenEml;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@Data
public class TencentCloudConfig {

    @Value("${tenxun.secretId}")
    private String secretId;

    @Value("${tenxun.secretKey}")
    private String secretKey;

    @Value("${tenxun.httpProfile}")
    private String httpProfile;

    @Value("${tenxun.sesClient}")
    private String sesClient;

    @Value("${tenxun.fromEmailAddress}")
    private String fromEmailAddress;

    @Value("${tenxun.templateID}")
    private Long templateID;

    // 省略getter和setter方法
}

5、写服务方法

package com.hj.imgadmin.tenEml;

import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.ses.v20201002.SesClient;
import com.tencentcloudapi.ses.v20201002.models.SendEmailRequest;
import com.tencentcloudapi.ses.v20201002.models.SendEmailResponse;
import com.tencentcloudapi.ses.v20201002.models.Template;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class EmailService {
    @Resource
    private  TencentCloudConfig config;


    /**
     * 发送验证码邮箱
     * @param subject 主题
     * @param receiverEml 接收者邮箱
     * @param verifyCode 验证码
     * @param templateID 这个自主修改,若采用更自由的配置方法那么就将这个变量加入其中
     */
    public void sendVerifyCodeToEmail(String subject,String receiverEml, String verifyCode) {
        try {
            Credential cred = new Credential(config.getSecretId(), config.getSecretKey());
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint(config.getHttpProfile());
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            SesClient client = new SesClient(cred, config.getSesClient(), clientProfile);

            SendEmailRequest req = new SendEmailRequest();
            req.setFromEmailAddress(config.getFromEmailAddress());

            req.setSubject(subject);
            String[] destination = {receiverEml};
            req.setDestination(destination);

            Template template = new Template();
            template.setTemplateID(120897L); // 替换为您的模板ID
            template.setTemplateData("{\"Verify\":\""+verifyCode+"\"}");
            req.setTemplate(template);

            SendEmailResponse resp = client.SendEmail(req);
            System.out.println(resp);
        } catch (TencentCloudSDKException e) {
            System.out.println(e.toString());
        }
    }
}

6、测试

@Resource
private EmailService emailService;
@Test
void t34(){
    emailService.sendVerifyCodeToEmail("验证码","1245713658@qq.com","FcsRW");
}

控制台输出

com.tencentcloudapi.ses.v20201002.models.SendEmailResponse@4ba88ab5

邮箱显示

image-20240329162512473

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

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

相关文章

Type-C接口取电解决方案LDR6500

随着科技的不断进步&#xff0c;Type-C接口已经成为现代电子设备中不可或缺的一部分。作为一种全新的接口标准&#xff0c;Type-C以其独特的设计和强大的功能&#xff0c;在数据传输和电力传输领域展现出了巨大的潜力。特别是在取电应用方面&#xff0c;Type-C接口正逐渐改变着…

C#手术麻醉系统源码 大型医院手麻系统4大需求是什么?

C#手术麻醉系统源码 大型医院手麻系统4大需求是什么&#xff1f; 手术麻醉临床信息系统有着完善的临床业务功能&#xff0c;能够涵盖整个围术期的工作&#xff0c;能够采集、汇总、存储、处理、展 现所有的临床诊疗资料。通过该系统的实施&#xff0c;能够规范手麻科的工作流程…

vue 内嵌第三方网页

需要将另一个系统嵌套到当前网页中 一、frame 方法一就是通过html的标签 iframe 实现网页中嵌入其他网站 标签属性 属性含义src嵌套的网页地址width设置嵌套网页的宽度&#xff0c;单位为像素height设置嵌套网页的高度&#xff0c;单位为像素frameborder控制嵌套的网页是否…

计算机网络—UDP协议详解:特性、应用

​ &#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;マリンブルーの庭園—ずっと真夜中でいいのに。 0:34━━━━━━️&#x1f49f;──────── 3:34 &#x1f504; ◀…

路径规划——搜索算法详解(二):Floyd算法详解与MATLAB代码

上次总结了Dijkstra算法的案例原理与代码&#xff0c;本文分享第二种比较基础且易懂的方法为Floyd算法&#xff0c;该算法可以有效正确地处理有向图的最短路径问题&#xff0c;与Dijkstra算法不同&#xff0c;Floyd算法是一种动态规划算法&#xff0c;对于稠密图效果显著。原理…

【独立开发前线】Vol.26 【独立开发产品】吉光卡片-让你的文字变得酷炫起来

今天给大家分享一下 独立开发前线 社区成员张小吉 的作品 吉光卡片&#xff1b; 这是一款iOS的APP&#xff0c;下载&#xff1a;吉光卡片&#xff0c;主要功能是帮你制作酷炫的文字卡片&#xff0c;用精美的卡片让你的文字生动起来。 展示效果如下&#xff1a; 你可以用它制作…

中值定理错题本

1 2 一般要构造函数 3 4 5 6 ------------------------------ 7 8 9 10

virtualbox 设置虚拟机 centos 网络

在VirtualBox中为运行CentOS系统的虚拟机配置网络连接&#xff0c;您通常可以选择以下几种网络模式之一&#xff0c;以满足不同的网络需求&#xff1a; NAT (Network Address Translation): 功能&#xff1a;允许虚拟机通过宿主机的网络连接访问互联网&#xff0c;同时也可以从…

C语言: 指针讲解

为什么需要指针? &#xff08;1&#xff09;指针的使用使得不同区域的代码可以轻易的共享内存数据。当然你也可以通过数据的复制达到相同的效果&#xff0c;但是这样往往效率不太好&#xff0c;因为诸如结构体等大型数据&#xff0c;占用的字节数多&#xff0c;复制很消耗性能…

WebGIS 之 Openlayer

1.导入第三方依赖 <link rel"stylesheet" href"https://lib.baomitu.com/ol3/4.6.5/ol.css"> <script src"https://lib.baomitu.com/ol3/4.6.5/ol.js"></script>2.初始化地图 初始化地图new ol.Map({}) 参数target:制定初始化…

[串联] MySQL 存储原理 B+树

InnoDB 是一种兼顾高可靠性和高性能的通用存储引擎&#xff0c;在 MySQL 5.5 之后&#xff0c;InnoDB 是默认的 MySQL 存储引擎。 InnoDB 对每张表在磁盘中的存储以 xxx.ibd 后缀结尾&#xff0c;innoDB 引擎的每张表都会对应这样一个表空间文件&#xff0c;用来存储该表的表结…

【尚硅谷周阳--JUC并发编程】【第十四章--ReentrantLock、ReentrantReadWriteLock、StampedLock讲解】

【尚硅谷周阳--JUC并发编程】【第十四章--ReentrantLock、ReentrantReadWriteLock、StampedLock讲解】 一、面试题二、简单聊聊ReentrantReadWriteLock1、是什么?1.1、读写锁说明1.2、演变1.3、读写锁意义和特点 2、特点2.1、优点2.2、code演示2.3、结论2.4、从写锁->读锁&…

【Week-Y3】修改yolov5s的backbone的第4层和第6层中C3的理论循环次数

修改backbone中C3的循环次数 一、yolov5s.yaml文件解析二、训练三、总结 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 &#x1f4d5;本次任务&#xff1a;将yolov5s网络模型中第4层的C…

信息系统项目管理师——第12章项目质量管理

本章节内容属于10大管理知识领域中的重点&#xff0c;选择、案例、论文都会考&#xff0c;而且是高频考点&#xff0c;需要我们重点学习。 选择题&#xff0c;稳定考3分左右&#xff0c;新教材基本考课本原话&#xff0c;这个分不能丢。 案例题&#xff0c;本期备考重点&#x…

Elasticsearch 和 Kibana 8.13:简化 kNN 和改进查询并行化

作者&#xff1a;Gilad Gal, Tyler Perkins, Srikanth Manvi, Aris Papadopoulos, Trevor Blackford 在 8.13 版本中&#xff0c;Elastic 引入了向量搜索的重大增强&#xff0c;并将 Cohere 嵌入集成到其统一 inference API 中。这些更新简化了将大型语言模型&#xff08;LLM&a…

leetcode二叉树相关题目

目录 二叉树的建立整数数组转二叉树Object数组转二叉树 二叉树的遍历leetcode94.二叉树的中序遍历leetcode144.二叉树的前序遍历 二叉树的建立 整数数组转二叉树 下面只是一个简单的示例&#xff0c;没考虑某个子树为空的情况。把{1, 2, 3, 21, 22, 31, 32} 转变为一个二叉树…

C++类继承继承5——构造函数与拷贝控制

构造函数与拷贝控制 和其他类一样&#xff0c;位于继承体系中的类也需要控制当其对象执行一系列操作时发生什么样的行为&#xff0c;这些操作包括创建、拷贝、移动、赋值和销毁。 如果一个类(基类或派生类)没有定义拷贝控制操作&#xff0c;则编译器将为它合成一个版本。当然…

【感悟《剑指offer》典型编程题的极练之路】02字符串篇!

​ 个人主页&#xff1a;秋风起&#xff0c;再归来~ 文章所属专栏&#xff1a;《剑指offer》典型编程题的极练之路 ​​​​​​ 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c…

(学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

springboot通过threadLocal+参数解析器实现保存当前用户登录信息

首先先介绍一下threadLocal ThreadLocal 线程局部变量&#xff0c;创建一个线程变量后&#xff0c;针对这个变量可以让每个线程拥有自己的变量副本&#xff0c;每个线程是访问的自己的副本&#xff0c;与其他线程的相互独立。 大致知道threadLocal就可以了&#xff0c;然后我…