Spring Boot 整合網易163郵箱發送郵件實現找回密碼功能

在開發用戶系統時,發送郵件是一項常見需求,例如用戶忘記密碼時,通過郵箱發送驗證碼來驗證身份并重置密碼。本文將結合 Spring Boot 和 163 郵箱,演示如何實現郵件發送功能。


一、前提條件

普通用戶的 163 郵箱可以在 Spring Boot 項目中用于發送郵件,但需要完成以下配置:

1. 登錄 163 郵箱

使用普通賬號登錄 163 郵箱官網。

2. 開啟 SMTP 服務

  1. 點擊郵箱右上角「設置」→「POP3/SMTP/IMAP」;
  2. 在 SMTP 服務選項中勾選「開啟 SMTP 服務」;
  3. 按提示完成手機驗證(163 郵箱要求綁定手機號才能開啟該服務)。

在這里插入圖片描述

在這里插入圖片描述

3. 獲取授權碼

  1. 開啟 SMTP 后,頁面會提示生成授權碼;
  2. 按照提示生成 16 位授權碼(例如 abcdefghijklmnop),保存好;
  3. 該授權碼將在 Spring Boot 郵件配置中替代郵箱密碼。

?? 注意:普通 163 郵箱每天發送量有限,適合開發和測試用途。


二、Spring Boot 郵件依賴

pom.xml 中添加 Spring Boot 郵件依賴:

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

三、Spring Boot 郵件配置

application.ymlapplication.properties 中添加 163 郵箱 SMTP 配置:

spring:
# 配置郵箱服務器,賬號密碼等mail:host: smtp.163.comusername: 1888888888@163.compassword: agagtfgsdhdcode:overtime: 5

其中 password 是生成的授權碼,而非郵箱密碼。


四、郵件發送服務實現

創建 MailService 接口:

public interface MailService {Result<String> getCode(String username, String mailAddress);
}

創建 MailServiceImpl 實現類:

@Service
public class MailServiceImpl implements MailService {@Autowiredprivate JavaMailSender mailSender;@Autowiredprivate StringRedisTemplate redisTemplate;@Autowiredprivate UserMapper userMapper;@Value("${spring.mail.username}")private String mailUserName;@Value("${spring.mail.code.overtime}")private Integer overtime; // 驗證碼過期時間(分鐘)@Overridepublic Result<String> getCode(String username, String mailAddress) {// 校驗用戶名和郵箱if (StringUtils.isBlank(username)) return Result.fail("賬號不能為空!");if (StringUtils.isBlank(mailAddress)) return Result.fail("郵箱不能為空!");User user = userMapper.selectUserByUsername(username);if (user == null) return Result.fail("賬號不存在!");if (!user.getEmail().equals(mailAddress)) return Result.fail("輸入郵箱和預留郵箱不一致!");// 生成驗證碼String verifyCode = redisTemplate.opsForValue().get("MAIL_CODE_" + username);if (verifyCode == null) {verifyCode = String.valueOf(new Random().nextInt(899999) + 100000);}redisTemplate.opsForValue().set("MAIL_CODE_" + username, verifyCode, overtime, TimeUnit.MINUTES);// 構建郵件內容String content = "<html><body>"+ "您好<br/>"+ "您的驗證碼是:" + verifyCode + "<br/>"+ "在" + overtime + "分鐘內有效,請盡快使用。<br/>"+ "若非本人操作,請忽略此郵件。"+ "</body></html>";try {MimeMessage message = mailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(mailUserName);helper.setTo(mailAddress);helper.setSubject("找回密碼驗證碼");helper.setText(content, true);mailSender.send(message);} catch (MessagingException e) {e.printStackTrace();return Result.fail("郵件發送失敗!");}return Result.ok("驗證碼已發送至郵箱:" + mailAddress);}
}

五、郵件控制器

@RestController
@RequestMapping("/mail")
public class MailController {@Autowiredprivate MailService mailService;@GetMapping("/getCode")@ApiOperation("獲取重置密碼驗證碼")public Result<String> getCode(String username, String mailAddress){return mailService.getCode(username, mailAddress);}
}

