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配置
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;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MyBatis-plus】saveBatch 性能调优和【MyBatis】的数据批量入库

总结最优的两种方法&#xff1a; 方法1&#xff1a; 使用了【MyBatis-plus】saveBatch 但是数据入库效率依旧很慢&#xff0c;那可能是是因为JDBC没有配置&#xff0c;saveBatch 批量写入并没有生效哦&#xff01;&#xff01;&#xff01; 详细配置如下&#xff1a;批量数据入…

用 HTML+CSS 实现全屏爱心滴落的动画效果,中间可显示名字

需求 在页面上显示一行白色文字,同时有爱心滴落的动画效果。 效果 HTML 和 CSS 代码 <!DOCTYPE html> <html lang="en"> <head

Kerberoasting攻击

一. Kerberoasting攻击原理 1. 原理 Kerberoasting 是域渗透中经常使用的一项技术&#xff0c;是Tim Medin 在 DerbyCon 2014 上发布的一种域口令攻击方法&#xff0c;Tim Medin 同时发布了配套的攻击工具 kerberoast。此后&#xff0c;不少研究人员对 Kerberoasting 进行了改…

揭秘Facebook:数字时代的社交奥秘

前言 在当今的数字时代&#xff0c;社交网络已经深刻改变了人们的沟通方式、信息获取方式和社交方式。其中&#xff0c;Facebook作为全球最大的社交网络平台之一&#xff0c;扮演了至关重要的角色。从一个大学生项目发展成覆盖全球的社交巨头&#xff0c;Facebook不仅见证了互…

大尺寸图像分类检测分割统一模型:Resource Efficient Perception for Vision Systems

论文题目&#xff1a;Resource Efficient Perception for Vision Systems 论文链接&#xff1a;http://arxiv.org/abs/2405.07166 代码链接&#xff1a;https://github.com/Visual-Conception-Group/Localized-Perception-Constrained-Vision-Systems 作者设计了一个统一的模…

2024年想转行WebGIS前端开发还有就业前景吗?

当然有。 无论是测绘外业、数据处理&#xff0c;还是城乡规划、遥感等等专业&#xff0c;只要你的行业就业水平一直停留在“工资低、工作条件差、对身体消耗大、没发展”的现状&#xff0c;我都劝你果断转GIS开发。 在新中地学习的学生无非就是因为上述原因&#xff0c;选择放…

Springboot 在线学习交流平台-计算机毕业设计源码46186

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;在线学习交流平台当然也不能排除在外。在线学习交流平台是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法…

乡村振兴的乡村环境综合整治:加强农村环境综合整治,改善农村人居环境,打造干净整洁的美丽乡村

目录 一、引言 二、农村环境问题的现状与挑战 &#xff08;一&#xff09;农村环境问题的现状 &#xff08;二&#xff09;农村环境问题的挑战 三、加强农村环境综合整治的必要性 &#xff08;一&#xff09;提升农民生活质量 &#xff08;二&#xff09;促进农村经济发…

AI工具:如何通过智能助手简化工作流程?

工欲善其事&#xff0c;必先利其器。 随着AI技术与各个行业或细分场景的深度融合&#xff0c;日常工作可使用的AI工具呈现出井喷式发展的趋势&#xff0c;AI工具的类别也从最初的AI文本生成、AI绘画工具&#xff0c;逐渐扩展到AI思维导图工具、AI流程图工具、AI生成PPT工具、AI…

【C/C++】——小白初步了解——内存管理

目录 1. C/C内存分布 代码区&#xff08;Code Segment&#xff09;&#xff1a; 数据区&#xff08;Data Segment&#xff09;&#xff1a; 堆区&#xff08;Heap&#xff09;&#xff1a; 栈区&#xff08;Stack&#xff09;&#xff1a; 常量区&#xff08;Constant Seg…

GE的六西格玛是怎么成功的?

