springboot使用163發送自定義html格式的郵件

springboot使用163發送html格式的郵件

效果:
在這里插入圖片描述

下面直接開始教學

注冊郵箱,生成授權碼
獲取163郵箱的授權碼,可以按照以下步驟操作:

  1. 登錄163郵箱
    打開瀏覽器,訪問 163郵箱登錄頁面。
    使用你的郵箱賬號和密碼登錄。
  2. 進入郵箱設置
    登錄后,點擊頁面右上角的“設置”圖標(通常是一個齒輪圖標)。
    在菜單中選擇“POP3/SMTP/IMAP”選項。
  3. 開啟SMTP服務
    在“POP3/SMTP/IMAP”設置頁面中,找到“SMTP服務”選項。
    點擊“開啟”按鈕,啟用SMTP服務。
  4. 獲取授權碼
    開啟SMTP服務后,系統會提示你設置授權碼。
    按照頁面提示,使用綁定的手機號發送短信驗證。
    驗證成功后,系統會生成一個授權碼(通常是一串字母和數字的組合)。
  5. 保存授權碼
    將生成的授權碼記錄下來,并妥善保存。
    在配置文件中,將password字段的值替換為這個授權碼。

然后添加到application.yml中:
在這里插入圖片描述
添加到application.yml

#郵箱基本配置mail:protocol: smtp#配置smtp服務主機地址host: smtp.163.com#發送者郵箱username: killer5482021@163.com#配置密碼,注意不是真正的密碼,而是剛剛申請到的授權碼password: ZFBFPLNWJIUKJUWS#端口號465或587port: 465#默認的郵件編碼為UTF-8default-encoding: UTF-8#其他參數properties:mail:smtp:auth: truessl:#本地測試,先放開sslenable: truerequired: true#開啟debug模式,這樣郵件發送過程的日志會在控制臺打印出來,方便排查錯誤debug: true

pom.xml中添加用到的依賴

		<!-- 郵件 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency><!-- Java模板引擎 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>

pom.xml中需要添加如下:

<build>
<resources><resource><directory>src/main/resources</directory><filtering>true</filtering><includes><include>**/*.properties</include><include>**/*.xml</include><include>**/*.html</include> <!-- 確保 HTML 文件被包含 --><include>**/*.css</include> <!-- 如果需要,包含 CSS 文件 --><include>**/*.js</include>  <!-- 如果需要,包含 JS 文件 --><include>**/*.yml</include></includes></resource><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource></resources></build>

Controller:

