当前位置: 首页 > news >正文

SpringBoot发送Gmail邮件

1. 登录Gmail

Gmail网址
点击右上角“小齿轮”,然后点击"查看所有设置"
在这里插入图片描述
点击“转发和 POP/IMAP”,按图中设置,然后点击保存:
在这里插入图片描述

2. 启用两步验证(https://myaccount.google.com/security)

登录上述网址,找到“安全”(Security)
点击“两步验证”
在这里插入图片描述
开启“两步验证”,小编这里已经开启了,所以显示的关闭.
在这里插入图片描述

3. 创建应用程序密码

搜索"App passwords",点击第一个在这里插入图片描述
输入程序名称,点击“创建”后会显示一个密码,该密码可以用来发送邮件.
在这里插入图片描述

4. Java程序实现(方式1)

4.1 导入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId>
</dependency>
4.2 yml配置
springmail:host: smtp.gmail.comport: 587username: xxx@gmail.compassword: xxx # 第三步的应用程序密码properties:mail:smtp:auth: truestarttls:enable: truerequired: true
4.3 代码
import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;/*** 邮件发送服务实现类*/
@Slf4j
@RequiredArgsConstructor
@Service
public class MailSendService {@Value("${spring.mail.username}")private String mailFrom;private final JavaMailSender javaMailSender;@Overridepublic void sendMailSimple(String to, String subject, String text)  {SimpleMailMessage simpleMailMessage = new SimpleMailMessage();// 发件人simpleMailMessage.setFrom(mailFrom);// 收件人simpleMailMessage.setTo(to);// 邮件主题simpleMailMessage.setSubject(subject);// 邮件内容simpleMailMessage.setText(text);javaMailSender.send(simpleMailMessage);}@Overridepublic void sendWithAttach(String to, String subject, String text, MailAttachInfoDTO ...attachInfos) {MimeMessage message = javaMailSender.createMimeMessage();try{MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(mailFrom);helper.setTo(to);helper.setSubject(subject);helper.setText(text);for(MailAttachInfoDTO attachInfo : attachInfos) {if(attachInfo == null) continue;helper.addAttachment(attachInfo.getAttachName(), attachInfo.getAttachSource());}}catch (MessagingException e) {log.warn("MailSendServiceImpl.sendWithAttach failed.", e);}javaMailSender.send(message);}
}
4.4 设置代理

在调试的时候需要梯子,否则可能访问不了Gmail的服务器:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.scheduling.annotation.EnableScheduling;@EnableScheduling
@EnableJpaAuditing
@SpringBootApplication
public class TestApplication {public static void main(String[] args) {// 设置代理地址、端口		你们调试的时候替换成自己的代理地址端口System.setProperty("http.proxyHost", "192.168.0.12");System.setProperty("http.proxyPort", "10183");SpringApplication.run(TestApplication.class, args);}}

5. Java程序实现(方式2-动态发送者)

由于我们项目中,原本已经存在发送邮件的功能,yml已经配置了其他的邮箱,而此时又来一个新需求,需要使用不同的邮箱来发送。所以这里我使用了动态设置发送人的方式。

DynamicMailSender.java

import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;import java.util.Properties;public class DynamicMailSender {public static JavaMailSender createGmailSender(String username, String password) {JavaMailSenderImpl mailSender = new JavaMailSenderImpl();mailSender.setHost("smtp.gmail.com");mailSender.setPort(587);mailSender.setUsername(username);mailSender.setPassword(password);Properties props = mailSender.getJavaMailProperties();props.put("mail.transport.protocol", "smtp");props.put("mail.smtp.auth", "true");props.put("mail.smtp.starttls.enable", "true");
//        props.put("mail.smtp.connectiontimeout", "5000");
//        props.put("mail.smtp.timeout", "5000");
//        props.put("mail.smtp.writetimeout", "5000");props.put("mail.debug", "true");return mailSender;}
}

EmailService.java

import jakarta.mail.internet.MimeMessage;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;@Slf4j
@Service
public class EmailService {/*** 发送Gmail邮件* @param from 发送者邮箱* @param password 应用程序密码* @param to 接收者邮箱* @param subject 邮件主题* @param text 邮件内容* @return 发送是否成功*/public boolean sendGmailSimple(String from, String password, String to, String subject, String text) {try {JavaMailSender mailSender = DynamicMailSender.createGmailSender(from, password);SimpleMailMessage message = new SimpleMailMessage();message.setFrom(from);message.setTo(to);message.setSubject(subject);message.setText(text);mailSender.send(message);return true;} catch (Exception e) {log.info("EmailService 发送gmail失败.", e);}return false;}/*** 发送Gmail邮件* @param fromEmail 发送者邮箱* @param fromName 发送者昵称* @param password 应用程序密码* @param to 接收者邮箱* @param subject 邮件主题* @param text 邮件内容* @return 发送是否成功*/public boolean sendGmailSimple(String fromEmail, String fromName, String password, String to, String subject, String text) {if (StringUtils.isBlank(fromName)) {return sendGmailSimple(fromEmail, password, to, subject, text);}return sendGmailSimple(fromEmail, fromName, password, to, subject, text, false);}/*** 发送Gmail邮件* @param fromEmail 发送者邮箱* @param fromName 发送者昵称* @param password 应用程序密码* @param to 接收者邮箱* @param subject 邮件主题* @param text 邮件内容* @param html 内容是否使用html格式* @return 发送是否成功*/public boolean sendGmailSimple(String fromEmail, String fromName, String password, String to, String subject, String text, boolean html) {try {JavaMailSender mailSender = DynamicMailSender.createGmailSender(fromEmail, password);MimeMessage message = mailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(fromEmail, fromName);helper.setTo(to);helper.setSubject(subject);helper.setText(text, html);mailSender.send(message);return true;} catch (Exception e) {log.info("EmailService 发送gmail失败.", e);}return false;}
}

相关文章:

SpringBoot发送Gmail邮件

1. 登录Gmail Gmail网址 点击右上角“小齿轮”&#xff0c;然后点击"查看所有设置" 点击“转发和 POP/IMAP”&#xff0c;按图中设置&#xff0c;然后点击保存&#xff1a; 2. 启用两步验证(https://myaccount.google.com/security) 登录上述网址&#xff0c;找…...

【小海实习日记】金融-现货以及合约理解

在股票和金融市场中&#xff0c;“单项持仓”和“双向持仓”是两个常见的概念&#xff0c;主要用于描述投资者在市场中的头寸及其策略。 单项持仓&#xff08;单向持仓&#xff09; 单项持仓是指投资者在市场中只持有一种方向的头寸&#xff08;多头或空头&#xff09;&#…...

html 添加元素如何能提升速度

在 HTML 中&#xff0c;如果你需要频繁地添加大量元素&#xff0c;需要确保你的操作能够以最佳性能进行。以下是一些有助于提高添加元素速度的方法&#xff1a; 综上所述&#xff0c;通过使用文档片段、innerHTML、虚拟滚动以及避免频繁的重排和重绘&#xff0c;你可以提高在 H…...

人工智能大模型的进化之路:探索如何让它们变得更“聪明”

一、引言 在人工智能&#xff08;AI&#xff09;领域&#xff0c;大模型凭借其强大的处理能力和广泛的应用前景&#xff0c;已经成为研究的热点。然而&#xff0c;尽管这些模型在多个领域展现出了惊人的能力&#xff0c;但它们仍然面临着理解力、泛化能力和适应性等方面的挑战…...

【设计模式深度剖析】【6】【结构型】【外观模式】| 以电脑开关按钮为例,并结合微服务架构的API网关加深理解

&#x1f448;️上一篇:桥接模式 | 下一篇:享元模式&#x1f449;️ 设计模式-专栏&#x1f448;️ 目 录 外观模式&#xff08;Facade Pattern&#xff09;定义英文原文直译如何理解呢&#xff1f;字面理解代码实现中的理解生活案例&#xff1a;操作多功能料理机典型案例…...

2024拼多多 最新理论+实战干货,从入门到精通全链路多角度学习-7节课

基于最新规则理论结合实际的干货 课程内容&#xff1a; 01 2024年多多防比价新规则破局理论课与实操课.mp4 02 24年多多强付费第二节课基础内功.mp4 03 24年多多强付费第三节课直通车实操 .mp4 04 24年多多强付费第一节课市场定价格段,mp4 05 24年多多自然流第一节课市场…...

在Three.js中实现模型点击高亮:整合EffectComposer与OutlinePass的终极指南

效果【后期实现鼠标点击选中轮廓后给出一个弹窗显示相应的模型信息】 标签指示线参考我的上一篇文章 引言 Three.js不仅让WebGL的3D图形编程变得简单易懂&#xff0c;还通过其强大的扩展库支持丰富的后期处理效果&#xff0c;为3D场景增添无限魅力。本篇文章将引导您深入了…...

Webrtc支持HEVC之FFMPEG支持HEVC编解码(一)

一、前言 Webrtc使用的FFMPEG(webrtc\src\third_party\ffmpeg)和官方的不太一样,使用GN编译,各个平台使用了不一样的配置文件 以Windows为例,Chrome浏览器也类似 二、修改配置文件 windows:chromium\config\Chrome\win\x64 其他平台: chromium\config\Chrome\YOUR_SYS…...

高校实验室危险化学品及重大危险源安全管理系统

高校实验室危险化学品及重大危险源安全管理的重要性&#xff1a; 保障师生安全&#xff1a;通过严格管理&#xff0c;可以有效地降低这些风险&#xff0c;确保师生在实验室内的安全。 确保实验教学质量&#xff1a;良好的危化品管理能够确保实验材料的准确性和可靠性&#xff0…...

【Godot4自学手册】第四十一节背包系统(一)UI设置

各位同学&#xff0c;好久没有更新笔记了&#xff0c;今天开始&#xff0c;我准备自学背包系统。今天先学习下UI界面设置。 一、新建场景和结点 1.新建Node2D场景&#xff0c;命名为Inventory&#xff0c;保存到Scenes目录下&#xff0c;inventory.tscn。 2.新建TextureRect子…...

JS继承的方式

目录 原型链继承构造函数继承组合继承寄生组合继承ES6 Class 继承原型链继承 原理: 通过将子类的原型(prototype)设置为父类的一个实例,使得子类实例能够沿着原型链访问到父类的属性和方法。 function Parent() {this.parentProperty...

拓展虚拟世界边界,云手机可以做到吗

虚拟世界&#xff0c;AI&#xff0c;VR等词汇是21世纪最为流行的词汇&#xff0c;在科技背后&#xff0c;这些词汇的影响变得越来越大&#xff0c;已经走进了人们的世界&#xff0c;比如之前APPLE发布的vision pro&#xff0c;使人们能够更加身临其境的体验到原生os系统&#x…...

网络的功能和实现方法简介

网络的功能&#xff1a; 计算机网络是研究怎么样在两个端用户之间提供访问通路的。所以网络的功能是为网络上的任意两个端用户之间提供访问通路。 计算机通信的特点&#xff1a; 间歇性和突发性。即时而线路中没有信息流过&#xff0c;时而突来的大量数据需要迅速传输。为此计…...

npm有哪些插件包??

1.Web开发相关 Web开发相关的npm插件包涵盖了各种工具、框架和库&#xff0c;帮助开发人员简化开发流程、提高效率并实现更好的用户体验。以下是一些常见的Web开发相关的npm插件包及其功能&#xff1a; 1. webpack&#xff1a;一个现代的JavaScript应用程序的静态模块打包工具…...

SpringBoot基础篇

1&#xff1a;parent 目的&#xff1a;减少依赖配置 开发SpringBoot程序要继承spring-boot-starter-parentspring-boot-starter-parent中定义了若干个依赖管理继承parent模块可以避免多个依赖使用相同技术出现依赖版本冲突继承parent的形式也可以采用引入依赖的i形式实现效果…...

【java11】java11新特性介绍

Java11于2018年9月25日正式发布&#xff0c;Java11是继Java8之后的第一个LTS&#xff08;Long-Term-Support&#xff09;长期支持功能版本&#xff0c;与之前的版本&#xff08;Java9和Java10&#xff09;不同&#xff0c;它提供了长达3年的维护期&#xff0c;旨在提供稳定且长…...

搜维尔科技:介绍下Manus的OptiTrack 手套,体验精致的每指触觉!

搜维尔科技&#xff1a;介绍下Manus的OptiTrack 手套&#xff0c;体验精致的每指触觉&#xff01; 搜维尔科技&#xff1a;介绍下Manus的OptiTrack 手套&#xff0c;体验精致的每指触觉&#xff01;...

Element ui 快速入门(基础知识点)

element ui官网 前言&#xff1a; 在当今时代&#xff0c;我们在编写计算机程序时&#xff0c;不仅仅是写几个增删改查的简单功能&#xff0c;为了满足广大用户对页面美观的需求&#xff0c;为了让程序员们写一些功能更简便&#xff0c;提高团队协作效率&#xff0c;所以eleme…...

[数据集][目标检测]脑肿瘤检测数据集VOC+YOLO格式9787张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;9787 标注数量(xml文件个数)&#xff1a;9787 标注数量(txt文件个数)&#xff1a;9787 标注…...

兆易创新:周期已至 触底反弹?

韩国那边来的数据啊&#xff0c;4月芯片库存同比下降33.7%&#xff0c;创近10年以来&#xff08;最&#xff09;大降幅&#xff0c;芯片出口同比增长53.9%&#xff0c;其中存储芯片出口额同比大幅增长98.7%&#xff0c;开启了涨价模式。沉寂一年多的存储芯片迎来了景气周期。 所…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...