Spring Boot 邮件发送(五种类型的邮件)

邮件协议:

SMTP、POP3、IMAP

SMTP 协议全称为 Simple Mail Transfer Protocol,译作简单邮件传输协议,它定义了邮件客户端软件与 SMTP 服务器之间,以及 SMTP 服务器与 SMTP 服务器之间的通信规则。
用户先将邮件投递到腾讯的 SMTP 服务器这个过程就使用了 SMTP 协议,然后腾讯的 SMTP 服务器将邮件投递到网易的 SMTP 服务器这个过程也依然使用了 SMTP 协议,SMTP 服务器就是用来收邮件。

  • SMTP 是一个基于 TCP/IP 的应用层协议
  • SMTP 服务器默认监听的端口号为 25
  • 可以通过 Socket 发送一封邮件

而POP3 协议全称为 Post Office Protocol ,译作邮局协议,它定义了邮件客户端与 POP3 服务器之间的通信规则
当邮件到达网易的 SMTP 服务器之后, 用户需要登录服务器查看邮件,这个时候就该协议就用上了:邮件服务商都会为每一个用户提供专门的邮件存储空间,SMTP 服务器收到邮件之后,就将邮件保存到相应用户的邮件存储空间中,如果用户要读取邮件,就需要通过邮件服务商的 POP3 邮件服务器来完成。

IMAP 协议,这个协议是对 POP3 协议的扩展,功能更强,作用类似

一、申请授权码

首先我们需要先登录 QQ 邮箱网页版,点击上方的设置按钮:
在这里插入图片描述
然后点击账户选项卡:
在这里插入图片描述
在账户选项卡中找到开启POP3/SMTP选项,如下:
在这里插入图片描述
点击开启,开启相关功能,开启过程需要手机号码验证,按照步骤操作即可
开启成功之后,即可获取一个授权码,将该号码保存好,一会使用。

二、创建项目

引入邮件发送依赖:
在这里插入图片描述

<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>

application.properties 中配置邮箱的基本信息:

# 配置 SMTP 服务器地址
spring.mail.host=smtp.qq.com# SMTP 服务器的端口
spring.mail.port=587
# 配置邮箱用户名
spring.mail.username=1510161612@qq.com
# 配置密码,注意,不是真正的密码,而是刚刚申请到的授权码
spring.mail.password=ubknfzhjkhrbbabe# 默认的邮件编码
spring.mail.default-encoding=UTF-8
# 配饰 SSL 加密工厂
spring.mail.properties.mail.smtp.socketFactoryClass=javax.net.ssl.SSLSocketFactory
# 开启 DEBUG 模式,这样,邮件发送过程的日志会在控制台打印出来,方便排查错误
spring.mail.properties.mail.debug=true

开启 DEBUG 模式,这样,邮件发送过程的日志会在控制台打印出来,方便排查错误
如果不知道 smtp 服务器的端口或者地址的的话,可以参考 腾讯的邮箱文档

做完这些之后,Spring Boot 就会自动帮我们配置好邮件发送类,相关的配置在 org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration 类中,部分源码如下:

@Configuration
@ConditionalOnClass({ MimeMessage.class, MimeType.class, MailSender.class })
@ConditionalOnMissingBean(MailSender.class)
@Conditional(MailSenderCondition.class)
@EnableConfigurationProperties(MailProperties.class)
@Import({ MailSenderJndiConfiguration.class, MailSenderPropertiesConfiguration.class })
public class MailSenderAutoConfiguration {
}

导入了另外一个配置 MailSenderPropertiesConfiguration 类,这个类中,提供了邮件发送相关的工具类:

@Configuration
@ConditionalOnProperty(prefix = "spring.mail", name = "host")
class MailSenderPropertiesConfiguration {privatefinal MailProperties properties;MailSenderPropertiesConfiguration(MailProperties properties) {this.properties = properties;}/**创建了一个 JavaMailSenderImpl 的实例JavaMailSenderImpl 是 JavaMailSender 的一个实现使用 JavaMailSenderImpl 来完成邮件的发送工作*/@Bean@ConditionalOnMissingBeanpublic JavaMailSenderImpl mailSender() {JavaMailSenderImpl sender = new JavaMailSenderImpl();applyProperties(sender);return sender;}
}

三、发送邮件

①、发送简单邮件(简单邮件就是指邮件内容是一个普通的文本文档)

@Autowired
JavaMailSender javaMailSender;@Test
public void sendSimpleMail() {//构建一个邮件对象SimpleMailMessage message = new SimpleMailMessage();//设置邮件主题message.setSubject("这是一封测试邮件");//设置邮件发送者message.setFrom("1510161612@qq.com");//设置邮件接收者,可以有多个接收者message.setTo("25xxxxx755@qq.com");//设置邮件抄送人,可以有多个抄送人message.setCc("37xxxxx37@qq.com");//设置隐秘抄送人,可以有多个message.setBcc("14xxxxx098@qq.com");//设置邮件发送日期message.setSentDate(new Date());//设置邮件的正文message.setText("这是测试邮件的正文");//发送邮件javaMailSender.send(message);
}

