热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBoot最新版集成邮件发送功能大全

SpringBoot最新版集成邮件发送功能大全前言一、开启SMTP服务并获取授权码二、创建SpringBoot项目1、配置邮箱基本信息:2、简单邮件发送:


Spring Boot最新版集成邮件发送功能大全

  • 前言
    • 一、开启SMTP服务并获取授权码
    • 二、创建Spring Boot项目
      • 1、配置邮箱基本信息:
      • 2、简单邮件发送:
      • 3、发送带附件的邮件:
      • 5、使用thymeleaf模板发送邮件:
      • 最后




前言


SMTP是一种提供可靠且有效的电子邮件传输的协议,SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。


邮件发送功能相信很多小伙伴都有接触过,这也是实际开发中最常见的需求,比如用户注册,找回密码,下订单等等,这里小编就不一一阐述了,接下来小编带你一步步实现它,由于Spring Boot更新迭代速度贼快,我们就来使用目前官方正式发布的最新版本2.3.2对邮件发送进行实战。


一、开启SMTP服务并获取授权码

SpringBoot发送QQ邮件必须先打开QQ邮箱的SMTP功能,默认是关闭的,打开SMTP功能,就能获取申请授权码,这里我给大家演示我们本次项目的QQ邮箱获取授权码的方式。

1、首先登录QQ邮箱PC版,点击上方的设置按钮
在这里插入图片描述
2、切换到账户选项卡中
在这里插入图片描述
3、找到开启POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务的选项
在这里插入图片描述
将第一个开启,这里我已经开启了,就不用再开启了,点击POP3/SMTP开启相关功能服务,开启过程中需要手机号验证,根据步骤执行即可。开启成功后会获得一个授权码,保存好即可,后面编码会用到。


二、创建Spring Boot项目

快速创建Spring Boot项目,引入邮件发送的依赖支持,在Spring Boot中自动配置了邮件相关功能,对于开发者来说只需要引入相关依赖就可以了,无配置集成,这就是Spring Boot强大的地方。
在这里插入图片描述
pom.xml依赖如下:

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

1、配置邮箱基本信息&#xff1a;

项目创建成功&#xff0c;此时我们需要在application.yml中配置邮箱信息&#xff0c;如果小伙伴们喜欢properties方式配置文件&#xff0c;后面文章末尾也会给大家提供&#xff0c;我个人推荐yml的语法配置方式&#xff0c;看你心情吧。

server:port: 8081
spring:mail:host: smtp.qq.comport: 587username: 1973984292&#64;qq.compassword: xxxxxxdefault-encoding: UTF-8properties:mail:smtp:socketFactoryClass: javax.net.ssl.SSLSocketFactorydebug: true

这里小编给大家一个表&#xff0c;解释一下每个配置参数的意思&#xff0c;当然还有很多配置列表&#xff0c;我这里列了主要配置信息&#xff1a;


配置含义
hostSMTP服务器地址
portSMTP服务器端口
username邮箱账号带上后缀
password申请的授权码
default-encoding默认邮件编码
socketFactoryClass开启ssl加密&#xff0c;保证安全连接
debug开启DEBUG模式&#xff0c;打印邮件发送过程日志&#xff0c;方便排除错误

2、简单邮件发送&#xff1a;

为了测试方便&#xff0c;我们在Spring Boot提供的测试包中给大家直接演示简单的邮件发送&#xff0c;首先我们先看一张图&#xff0c;可能很多小伙伴不常发送邮箱&#xff0c;我们看看实际操作是怎么发送邮箱的。
在这里插入图片描述
看图说话&#xff0c;小伙伴会想到什么呢&#xff1f;收件人、抄送人、密送人、主题、正文&#xff08;多种文本格式&#xff0c;以及文件&#xff09; 有这么多选项&#xff1f;NB&#xff0c;那我们就用编写一个测试类代码实操一波吧。