六、Redis 驗證碼存儲

  • 使用 StringRedisTemplate 存儲驗證碼:

    • Key: MAIL_CODE_用戶名
    • Value: 驗證碼
    • TTL: spring.mail.code.overtime 分鐘
  • 發送郵件后驗證碼會被存入 Redis,用戶提交時進行比對。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/919928.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/919928.shtml
英文地址,請注明出處:http://en.pswp.cn/news/919928.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何在mac玩windows游戲?3個工具推薦,不用換電腦!

Mac電腦雖然很流暢&#xff0c;但它也存在局限性&#xff0c;其中一點游戲玩家應該深有體會&#xff0c;那就是無法直接玩Windows專屬游戲&#xff0c;只能對著琳瑯滿目的游戲望眼欲穿。別急&#xff0c;我有辦法讓你在mac玩windows游戲&#xff0c;下面就來分享我的經驗。一、…

自回歸(Auto-Regressive, AR),自回歸圖像生成過程

根據論文中“**T2I Generation via Next-Token Prediction**”一節&#xff0c;自回歸&#xff08;Auto-Regressive, AR&#xff09;文本到圖像&#xff08;T2I&#xff09;模型的圖像生成過程可分為三個主要步驟&#xff0c;其原理和損失函數如下&#xff1a;---### &#x1f…

在mysql中,modify ,change ,rename to的作用是什么

在 MySQL 中&#xff0c;MODIFY、CHANGE 和 RENAME TO 都是 ALTER TABLE 語句的一部分&#xff0c;用于修改表的結構&#xff0c;但它們的作用和使用場景有所不同。1. MODIFY作用&#xff1a;用于修改表中現有列的定義&#xff0c;但不能修改列名。你可以使用 MODIFY 來更改列的…

【JVM】JVM的內存結構是怎樣的?

JVM的內存結構是Java程序運行時內存管理的核心&#xff0c;不同區域有明確的職責。 一、整體劃分 包括兩大部分&#xff0c;分為線程私有區域(隨線程創建/銷毀&#xff0c;無需垃圾回收)和線程共享區域(所有線程共用&#xff0c;需要垃圾回收管理)。 線程私有區域&#xff1a;程…

青少年軟件編程(python五級)等級考試試卷-客觀題(2023年12月)

更多內容和歷年真題請查看網站&#xff1a;【試卷中心 -----> 電子學會 ----> 機器人技術 ----> 五級】 網站鏈接 青少年軟件編程歷年真題模擬題實時更新 青少年軟件編程&#xff08;python五級&#xff09;等級考試試卷-客觀題&#xff08;2023年12月&#xff0…

網絡編程-創建TCP協議服務器

int socket(int domain, int type, int protocol);頭文件&#xff1a; #include <sys/socket.h>#include <netinet/in.h> #include <netinet/ip.h>int skt_tcpfd;int domain;skt_tcpfdsocket(AF_INET,SOCK_STREAM,0);int bind(int sockfd, const struct soc…

ruoyi框架角色分配用戶

分配用戶&#xff0c;不要將當前正在登錄的用戶綁定。否則&#xff0c;在加入當前用戶之后&#xff0c;取消或者添加其他用戶時會被注銷當前登錄。

Java Stream常見函數與應用案例

1. Java Stream核心概念與基礎函數 1.1 Stream API的設計哲學與核心特性 Java Stream API的設計哲學源于函數式編程范式&#xff0c;其核心特性體現在數據處理模式的轉變上。與傳統集合操作相比&#xff0c;Stream API采用聲明式編程風格&#xff0c;支持鏈式調用&#xff0c;顯…

【Canvas與徽章】中國制造金色玻璃光徽章

【成圖】【代碼】<!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>中國制造金色玻璃光徽章 Draft1</title><style type"tex…

終結系統裸奔:Debian老舊版本安全加固終極指南

核心警示:Debian 8與10已結束官方支持,暴露于0day漏洞風險中。本文提供的加固方案僅為遷移前的臨時防護措施,非長久之計。 一、老舊Debian系統的致命隱患 支持狀態: Debian 8(Jessie):2018年終止安全更新 Debian 10(Buster):2024年7月結束主流支持 風險清單: 無補…

Ape.Volo項目源碼學習(1:源碼下載及運行)