最后执行该方法,就可以实现邮件的发送,发送效果图如下:
在这里插入图片描述

②、发送带附件的邮件

附件可以是图片,也可以是普通文件

@Test
public void sendAttachFileMail() throws MessagingException {//获取一个复杂邮件对象MimeMessage mimeMessage = javaMailSender.createMimeMessage();//MimeMessageHelper 是一个邮件配置的辅助工具类,创建时候的 true 表示构建一个 multipart message 类型的邮件MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);helper.setSubject("这是一封测试邮件");helper.setFrom("1510161612@qq.com");helper.setTo("25xxxxx755@qq.com");helper.setCc("37xxxxx37@qq.com");helper.setBcc("14xxxxx098@qq.com");helper.setSentDate(new Date());helper.setText("这是测试邮件的正文");//通过 addAttachment 方法来添加一个附件helper.addAttachment("javaboy.jpg",new File("C:\\Users\\sang\\Downloads\\javaboy.png"));javaMailSender.send(mimeMessage);
}

在这里插入图片描述

③、发送带图片资源的邮件

图片资源是放在邮件正文中的,即一打开邮件,就能看到图片。但是一般来说,不建议使用这种方式,一些公司会对邮件内容的大小有限制(因为这种方式是将图片一起发送的)

@Test
public void sendImgResMail() throws MessagingException {MimeMessage mimeMessage = javaMailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);helper.setSubject("这是一封测试邮件");helper.setFrom("1510161612@qq.com");helper.setTo("25xxxxx755@qq.com");helper.setCc("37xxxxx37@qq.com");helper.setBcc("14xxxxx098@qq.com");helper.setSentDate(new Date());//是一个 HTML 文本,里边涉及到的图片资源先用一个占位符占着,setText 方法的第二个参数 true 表示第一个参数是一个 HTML 文本helper.setText("<p>hello 大家好,这是一封测试邮件,这封邮件包含两种图片,分别如下</p><p>第一张图片:</p><img src='cid:p01'/><p>第二张图片:</p><img src='cid:p02'/>",true);//添加图片资源helper.addInline("p01",new FileSystemResource(new File("C:\\Users\\sang\\Downloads\\javaboy.png")));helper.addInline("p02",new FileSystemResource(new File("C:\\Users\\sang\\Downloads\\javaboy2.png")));javaMailSender.send(mimeMessage);
}

在这里插入图片描述

④、使用Freemarker作邮件模板

先引入依赖:

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

然后在 resources/templates 目录下创建一个 mail.ftl 作为邮件发送模板:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<p>hello 欢迎加入 xxx 大家庭,您的入职信息如下:</p>
<table border="1"><tr><td>姓名</td><td>${username}</td></tr><tr><td>工号</td><td>${num}</td></tr><tr><td>薪水</td><td>${salary}</td></tr>
</table>
<div style="color: #ff1a0e">一起努力创造辉煌</div>
</body>
</html>

接下来,将邮件模板渲染成 HTML ,然后发送即可。

@Test
public void sendFreemarkerMail() throws MessagingException, IOException, TemplateException {MimeMessage mimeMessage = javaMailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);helper.setSubject("这是一封测试邮件");helper.setFrom("1510161612@qq.com");helper.setTo("25xxxxx755@qq.com");helper.setCc("37xxxxx37@qq.com");helper.setBcc("14xxxxx098@qq.com");helper.setSentDate(new Date());//构建 Freemarker 的基本配置//直接 new Configuration 来重新配置 Freemarker 的,所以 Freemarker 默认的配置这里不生效Configuration configuration = new Configuration(Configuration.VERSION_2_3_0);// 配置模板位置ClassLoader loader = MailApplication.class.getClassLoader();configuration.setClassLoaderForTemplateLoading(loader, "templates");//加载模板Template template = configuration.getTemplate("mail.ftl");User user = new User();user.setUsername("javaboy");user.setNum(1);user.setSalary((double) 99999);StringWriter out = new StringWriter();//模板渲染,渲染的结果将被保存到 out 中 ,将out 中的 html 字符串发送即可template.process(user, out);helper.setText(out.toString(),true);javaMailSender.send(mimeMessage);
}

在这里插入图片描述

⑤、使用Thymeleaf作邮件模板

Thymeleaf 的自动化配置提供了一个 TemplateEngine,通过 TemplateEngine 可以方便的将 Thymeleaf 模板渲染为 HTML ,同时,Thymeleaf 的自动化配置在这里是继续有效的 。

引入依赖

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