&#64;SpringBootTest
class EmailApplicationTests {&#64;Autowiredprivate JavaMailSender javaMailSender;&#64;Testpublic void sendEmail() {// new一个邮件对象SimpleMailMessage mailMessage &#61; new SimpleMailMessage();// 设置主题mailMessage.setSubject("测试邮件");// 设置发送人mailMessage.setFrom("1973984292&#64;qq.com");// 设置接收人&#xff0c;可以有多个mailMessage.setTo("1973984292&#64;qq.com");// 设置抄送人&#xff0c;可以有多个mailMessage.setCc("1973984292&#64;qq.com");// 设置隐秘抄送人&#xff0c;可以有多个mailMessage.setBcc("1973984292&#64;qq.com");// 设置发送日期mailMessage.setSentDate(new Date());// 设置邮件正文mailMessage.setText("您的验证码为8081");// 调用邮件发送接口方法javaMailSender.send(mailMessage);}}

Spring提供了非常好用的JavaMailSender接口实现邮件发送,在Spring Boot中也提供了相应的自动化配置&#xff0c;大大简化开发无配置集成&#xff0c;一个字‘爽’。

我们看看效果&#xff1a;
在这里插入图片描述
Nice&#xff0c;这就成功发送邮件了&#xff0c;So easy&#xff0c;I’m blind? 不&#xff0c;你没瞎&#xff0c;就是如此简单&#xff0c;Spring Boot这波集成&#xff0c;666&#xff0c;这样我们就实现了一个简单的邮件发送功能。

心累&#xff0c;又到了装B环节&#xff0c;粗俗&#xff0c;是时候展示真正的技术了&#xff1a;打开org.springframework.boot.autoconfigure.mail这个类&#xff0c;邮件相关配置都在这里面
在这里插入图片描述
找到mail包点击进去&#xff1a;
在这里插入图片描述
我们会发现该类里面导入了这样一个配置&#xff08;MailSenderPropertiesConfiguration.class&#xff09;&#xff1a;

再点击该配置类进去&#xff0c;揭开神秘面纱&#xff1a;
在这里插入图片描述
可以发现该类给我们提供了邮件发送功能的相关bean容器&#xff0c;刚刚通过 &#64;Autowired注入该bean实现了简单的邮件功能&#xff0c;是不是很熟悉啊。

&#64;Autowiredprivate JavaMailSender javaMailSender;

一层一层剥开你的心&#xff0c;继续我们点击进入JavaMailSender.class&#xff1a;
在这里插入图片描述
可以发现JavaMailSender.class它是一个接口&#xff0c;并且继承了MailSender接口&#xff0c;是的MailSender还是一个接口&#xff0c;我们残忍的再次点击进去了解一下
在这里插入图片描述
这就是接口的继承&#xff08;类是单继承&#xff0c;接口是多继承哦&#xff09;&#xff0c;接口继承是为了在不修改接口的情况下&#xff0c;扩展接口的功能&#xff0c;提高代码的重用率&#xff0c;减低耦合性&#xff0c;可以和面试官吹NB了&#xff0c;不枉费我一层层揭开它的真面目&#xff0c;原来确实是个美女&#xff0c;哈哈哈。


3、发送带附件的邮件&#xff1a;

刚刚我们只是单纯的测试字符串文本的邮件发送&#xff0c;来点高级货&#xff0c;ok&#xff0c;安排上&#xff0c;我们来写写带附件的邮件&#xff08;图片或者office文档&#xff09;。

&#64;Test
public void sendEmailFile() throws MessagingException {// 获取复杂的邮件对象MimeMessage mailMessage &#61; javaMailSender.createMimeMessage();// 邮件配置辅助工具类MimeMessageHelper helper &#61; new MimeMessageHelper(mailMessage,true);helper.setSubject("测试邮件带附件发送");helper.setFrom("1973984292&#64;qq.com");helper.setTo("1973984292&#64;qq.com");helper.setCc("1973984292&#64;qq.com");helper.setBcc("1973984292&#64;qq.com");helper.setSentDate(new Date());helper.setText("您的验证码为8082");// 设置附件helper.addAttachment("1.jpg",new File("D://imgtest//1.jpg"));// 调用邮件发送接口方法javaMailSender.send(mailMessage);
}

通过addAttachment方法&#xff0c;即可放入我们的附件&#xff0c;如此必须看一波源码啊&#xff0c;原谅我手贱&#xff0c;实在忍不住&#xff0c;难得不会&#xff0c;简单的我们还是看得懂的&#xff0c;哈哈。
在这里插入图片描述
测试效果&#xff1a;
在这里插入图片描述
此时的邮件对象不是普通发送的SimpleMailMessage&#xff0c;而是通过javaMailSender.createMimeMessage()获取复杂的邮件对象&#xff0c;然后再利用MimeMessageHelper对邮件进行辅助配置&#xff0c;实现邮件带附件的发送功能&#xff0c;这里是通过addAttachment方法来添加附件&#xff0c;我们可以看看源码&#xff1a;
在这里插入图片描述
File file 看到没&#xff0c;这不就是创建一个新 File 实例嘛&#xff0c;在内存中创建File文件映射对象,通过addAttachment添加附件。MimeMessageHelper类中addAttachment方法源码&#xff0c;给了明确的使用解释&#xff0c;第一个参数为文件名称&#xff0c;第二个参数为源文件&#xff0c;并且文件不能为null。

说明&#xff1a;org.springframework.mail.javamail.MimeMessageHelper是处理JavaMail邮件时比较顺手组件之一&#xff0c;它可以让你摆脱繁复的JavaMail API。

4、发送带图片类资源的邮件&#xff1a;

图片类资源和附件的区别就是&#xff1a;图片类资源是在邮件正文中&#xff0c;打开就能看到。

&#64;Test
public void sendEmailResFile() throws MessagingException {// 获取复杂的邮件对象MimeMessage mailMessage &#61; javaMailSender.createMimeMessage();// 邮件配置辅助工具类MimeMessageHelper helper &#61; new MimeMessageHelper(mailMessage,true);helper.setSubject("测试邮件带附件发送");helper.setFrom("1973984292&#64;qq.com");helper.setTo("1973984292&#64;qq.com");helper.setCc("1973984292&#64;qq.com");helper.setBcc("1973984292&#64;qq.com");helper.setSentDate(new Date());helper.setText("

测试邮件&#xff0c;包含两种图片&#xff0c;分别如下&#xff1a;

第一张图片&#xff1a;

第二张图片&#xff1a;

",true);// 设置图片类资源helper.addInline("it1",new FileSystemResource(new File("D://imgtest//it01.jpg")));helper.addInline("it2",new FileSystemResource(new File("D://imgtest//it02.jpg")));// 调用邮件发送接口方法javaMailSender.send(mailMessage);
}

测试效果&#xff1a;
在这里插入图片描述
这里是通过setText设置附件类型&#xff0c;我们可以看看该方法的源码&#xff1a;
在这里插入图片描述
其中text参数是一个HTML文本&#xff0c;第二个参数&#xff0c;是个boolean类型&#xff0c;参数名称为html&#xff0c;我们可以知道当他为true的时候&#xff0c;会给我们解析成html&#xff0c;相信小伙伴们都使用过富文本编辑器&#xff0c;通过存储html&#xff0c;设置不同的标签&#xff0c;就可以把内容渲染成一个网页&#xff0c;显示不同的标题、字体样式等。

我们要发送邮件的时候&#xff0c;是不是一个一个拼接HTML字符串呢&#xff1f;

NO&#xff0c;NO&#xff0c;NO&#xff0c;太麻烦了&#xff0c;而且容易写错&#xff0c;能粘贴绝对不写&#xff08;哈哈&#xff09;&#xff0c;那么我们再来一种实在的方式&#xff0c;使用邮件模板进行发送邮箱&#xff0c;那么我们文章开头引入thymeleaf模板就可以派上用场了&#xff0c;前方高能&#xff0c;看我如何扭转乾坤 … … …


5、使用thymeleaf模板发送邮件&#xff1a;

首先得引入thymeleaf模板引擎依赖&#xff0c;thymeleaf用过吧&#xff01;不管我事&#xff08;呵呵&#xff09;&#xff0c;废话不多说&#xff0c;再贴一遍&#xff1a;

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

创建thymeleaf邮件模板&#xff1a;


<html lang&#61;"en" xmlns:th&#61;"http://www.thymeleaf.org">
<head><meta charset&#61;"UTF-8"><title>Titletitle>
head>
<body><div style&#61;"font-size: 25px;text-align: center;color: #000;font-weight: bold;"><span>入职通知书span>div><div style&#61;"text-align: center;padding: 10px;"><img th:src&#61;"${avatar}"/>div><div style&#61;"color: #0060f1;text-decoration: underline;"><span th:text&#61;"${username}">span>div><p style&#61;"padding: 20px;">您好&#xff0c;很高兴通知您&#xff0c;通过对您两轮面试表现的综合评估&#xff0c;恭喜您已成功被我司录取&#xff01;p><div style&#61;"margin: 20px;">您的职位是&#xff1a;<span style&#61;"color: blue;text-decoration: underline;" th:text&#61;"${position}">span>div><p style&#61;"color: #0e0d0e">欢迎您加入我们的团队&#xff0c;希望大家一起努力&#xff0c;实现梦想~p><a style&#61;"color: blue;" th:text&#61;"公司地址&#43;&#39;&#xff1a;&#39;&#43;${link}" th:href&#61;"${link}">a>
body>
html>

Thymeleaf提供了TemplateEngine来对模板进行渲染&#xff0c;通过Context构造模板中变量需要的值&#xff0c;具体代码如下&#xff1a;

&#64;Test
public void sendEmailTemplate() throws MessagingException {// 获取复杂的邮件对象MimeMessage mailMessage &#61; javaMailSender.createMimeMessage();// 邮件配置辅助工具类MimeMessageHelper helper &#61; new MimeMessageHelper(mailMessage,true);helper.setSubject("thymeleaf邮件发送");helper.setFrom("1973984292&#64;qq.com");helper.setTo("1973984292&#64;qq.com");helper.setCc("1973984292&#64;qq.com");helper.setBcc("1973984292&#64;qq.com");helper.setSentDate(new Date());// 利用 Thymeleaf 模板构建 html 文本Context context &#61; new Context();context.setVariable("username","DT小白");context.setVariable("position","Java开发工程师");context.setVariable("avatar","http://ydfblog.cn/build/img/ydflogo4-f9dc927993e6e370c62e92b331fd5fc3.jpeg?s=#34;);context.setVariable("link","http://ydfblog.cn");// 指定模板路径String emailText &#61; templateEngine.process("email.html",context);helper.setText(emailText ,true);// 调用邮件发送接口方法javaMailSender.send(mailMessage);
}

1、context.setVariable(),第一个参数是String,第二个是Object类型。第一个参数就对应thymeleaf模板上面相同名字的参数。

2、templateEngine.process()将指定路径的html文件转换成String类型返回。

测试效果&#xff1a;
在这里插入图片描述
干货差不多了&#xff0c;这里附上所有代码的gitee码云地址&#xff0c;有需要的自取&#xff1a;

https://gitee.com/summerydf/emailitems.git


最后


如果你觉得DT_小白文章写的还不错&#xff0c;请微信搜索并关注「 Java云社 」微信公众号&#xff0c;和DT_小白一起学习Java、分布式、微服务、大数据技术&#xff0c;并且「 Java云社 」收集了大量的大厂面试题目集&#xff0c;等你来挖掘&#xff0c;为了提升自己的能力&#xff0c;实现技术能力的飞跃&#xff0c;每天定时更新超硬核技术干货&#xff0c;我在「 Java云社 」等您的加入&#xff0c;让我们共同学习吧&#xff01;


在这里插入图片描述


推荐阅读
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • POCOCLibraies属于功能广泛、轻量级别的开源框架库,它拥有媲美Boost库的功能以及较小的体积广泛应用在物联网平台、工业自动化等领域。POCOCLibrai ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • 标题: ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • 项目运行环境配置及可行性分析
    本文介绍了项目运行环境配置的要求,包括Jdk1.8、Tomcat7.0、Mysql、HBuilderX等工具的使用。同时对项目的技术可行性、操作可行性、经济可行性、时间可行性和法律可行性进行了分析。通过对数据库的设计和功能模块的设计,确保系统的完整性和安全性。在系统登录、系统功能模块、管理员功能模块等方面进行了详细的介绍和展示。最后提供了JAVA毕设帮助、指导、源码分享和调试部署的服务。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
author-avatar
jason---zhu
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有