SpringBoot发送Gmail邮件

news2024/11/25 13:22:50

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配置
spring
  mail:
    host: smtp.gmail.com
    port: 587
    username: xxx@gmail.com
    password: xxx # 第三步的应用程序密码
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            required: 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;

	@Override
	public 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);
	}

	@Override
	public 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;
    }
}

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

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

相关文章

msvcp100.dll丢失怎样修复?几种快速有效修复msvcp100.dll丢失的方法

在使用电脑时是不是遇到过关于msvcp100.dll丢失文件丢失的情况&#xff1f;出现这样的情况有什么办法可以将丢失的msvcp100.dll文件快速恢复&#xff1f;今天的这篇文章就将教大家几种能够有效的解决msvcp100.dll丢失问题的方法。 方法一&#xff1a;重启电脑 重启电脑是一种简…

jmeter多用户登录并退出教程

有时候为了模拟更真实的场景&#xff0c;在项目中需要多用户登录并退出操作&#xff0c;大致参考如下 多用户登录前面已经实现&#xff1a;参考博文 多用户登录并退出jmx文件&#xff1a;百度网盘 提取码&#xff1a;0000 一、多用户退出操作 添加一个setUp线程组&#xff0…

基恩士激光 速度 曝光等关系

一、基恩士 CtrlN 二、速度设置 计算扫描速度 曝光时间&#xff1a; 1:1 相机点间隔是0.025 &#xff0c;我们要扫描的图像也是1&#xff1a;1的话&#xff0c;速度可以为 采样周期我们设定为3K&#xff0c;假如我们的7000行就够了 速度V0.025&#xff08;线间隔&#xff0…

YOLOv10全网最新创新点改进系列:YOLOv10改进加入新型高效的多尺度注意力(EMA)模块保留每个通道的信息并减少计算成本!助力v10检测性能遥遥领先!

YOLOv10全网最新创新点改进系列&#xff1a;YOLOv10改进加入新型高效的多尺度注意力&#xff08;EMA&#xff09;模块保留每个通道的信息并减少计算成本&#xff01;助力v10检测性能遥遥领先&#xff01; 所有改进代码均经过实验测试跑通&#xff01; 此项目不低于30种改进&am…

hadoop(1)--hdfs部署(亲测可用)

一、准备&#xff1a; 1、三台集群部署&#xff0c;配置hosts #cat /etc/hosts 192.168.46.128 node1 #nameNode dataNode secondaryNameNode 192.168.46.129 node2 #datanode 192.168.46.130 node3 #datanode说明&#xff1a; NameNode: 主节点管理者 DataNode&…

解决el-dialog里嵌入el-tabs卡死的问题

文章目录 1. 解决 el-dialog 里嵌入 el-tabs 卡死的问题 1. 解决 el-dialog 里嵌入 el-tabs 卡死的问题 今天发现在element ui里面使用 el-dialog 会导致页面卡死&#xff0c;本来我心想这么简单的一个弹窗&#xff0c;怎么会卡死解决思路&#xff1a;以为是项目的问题&#x…

展台搭建时打造完美的展示空间

1、确定主题和目标 在展台设计搭建之前&#xff0c;需要明确展示的主题和目标&#xff0c;包括展示内容、目标观众、品牌形象等。这有助于为展台设计搭建提供明确的方向和指导。 2、精细化设计 展台设计需要精细化&#xff0c;注重每一个细节的把控。包括展台结构、色彩搭配、材…

4. MySQL 约束

文章目录 【 1. 主键约束 PRIMARY KEY 】1.1 在创建表时设置主键约束设置单字段主键在创建表时设置联合主键 1.2 在修改表时添加主键约束1.3 删除主键约束1.4 主键自增长 AUTO_INCREMENT指定自增字段初始值自增字段不连续 【 2. 外键约束 FOREIGN KEY 】2.1 在创建表时设置外键…

探索无限可能:API平台引领数据驱动的新时代

在数字化浪潮的推动下&#xff0c;数据已成为推动商业创新和增长的核心动力。然而&#xff0c;数据的获取、整合和应用并非易事&#xff0c;需要跨越技术、安全和效率等多重挑战。幸运的是&#xff0c;API&#xff08;应用程序接口&#xff09;平台的出现&#xff0c;为我们打开…