Ape.Volo項目是基于 .Net 8 、SqlSugar、Vue2.x、RBAC、前后端分離開箱則用的中后臺快速開發框架&#xff0c;其使用Async/Await異步編程&#xff0c;支持CodeFirst模式、RabbitMQ/RedisMQ消息隊列、CORS 跨域配置、數據庫操作&#xff08;讀寫分離、多庫、分表&#xff09;、支…

2-4.Python 編碼基礎 - 流程控制(判斷語句、循環語句、break 語句與 continue 語句)

一、判斷語句 1、if 語句 &#xff08;1&#xff09;基本格式 if 【判斷條件】:【滿足條件時執行的代碼塊】&#xff08;2&#xff09;演示 number 10if number > 0:print("這個數是正數")# 輸出結果這個數是正數2、if - else 語句 &#xff08;1&#xff09;基本…

大模型自我進化框架SE-Agent:開啟軟件工程自動化新時代

一、引言&#xff1a;當大模型學會“自我進化” 在軟件開發領域&#xff0c;傳統模式下人類工程師面對復雜任務時&#xff0c;往往需要經歷反復調試、多輪迭代才能產出高質量代碼。而隨著大語言模型&#xff08;LLM&#xff09;的興起&#xff0c;一種名為**SE-Agent&#xff…

UE官方文檔學習 C++ TAarry 查詢(四)多種查詢方式

一.IndexofByKey 返回索引通過值&#xff0c;返回來查找鍵。二IndexOfByPredicate通過定義二元謂詞&#xff0c;來判定是否有符合謂詞判定的元素。符合條件True的&#xff0c;才返回Index。這里所謂Lamda,函數就是 把函數當作參數輸入&#xff0c;里面的參數值傳遞前加個[]。這…

根據Wireshark捕獲數據包時間和長度繪制電腦發射信號波形

下一期&#xff1a; 根據Wireshark捕獲數據包時間和長度繪制路由器發送給電腦數據的信號波形-CSDN博客 一、Wireshark采集數據 數據格式&#xff1a; 在我的另一篇博客中詳細介紹了怎么導出數據&#xff1a; Wireshark導出數據包時間和長度-CSDN博客 通過MATLAB加載數據&a…

Suno API 接入指南:快速上手與高效集成

隨著 AI 技術的發展&#xff0c;音樂生成已經逐漸成為開發者和創作者探索的新方向。Suno API 提供了一套簡潔的接口&#xff0c;讓我們能夠通過代碼快速生成音樂、歌詞&#xff0c;甚至旋律。本文將帶你從零開始&#xff0c;完成 Suno API 的接入與調用&#xff0c;并分享一些高…

React Hooks原理深潛:從「黑魔法」到「可觀測」的蛻變之旅

文章目錄【技術棧深潛計劃】React Hooks原理深潛&#xff1a;從「黑魔法」到「可觀測」的蛻變之旅一、引言&#xff1a;為什么我們需要“深潛”Hooks&#xff1f;二、基石&#xff1a;沒有JavaScript閉包&#xff0c;就沒有Hooks2.1 閉包的精簡回顧2.2 Hooks與閉包的關聯三、核…

MySql知識梳理之DDL語句

例子&#xff1a;為emp表增加一個新的字段”昵稱”為nickname&#xff0c;類型為varchar(20)alter table emp add nickname varchar(20) comment 昵稱;例子&#xff1a;將emp表的nickname字段修改為username&#xff0c;類型為varchar(30)ALTER TABLE emp CHANGE nickname us…

Games 101 第四講 Transformation Cont(視圖變換和投影變換)

三維變換 三種變換 下面分別是放縮&#xff0c;旋轉&#xff0c;平移在旋轉當中&#xff0c;繞著y軸旋轉矩陣的順序不一樣&#xff0c;因為繞著y軸轉在右手坐標系中 &#xff0c;z是第一軸&#xff0c;x是第二軸&#xff0c;而負號會加在第一軸上&#xff0c;因此負號在下面。 …

rust語言 (1.88) egui (0.32.1) 學習筆記(逐行注釋)(一)基本代碼

Cargo.toml [dependencies] eframe "0.32.1" egui "0.32.1"?啟動函數一&#xff1a;run_simple_native 簡化版入口函數&#xff0c;適用于快速原型開發僅需提供應用標題和 UI 渲染閉包即可運行典型使用場景&#xff1a;單面板工具、簡單演示程序 // 導入…