SpringBoot整合邮件配置
Spring Boot整合邮件配置
概述
这个技术是做什么?学习该技术的原因,技术的难点在哪⾥。
这个技术能使项⽬具备发送邮件的功能,这个技术我是作为技术储备来学习的,没想到在学习后没多久就能够有⽤武之地。该项技术总体难度不⼤,硬要说难的地⽅就在于整合模板引擎发送模板邮件,因为还要同时了解⼀些模板引擎的知识,不过如果有JSP相关知识会容易应付得多。
整合邮件发送功能
Spring Boot 2.x集成了mail模块
在l中引⼊依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
邮箱配置
⼀些必要的名词解释
什么是POP3、SMTP和IMAP?
他们是三种邮件协议。简单来说,POP3和IMAP是⽤来从服务器上下载邮件的。SMTP适⽤于发送或中转信件时到下⼀个⽬的地。所以我们发送邮件应该使⽤SMTP协议。
什么是邮箱客户端授权码?
邮箱客户端授权码是为了避免邮箱密码被盗后,盗号者通过客户端登录邮箱⽽设计的安防功能。
QQ邮箱配置
⽹页登录QQ邮箱→设置→开启相应服务并⽣成授权码
spring boot配置:
password: xxxxxxxxxxx #客户端授权码
protocol: smtp #发送邮件协议
properties.mail.smtp.auth: true
properties.mail.smtp.port: 465 #端⼝号465或587 properties.mail.display.sendmail: aaa #可以任意 properties.mail.display.sendname: bbb #可以任意 properties.mail.able: true
properties.mail.quired: true
properties.mail.able: true #开启SSL default-encoding: utf-8
⽹易系(126/163/yeah)邮箱配置
⽹页登录⽹易邮箱→设置→POP3/SMTP/IMAP
spring boot配置:
password: xxxxxxxx #客户端授权码
protocol: smtp #发送邮件协议
properties.mail.smtp.auth: true
properties.mail.smtp.port: 994 #465或者994
properties.mail.display.sendmail: aaa #可以任意
properties.mail.display.sendname: bbb #可以任意
properties.mail.able: true
properties.mail.quired: true
properties.mail.able: true #开启SSL
default-encoding: utf-8
from: xx@126
126邮箱SMTP服务器地址:smtp.126
163邮箱SMTP服务器地址:smtp.163
yeah邮箱SMTP服务器地址:ah
发送简单的⽂本邮件
写个邮件服务Service
@Service
public class MailService {
// Spring官⽅提供的集成邮件服务的实现类,⽬前是Java后端发送邮件和集成邮件服务的主流⼯具。 @Resource
private JavaMailSender mailSender;
// 从配置⽂件中注⼊发件⼈的姓名
@Value("${spring.mail.username}")
private String fromEmail;
/**
* 发送⽂本邮件
*
* @param to 收件⼈
* @param subject 标题
* @param content 正⽂
* @throws MessagingException
*/
public void sendSimpleMail(String to, String subject, String content) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(fromEmail); // 发件⼈
message.setTo(to);
message.setSubject(subject);
message.setText(content);
mailSender.send(message);
}
}
在业务中调⽤该服务的⽅法即可
mailService.sendSimpleMail("xxxxxx@xx","普通⽂本邮件","普通⽂本邮件内容");
发送html邮件
为了⽅便,在原来的Service⾥直接添加⼀个⽅法
/**
* 发送html邮件
*/
public void sendHtmlMail(String to, String subject, String content) throws MessagingException {
//注意这⾥使⽤的是MimeMessage
MimeMessage message = ateMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
/
/第⼆个参数:格式是否为html
helper.setText(content, true);
mailSender.send(message);
}
调⽤该⽅法,直接传⼊html代码的字符串作为正⽂参数:
mailService.sendHtmlMail("xxxxxx@xx","⼀封html测试邮件","
"<div style=\"text-align: center;position: absolute;\" >\n"
+"<h3>\"⼀封html测试邮件\"</h3>\n"
+ "<div>⼀封html测试邮件</div>\n"
+ "</div>");
像上⾯直接传递html字符串发送html邮件,在java类⾥写html代码总有点怪怪的,⽽且有很明显的缺点,
若是要⽤相同样式发送不同的内容,代码冗余度就会增加;⽽且若是需要发送⼀个复杂的html页⾯,代码看起来就⼀团乱⿇,⽽且不⽅便调整邮件的样式。
我们希望html和java分离开,在java⾥就只管java,页⾯代码乖乖到页⾯⽂件⾥⾯,需要时直接调取该页⾯⽂件,整合模板引擎就是⼀个不错的解决⽅案。
发送基于模板的邮件(以模板引擎freemarker为例)
该⽅法本质上还是发送html邮件,只不过是有⼀个把模板转换成html字符串的过程,thymeleaf也可以实现。这个⽅法还能使你的系统发出的邮件更加美观。
说明:这⾥不详细介绍freemarker的内容,在这⾥只描述它的⼀个使⽤场景——⽣成电⼦邮件,想要进⼀步了解freemarker请⾏学习
添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
springboot配置
spring:
freemarker:
cache: false # 缓存配置开发阶段应该配置为false 因为经常会改
suffix: .html # 模版后缀名默认为ftl
charset: UTF-8 # ⽂件编码
template-loader-path: classpath:/templates/ # 存放模板的⽂件夹,以resource⽂件夹为相对路径
springboot是啥在存放模板的⽂件夹下写⼀个html模板
内容如下:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8" />
<title>freemarker简单⽰例</title>
</head>
<body>
<h1>Hello Freemarker</h1>
<div>My name is ${myname}</div>
</body>
</html>
仍然为了⽅便,在原来的Service⾥直接添加代码
@Autowired
private FreeMarkerConfigurer freeMarkerConfigurer;
@Test
public void sendTemplateMail(String to, String subject, String template) throws IOException, TemplateException, MessagingException { // 获得模板
Template template = Configuration().getTemplate(template);
// 使⽤Map作为数据模型,定义属性和值
Map<String,Object> model = new HashMap<>();
model.put("myname","ZYF");
// 传⼊数据模型到模板,替代模板中的占位符,并将模板转化为html字符串
String templateHtml = FreeMarkerTemplateUtils.processTemplateIntoString(template,model);
// 该⽅法本质上还是发送html邮件,调⽤之前发送html邮件的⽅法
this.sendHtmlMail(to, subject, templateHtml);
}
要⽤的时候调⽤即可
mailService.sendTemplateMail("xxxxx@xx", "基于模板的html邮件", "fremarkertemp.html");
发送带附件的邮件
话不多说上代码:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论