六西格玛作为一种先进的质量管理方法&#xff0c;旨在通过消除缺陷、提高流程效率来降低成本、增强客户满意度。GE作为最早采用六西格玛的公司之一&#xff0c;其成功的原因首先离不开高层领导对精益六西格玛理念的坚定支持和推动。公司高层不仅亲自参与培训和项目实践&#xf…

Android电量优化,让你的手机续航更持久

节能减排&#xff0c;从我做起。一款Android应用如果非常耗电&#xff0c;是一定会被主人嫌弃的。自从Android手机的主人用了你开发的app&#xff0c;一天下来&#xff0c;也没干啥事&#xff0c;电就没了。那么他就会想尽办法找出耗电量杀手&#xff0c;当他找出后&#xff0c…

河南劳务资质申请到拿证,时间规划全攻略

河南劳务资质申请到拿证&#xff0c;时间规划全攻略如下&#xff1a; 一、前期准备阶段 材料准备 准备企业营业执照、企业章程、人员身份证明、职称或技能证书、社保证明等相关材料。特别注意准备《建筑业企业资质申请表》、建筑业企业资质申报材料承诺书、标准要求的主要设备…

藏汉翻译通app:藏文OCR文字识别提取是怎么提高你学习藏语的效率的?今天手把手教会你使用!

工作上的沟通、出门旅游的沟通、学习过程中的沟通&#xff0c;都离不开语言。而语言也是连接不同文化的桥梁。当你还是一个萌新&#xff0c;刚开始接触并使用藏语时&#xff0c;一个趁手的翻译工具&#xff0c;将帮助你快速掌握藏语这门语言。 藏汉翻译通小程序&#xff0c;不仅…

使用DLL还是通讯协议进行LabVIEW设备集成

在使用LabVIEW进行设备集成时&#xff0c;可以选择通过设备提供的DLL或直接使用通讯协议。选择方法取决于开发效率、性能、灵活性和维护成本等因素。本文将从这几个方面详细分析两种方法的优劣&#xff0c;帮助做出最佳决策。 分析角度 1. 开发效率&#xff1a; DLL&a…

EAP设备自动化系统基本功能与概念

EAP&#xff08;Equipment Automation Programming&#xff09;实现了对生产线上机台的实时监控&#xff0c;是工厂自动化不可缺少的控制系统。EAP系统与FAB中的机台紧密相关&#xff0c;系统的设计与开发必须与生产线的机台实际生产流程相一致&#xff0c;才能达到自动化控制机…

SG5032CAN晶体振荡器适用于单片机应用

单片机晶振的作用是为系统提供基本的时钟信号。通常一个系统共用一个晶振&#xff0c;便于各部分保持同步。有些通讯系统的基频和射频使用不同的晶振&#xff0c;而通过电子调整频率的方法保持同步。晶振是为单片机提供一个基本震荡源&#xff0c;也就相当于人体的心跳&#xf…

ThingsKit:智能物联网平台的创新者

在数字化浪潮的推动下&#xff0c;物联网&#xff08;IoT&#xff09;正在迅速改变我们的生活和工作方式。ThingsKit&#xff0c;一个领先的物联网平台&#xff0c;致力于通过其创新的技术和服务&#xff0c;为用户提供一个全面、灵活且易于使用的解决方案。 核心特点 设备连接…

【30天精通Prometheus:一站式监控实战指南】第19天:haproxy_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们&#x1f44b;   欢迎加入【30天精通Prometheus】专栏&#xff01;&#x1f4da; 在这里&#xff0c;我们将探索Prometheus的强大功能&#xff0c;并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。&#x1f680;   Prometheus是云原生和DevOps的…

如何充分利用代理IP扩大网络接触面

目录 前言 第一部分&#xff1a;什么是代理IP&#xff1f; 第二部分&#xff1a;如何获取代理IP&#xff1f; 1. IP质量 2. 匿名性 3. 限制 第三部分&#xff1a;如何使用代理IP&#xff1f; 第四部分&#xff1a;如何充分利用代理IP&#xff1f; 总结&#xff1a; 前…