赞
踩
SpringBoot发送邮件
邮件发送是一个很常见的功能,注册身份认证,找回密码等场景都会用到邮件发送。Spring Boot提供了MailSenderAutoConfiguration 对邮件的发送做了进一步简化。
SMTP是一种提供可靠且有效的电子邮件传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。
也就是说 abc@qq.com 用户先将邮件投递到腾讯的 SMTP 服务器这个过程就使用了 SMTP 协议,然后腾讯的 SMTP 服务器将邮件投递到网易的 SMTP 服务器这个过程也依然使用了 SMTP 协议,SMTP 服务器就是用来收邮件。
而 POP3 协议全称为 Post Office Protocol ,译作邮局协议,它定义了邮件客户端与 POP3 服务器之间的通信规则,那么该协议在什么场景下会用到呢?当邮件到达网易的 SMTP 服务器之后,abc@163.com 用户需要登录服务器查看邮件,这个时候就该协议就用上了:邮件服务商都会为每一个用户提供专门的邮件存储空间,SMTP 服务器收到邮件之后,就将邮件保存到相应用户的邮件存储空间中,如果用户要读取邮件,就需要通过邮件服务商的 POP3 邮件服务器来完成。
文章以qq邮箱的方式(其他邮箱步骤相同)
进入邮箱——>打开设置——>账户
在这里插入图片描述
授权码可以配置多个,如果忘记授权码可以重新申请。
<!-- Spring Mail依赖(发送邮件) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
server: port: 8080 spring: mail: # 配置 SMTP 服务器地址 host: smtp.qq.com # 发送者邮箱,已开通POP3/SMTP服务的邮箱,也就是你自己的 username: xxxxx@qq.com # 配置密码,注意不是真正的密码,而是刚刚申请到的授权码 password: 123456 # 发送人昵称 nickname: ufo_21 # 端口号465或587(QQ邮箱发送邮件仅支持587端口协议) port: 587 # 默认的邮件编码为UTF-8 default-encoding: UTF-8 # 配置SSL 加密工厂 properties: mail: smtp: socketFactoryClass: javax.net.ssl.SSLSocketFactory #表示开启 DEBUG 模式,这样,邮件发送过程的日志会在控制台打印出来,方便排查错误 debug: true
邮箱类型 | SMTP服务器地址 | 端口号 |
---|---|---|
QQ邮箱 | smtp.qq.com | 465或587 |
sina邮箱 | smtp.sina.cn | 465或587 |
126邮箱 | smtp.126.com | 465或994 |
aliyun邮箱 | smtp.aliyun.com | 465或994 |
163邮箱 | smtp.163.com | 465或994 |
yeah邮箱 | smtp.yeah.net | 465或994 |
package com.ufo.maildemo; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import java.util.Date; @SpringBootTest class MailDemoApplicationTests { @Autowired private JavaMailSender javaMailSender; // 获取yml配置的发送者邮箱 @Value("${spring.mail.username}") private String mainUserName; //发送人昵称 @Value("${spring.mail.nickname}") private String nickname; /** * 普通邮件发送 */ @Test public void sendSimpleMail() { // 构建一个邮件对象 SimpleMailMessage message = new SimpleMailMessage(); // 设置邮件主题 message.setSubject("测试邮件"); // 设置邮件发送者,昵称+<邮箱地址> message.setFrom(nickname+'<'+mainUserName+'>'); // 设置邮件接收者,可以有多个接收者,多个接受者参数需要数组形式 message.setTo("y****@163.com"); // 设置邮件抄送人,可以有多个抄送人 message.setCc("12****32*qq.com"); // 设置隐秘抄送人,可以有多个 message.setBcc("7******9@qq.com"); // 设置邮件发送日期 message.setSentDate(new Date()); // 设置邮件的正文 message.setText("hello,do you one more"); // 发送邮件 javaMailSender.send(message); } }
发送效果如下:
对于格式比较复杂的邮件,推荐使用HTML模板
<!-- FreeMarker模板 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
在resources目录创建templates文件,把模板保存在templates下
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta charset="utf-8"> <title>${title}</title> <style> .hello { display: flex !important; justify-content: center !important; } .areaBox { width: 500px; box-sizing: border-box; } .areaBox > .title { font-size: 2em; } .text { margin-bottom: 20px; color: #536AD8; } </style> </head> <body> <div class="hello"> <div class="areaBox"> <p class="title">${title}</p> <p class="text">这是个模板</p> </div> </div> </body> </html>
/** * FreeMarker模板发送邮件 */ @Test public void sendFreeMarkerMail() throws IOException, MessagingException, TemplateException { // 首先配置 FreeMarker 模版位置 Configuration configuration = new Configuration(Configuration.VERSION_2_3_0); // MailDemoApplication是启动类类名 ClassLoader loader = MailDemoApplication.class.getClassLoader(); configuration.setClassLoaderForTemplateLoading(loader, "templates"); // 配置模版文件 Template template = configuration.getTemplate("mail.ftl"); // 渲染模版 StringWriter mail = new StringWriter(); HashMap<String, Object> map = new HashMap<>(); map.put("title", "FreeMarker标题"); template.process(map, mail); // 构建一个邮件对象 MimeMessage message = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); // 设置邮件发送者 message.setFrom(nickname+'<'+mainUserName+'>'); // 设置邮件接收者 helper.setTo("y******9@163.com"); // 设置邮件的主题 message.setSubject("FreeMarker模板发送邮件"); // 设置邮件的正文 helper.setText(mail.toString(), true); // 发送邮件 javaMailSender.send(message); }
发送效果如下:
如果想使用Thymeleaf模板发送邮件也是可以的,照葫芦画瓢。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。