SMTP是一种提供可靠且有效的电子邮件传输的协议,SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。
邮件发送功能相信很多小伙伴都有接触过,这也是实际开发中最常见的需求,比如用户注册,找回密码,下订单等等,这里小编就不一一阐述了,接下来小编带你一步步实现它,由于Spring Boot更新迭代速度贼快,我们就来使用目前官方正式发布的最新版本2.3.2对邮件发送进行实战。
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强大的地方。
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>
项目创建成功&#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;
配置 | 含义 |
---|---|
host | SMTP服务器地址 |
port | SMTP服务器端口 |
username | 邮箱账号带上后缀 |
password | 申请的授权码 |
default-encoding | 默认邮件编码 |
socketFactoryClass | 开启ssl加密&#xff0c;保证安全连接 |
debug | 开启DEBUG模式&#xff0c;打印邮件发送过程日志&#xff0c;方便排除错误 |
为了测试方便&#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;哈哈哈。
刚刚我们只是单纯的测试字符串文本的邮件发送&#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;打开就能看到。
测试邮件&#xff0c;包含两种图片&#xff0c;分别如下&#xff1a; 第一张图片&#xff1a; 第二张图片&#xff1a;&#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("
}
测试效果&#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;看我如何扭转乾坤 … … …
首先得引入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;