然后,创建 Thymeleaf 邮件模板:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<p>hello 欢迎加入 xxx 大家庭,您的入职信息如下:</p>
<table border="1"><tr><td>姓名</td><td th:text="${username}"></td></tr><tr><td>工号</td><td th:text="${num}"></td></tr><tr><td>薪水</td><td th:text="${salary}"></td></tr>
</table>
<div style="color: #ff1a0e">一起努力创造辉煌</div>
</body>
</html>

接下来发送邮件:

@Autowired
TemplateEngine templateEngine;@Test
public void sendThymeleafMail() throws MessagingException {MimeMessage mimeMessage = javaMailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);helper.setSubject("这是一封测试邮件");helper.setFrom("1510161612@qq.com");helper.setTo("25xxxxx755@qq.com");helper.setCc("37xxxxx37@qq.com");helper.setBcc("14xxxxx098@qq.com");helper.setSentDate(new Date());Context context = new Context();context.setVariable("username", "javaboy");context.setVariable("num","000001");context.setVariable("salary", "99999");String process = templateEngine.process("mail.html", context);helper.setText(process,true);javaMailSender.send(mimeMessage);
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构-栈的实现

1.栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&…

灵活运用Vue 3中的setup函数—深入解析Composition API

新建项目&#xff0c;项目主入口为App.vue&#xff08;主组件&#xff09;&#xff0c;新建child.vue&#xff08;子组件&#xff09;。 1.1 setup 执行 时机问题 1.在主组件里引入子组件和ref&#xff1a; import {ref} from vue import child from ./components/child.vue2…

vue3 iconify 图标几种使用 并加载本地 svg 图标

iconify iconify 与 iconify/vue 使用 下载 pnpm add iconify/vue -D使用 import { Icon } from "iconify/vue";<template><Icon icon"mdi-light:home" style"color: red; font-size: 43px" /><Icon icon"mdi:home-flo…

ROSNS3(一)

https://github.com/malintha/rosns3 第一步&#xff1a;clone和构建rosns3客户端 第二步&#xff1a;运行 最详细的ubuntu 安装 docker教程 - 知乎 1. unable to find source space /home/muta/src 解决方法&#xff1a; 将副将将碰到的bug&#xff0c;解决方法_#include &…

线程安全

文章目录 观察线程安全问题线程安全的概念出现线程安全问题的原因共享数据原子性总结 synchronized - 锁synchronized 特性互斥可重入 synchronized 的使用修饰普通方法修饰静态方法修饰代码块 解决线程安全问题两个线程两把锁哲学家就餐问题 - N个线程M把锁解决策略 死锁成因总…

2011-2022年地级市互联网普及率数据

2011-2022年地级市互联网普及率数据 1、时间&#xff1a;2011-2022年 2、指标&#xff1a;行政区划代码、年份、地区、互联网宽带接入用户_千户、常住人口数_千人、户籍人口数_千人、每百人互联网宽带用户_常住人口口径、每百人互联网宽带用户_户籍人口口径 3、来源&#xf…

触发设备离线

业务场景 业务开发过程中&#xff0c;我们经常会需要判断远程终端是否在线&#xff0c;当终端离线的时候我们需要发送消息告知相应的系统&#xff0c; 环形队列 1.创建一个index从0到30的环形队列&#xff08;本质是个数组&#xff09; 2.环上每一个slot是一个Set&#xf…

【MySQL】多表查询、子查询、自连接、合并查询详解,包含大量示例,包你会。

复合查询 前言正式开始一些开胃菜多表查询自连接子查询单行子查询多行子查询in关键字all关键字any关键字多列子查询在from中使用子查询 合并查询union 和 union all 前言 我前面博客讲的所有的查询都是在单表中进行的&#xff0c;从这里开始就要专门针对查询这个话题进行进一步…

HTML5+CSS3+JS小实例:霁青+翠蓝的Tabbar动画特效

实例:霁青+翠蓝的Tabbar动画特效 技术栈:HTML+CSS+JS 字体图标库:Font Awesome 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta nam…

虚拟摇杆OnJoystickMove未被调用,角色不移动

更改interaction type 为 event notification

2023-11-21 LeetCode每日一题(美化数组的最少删除数)

2023-11-21每日一题 一、题目编号 2216. 美化数组的最少删除数二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始的整数数组 nums &#xff0c;如果满足下述条件&#xff0c;则认为数组 nums 是一个 美丽数组 &#xff1a; nums.length 为偶数对所有满…

12、人工智能、机器学习、深度学习的关系

很多年前听一个机器学习的公开课,在Q&A环节,一个同学问了老师一个问题“机器学习和深度学习是什么关系”? 老师先没回答,而是反问了在场的同学,结果问了2-3个,没有人可以回答的很到位,我当时也是初学一脸懵,会场准备的小礼品也没有拿到。 后来老师解释“机器学习和…