@ApiOperation(value = "測試郵件發送")@GetMapping("/test-mail")public boolean mail(){MailRequest request = new MailRequest();request.setSubject("【信飛科技】,你好!測試郵件。");request.setSendFrom("xxxxxxxx82021@163.com");request.setSendTo("858399075@qq.com");// 構建HTML內容,包含超鏈接String link = "http://***.***.1.52/mrrraadmin";String htmlContent = mailService.buildHtmlContent(link);request.setText(htmlContent);return mailService.sendHtmlMail(request);}

MaiService:

package com.geofly.mrrra.lottery.service;import com.geofly.mrrra.lottery.entity.MailRequest;/*** @Description: 郵件發送接口** @Author yanghaoxing* @Date 2025/3/19 16:44*/public interface MailService {/*** @Description: 發送html郵件** @Param:  [mailRequest]* @Return: boolean* @Author yanghaoxing* @Date 2025/3/19 18:29*/boolean sendHtmlMail(MailRequest mailRequest);/*** @Description: 獲取郵件模板** @Param:  [link]* @Return: java.lang.String* @Author yanghaoxing* @Date 2025/3/19 18:40*/String buildHtmlContent(String link);
}

MailServiceImpl:

package com.geofly.mrrra.lottery.service.impl;import cn.hutool.core.lang.Assert;
import com.geofly.mrrra.lottery.entity.MailRequest;
import com.geofly.mrrra.lottery.service.MailService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;/*** 郵件接口實現類** @Auther: yanghaoxing* @Date: 2025/3/19*/
@Service("mailServiceImpl")
public class MailServiceImpl implements MailService {private static final Logger log = LoggerFactory.getLogger(MailServiceImpl.class);@Autowiredprivate JavaMailSender javaMailSender;@Autowiredprivate TemplateEngine templateEngine;public void checkMail(MailRequest mailRequest) {Assert.notNull(mailRequest,"郵件請求不能為空");Assert.notNull(mailRequest.getSendTo(), "郵件收件人不能為空");Assert.notNull(mailRequest.getSubject(), "郵件主題不能為空");Assert.notNull(mailRequest.getText(), "郵件收件人不能為空");}@Overridepublic boolean sendHtmlMail(MailRequest mailRequest) {checkMail(mailRequest); // 檢查郵件參數是否合法MimeMessage message = javaMailSender.createMimeMessage();try {MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");helper.setTo(mailRequest.getSendTo());helper.setFrom(mailRequest.getSendFrom());helper.setSubject(mailRequest.getSubject());// 設置郵件內容為HTML格式helper.setText(mailRequest.getText(), true); // 第二個參數為true,表示內容為HTMLjavaMailSender.send(message);return true;} catch (MessagingException e) {log.error("郵件發送失敗", e);e.printStackTrace();}return false;}@Overridepublic String buildHtmlContent(String link) {Context context = new Context();context.setVariable("link", link);return templateEngine.process("email-template", context); // email-template是模板文件名}
}

創建Thymeleaf模板
在src/main/resources/templates目錄下創建一個Thymeleaf模板文件,例如email-template.html:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>【信飛科技】重要通知!</title>
</head>
<body><h1>這是一封測試郵件</h1><p>點擊以下鏈接訪問示例網站:</p><a th:href="${link}">點擊進行確認</a>
</body>
</html>

然后調用測試接口就會收到郵件,撒花!!
在這里插入圖片描述

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

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

相關文章

【Kafka】深入了解Kafka

集群的成員關系 Kafka使用Zookeeper維護集群的成員信息。 每一個broker都有一個唯一的標識&#xff0c;這個標識可以在配置文件中指定&#xff0c;也可以自動生成。當broker在啟動時通過創建Zookeeper的臨時節點把自己的ID注冊到Zookeeper中。broker、控制器和其他一些動態系…

C#使用SnsPictureBox.dll繪制點,線段、圓、折線、多邊形、測量尺等多種圖形。

CSDN下載地址&#xff1a;https://download.csdn.net/download/sns1991sns/87726867 gitee下載地址:https://gitee.com/linsns/SnsPictrueBox 支持2種繪制方式&#xff1a;響應式和等待式。 一、使用響應式繪制圖形 1、在窗口構造函數里添加繪制圖形的完成響應函數 public…

Hugging Face預訓練GPT微調ChatGPT(微調入門!新手友好!)

Hugging Face預訓練GPT微調ChatGPT&#xff08;微調入門&#xff01;新手友好&#xff01;&#xff09; 在實戰中&#xff0c;?多數情況下都不需要從0開始訓練模型&#xff0c;?是使?“??”或者其他研究者開源的已經訓練好的?模型。 在各種?模型開源庫中&#xff0c;最…

Redis BitMap 用戶簽到

Redis Bitmap Bitmap&#xff08;位圖&#xff09;是 Redis 提供的一種用于處理二進制位&#xff08;bit&#xff09;的特殊數據結構&#xff0c;它基于 String 類型&#xff0c;每個 bit 代表一個布爾值&#xff08;0 或 1&#xff09;&#xff0c;可以用于存儲大規模的二值狀…

Spring Boot 3 新特性實戰:從理論到實踐

引言 Spring Boot 自發布以來&#xff0c;憑借其簡潔的配置和強大的功能&#xff0c;迅速成為 Java 開發者的首選框架。隨著 Spring Boot 3 的發布&#xff0c;開發者們迎來了更多令人興奮的新特性。本文將深入探討 Spring Boot 3 的新特性&#xff0c;并通過實戰示例展示如何…

Nodejs使用redis

框架&#xff1a;koa&#xff0c;通過koa-generator創建 redis: 本地搭建&#xff0c;使用默認帳號&#xff0c;安裝說明地址以及默認啟動設置&#xff1a;https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/ 中間件&#x…

調研報告:Hadoop 3.x Ozone 全景解析

Ozone 是 Hadoop 的分布式對象存儲系統,具有易擴展和冗余存儲的特點。 Ozone 不僅能存儲數十億個不同大小的對象,還支持在容器化環境(比如 Kubernetes)中運行。 Apache Spark、Hive 和 YARN 等應用無需任何修改即可使用 Ozone。Ozone 提供了 Java API、S3 接口和命令行接口…

AI學習——卷積神經網絡(CNN)入門

作為人類&#xff0c;我們天生擅長“看”東西&#xff1a;一眼就能認出貓狗、分辨紅綠燈、讀懂朋友的表情……但計算機的“眼睛”最初是一片空白。直到卷積神經網絡&#xff08;CNN&#xff09;?的出現&#xff0c;計算機才真正開始理解圖像。今天&#xff0c;我們就用最通俗的…

除自身以外數組的乘積——面試經典150題(力扣)

題目 給你一個整數數組 nums&#xff0c;返回 數組 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘積 。 題目數據 保證 數組 nums之中任意元素的全部前綴元素和后綴的乘積都在 32 位 整數范圍內。 請 不要使用除法&#xff0c;且在 O(n) 時…

?算法OJ?二叉樹的前序遍歷【樹的遍歷】(C++實現)Binary Tree Preorder Traversal

?算法OJ?二叉樹的中序遍歷【樹的遍歷】&#xff08;C實現&#xff09;Binary Tree Inorder Traversal Given the root of a binary tree, return the preorder traversal of its nodes’ values. Example 1: Input: root [1,null,2,3] Output: [1,2,3]Explanation: Exam…

計算機二級MS之Excel

聲明&#xff1a;跟著大貓和小黑學習隨便記下一些筆記供大家參考&#xff0c;二級考試之前將持續更新&#xff0c;希望大家二級都能輕輕松松過啦&#xff0c;過了二級的大神也可以在評論區留言給點建議&#xff0c;感謝大家&#xff01;&#xff01; 文章目錄 考題難點&#x…

【Linux】VMware Workstation Pro 17 安裝教程

目錄 安裝 VMware Workstation Pro 17 一、CDS Repository 獲取安裝包 二、網盤獲取安裝包 三、Broadcom官方獲取安裝包 后續安裝過程沒啥特殊要求 安裝 VMware Workstation Pro 17 目前VMware Workstation pro 17已經對個人用戶免費開放使用。 Broadcom官網地址&#x…

如何在云端平臺上建立 30,000 名用戶的網頁 MMO游戲環境-2 (服務器)

接續上一篇「如何在云端平臺上建立 30,000 名用戶的網頁 MMO游戲環境」&#xff0c;接下來討論模擬連結上的問題。 最初計劃使用35臺伺服器來完成這個實驗&#xff0c;希望能夠有大量的用戶連接&#xff0c;以驗證真實的連接狀況。然而&#xff0c;我們高估了這方面&#xff0c…

架構設計的靈魂交響曲:系統設計各維度的深度解析與實戰指南

引言: 系統設計的背景與重要性 在快速變化的技術環境中&#xff0c;數字化轉型成為企業生存與發展的核心驅動力。系統設計能力不僅是技術團隊的核心競爭力&#xff0c;也是推動業務創新和提升整體效率的關鍵因素。根據Gartner的研究&#xff0c;超過70%的數字化轉型項目未能實…

C語言指針(詳細總結)

目錄 1.初始C指針 幾個重要的概念&#xff1a; 指針的加減 &與* 二級指針 2.指針與數組 指針數組 數組指針變量 一維數組與二維數組傳參的本質 ?編輯?編輯 ?編輯 3.指針與函數 函數指針數組 4.指針與結構體 5.野指針以及常見的內存管理錯誤 常見的內存錯…

JAVA學習-練習試用Java實現“編寫一個Spark程序,結合Elasticsearch對大數據進行全文搜索和篩選“

問題&#xff1a; 編寫一個Spark程序&#xff0c;結合Elasticsearch對大數據進行全文搜索和篩選。 解答思路&#xff1a; 為了編寫一個結合Apache Spark和Elasticsearch進行全文搜索和篩選的程序&#xff0c;你需要按照以下步驟操作&#xff1a; 1. 設置Spark環境&#xff1a;…

VLLM專題(二十一)—分布式推理與服務

1. 如何決定分布式推理策略? 在深入探討分布式推理和服務之前,我們首先需要明確何時使用分布式推理以及可用的策略是什么。常見的做法如下: 單 GPU(無需分布式推理): 如果你的模型可以放入單個 GPU 中,那么你可能不需要使用分布式推理。直接使用單個 GPU 運行推理即可。…

torcharrow gflags版本問題

問題描述 其實仍然是很簡單的編譯問題&#xff0c;但是又弄了一整個下午加幾乎整個晚上&#xff0c;進度緩慢&#xff0c;又吸取了教訓&#xff0c;因而還是來記錄一下。 在試圖使用torcharrow進行推薦系統模擬的時候&#xff0c;撰寫的python程序報錯&#xff1a;ERROR: flag…

介紹一下TiDB、RocksDb、levelDB、LSM 樹、SSTable。

LSM 樹&#xff08;Log-Structured Merge-Tree&#xff09; 核心原理&#xff1a;通過將隨機寫轉換為順序寫優化寫入性能&#xff0c;適用于寫密集型場景。數據首先寫入內存中的 MemTable&#xff08;有序結構&#xff0c;如跳表&#xff09;&#xff0c;當達到閾值后轉為 Imm…

ESP32 BLE 初步學習筆記

前言 藍牙作為一個龐大的知識體系&#xff0c;其學習和運用對于初學者來說顯得有些復雜且凌亂。我整理了這段時間的學習筆記&#xff0c;涵蓋了協議棧、工作流程、參數等內容。在實際應用中&#xff0c;我們主要使用 GAP 和 GATT&#xff0c;協議棧中的其他部分只需了解即可。…