使用 Django Model 构建强大的数据库模型

文章目录 创建一个简单的 Django Model迁移数据库使用 Django Shell 操作模型Django Admin结论 在 Django 中&#xff0c;Model 是构建数据库模型的基础。它允许开发人员定义数据的结构&#xff0c;并提供了方便的方式来与数据库进行交互。本文将介绍如何使用 Django Model 来创…

LangChain之Agent代理(上)

LangChain之Agent代理 Agent代理概述分类 Agent的基本使用准备操作定义工具1.Tavily在线搜索2.创建检索器3.得到工具列表 初始化大模型创建Agent运行Agent添加记忆 Agent代理 概述 Agent代理的核心思想是使用语言模型来选择要采取的一系列动作。在链中&#xff0c;动作序列是硬…

IP地址在字符串形式、数字形式和byte数组中的转换

IP地址 ip地址,我们以ipv4为例,字符串形式为:“192.168.0.1”,可以转换成dword类型的数据: on key a {char ipv4AddrStr[16] = "192.168.0.1";//16进制:c0.a8.0.1dword ipv4AddrNum;ipv4AddrNum = ipGetAddressAsNumber(ipv4AddrStr);write("ipv4AddrNu…

Linus Torvalds把控着linux内核开发审核,他去世之后linux内核会怎样?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; Linus Torvalds 是 Linux…

【算法】模拟算法——替换所有的问号(easy)

题解&#xff1a;替换所有的问好(模拟算法) 目录 1.题目2.题解3.参考代码4.总结 1.题目 题目链接&#xff1a;LINK 2.题解 纯模拟。从前往后遍历整个字符串&#xff0c;找到问号之后&#xff0c;就⽤ a ~ z 的每⼀个字符去尝试替换即可。 3.参考代码 class Solution { pu…

下载安装nvm,使用nvm管理node.js版本

目录 一、下载安装nvm&#xff08;windows&#xff09; 二、使用nvm管理node.js版本 &#xff08;1&#xff09;nvm命令行 &#xff08;2&#xff09; 使用nvm管理node.js版本 ①查看nvm版本 ②显示活动的node.js版本 ③列出可供下载的node.js版本 ④安装node.js指定版本 ⑤列出…

36个JavaScript特效教程,学完即精通

课程目录 &#x1f9d1;‍&#x1f4bb;36个JavaScript特效教程&#xff0c;学完即精通 &#x1f381;【更多好课】资源仓库&#xff0c;海量资源&#xff0c;无偿分享√ 本站所有素材均来自于互联网&#xff0c;版权属原著所有&#xff0c;如有需要请购买正版。如有侵权&…

【测试】linux快捷指令工具cxtool

简介 登录linux时,我们经常需要重复输入一些指令. 这个工具可以把这些指令预置,需要的时候鼠标一点,会自动按预置的字符敲击键盘,敲击出指令. 下载地址 https://download.csdn.net/download/bandaoyu/89379371 使用方法 1,编辑配置文件&#xff0c;自定义自己的快捷指令。 2…

2024年最具性价比宠物空气净化器推荐!小米、希喂、安德迈真实测评

一款理想的宠物空气净化器应该具备去除浮毛和异味等基本功能&#xff0c;但要找到一款既满足个人需求、性能出色且性价比高的产品&#xff0c;这需要一定的选择技巧。 遗憾的是&#xff0c;许多人在购买时由于对相关术语的不熟悉或缺乏挑选经验&#xff0c;可能会买到不适合自…

资深开发推荐的IDEA 插件

开发如虎添翼 工欲善其事&#xff0c;必先利其器。想要提升编程开发效率&#xff0c;必须选择一款顺手的开发工具&#xff0c;插件不在多&#xff0c;而在精&#xff0c;作为从业10年的程序员&#xff0c;我目前用到这十几个插件&#xff0c;在平时开发&#xff0c;代码review…

一文简述「低代码」到底是什么?

低代码是什么&#xff1f;低代码原理是什么&#xff1f;低代码的组成要素有哪些&#xff1f;低代码应用场景有哪些&#xff1f;低代码的优势是什么&#xff1f;低代码开发平台与传统开发方法的区别&#xff1f;本文是本人和团队从业十年来的经验结晶&#xff0c;全文3000&#…