SpringBoot邮件服务
邮件服务代码仓库:mail
一、前期准备工作
1、从qq邮箱获取授权码:
登录qq邮箱,点击设置
在账户选项中的POP3/SMTP选项中开启POP3/SMTP服务(图中已开启)
开启完毕会得到一个授权码,保存该授权码。
2、新建SpingBoot项目mail
,导入Java Mail Sender依赖:
3、配置application.yml
文件
根据自己的需求填写邮箱授权码
和邮件发送者
的邮箱地址
server:
port: 7755
spring:
mail:
host: smtp.qq.com
port: 587
password: # 邮箱授权码
username: # 邮件的发送者
default-encoding: UTF-8
properties:
mail:
stmp:
socketFactory:
class:javax.net.ssl.SSLSocketFactory # 连接工具加密类
debug: true # 开启debug模式
二、简单邮件发送
1、在测试类中注入JavaMailSender
编辑邮件内容(此处为了方便,邮件发送和接受用了同一个邮箱):
@SpringBootTest
class MailApplicationTests {
@Autowired
JavaMailSender javaMailSender;
@Test
void contextLoads() {
SimpleMailMessage simMsg = new SimpleMailMessage();
//描述邮件基本信息
simMsg.setFrom("3425928061@qq.com"); //邮件发送者
simMsg.setTo("3425928061@qq.com"); //邮件接受者
simMsg.setSubject("邮件主题--测试邮件"); //主题
simMsg.setText("邮件内容-测试邮件"); //内容
javaMailSender.send(simMsg); //发送邮件
}
}
2、运行测试方法,查看邮箱,发送与接受成功:
三、发送带附件的邮件
1、新建测试方法:
@Test
void test1() throws MessagingException {
//新建一个文件对象,从本地绝对路径获取
File file = new File("E:/java集合框架图.gif");
//复合邮件
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
//heper 是一个辅助工具
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom("3425928061@qq.com");
helper.setTo("3425928061@qq.com");
helper.setSubject("邮件主题--测试邮件");
helper.setText("邮件内容-测试邮件");
//文件名字 文件对象
helper.addAttachment(file.getName(),file);
javaMailSender.send(mimeMessage);
}
2、测试,查看邮箱:
注意事项
:发送邮箱方法不要多次运行,短时间内发了太多邮箱有封号风险。
四、发送带图片资源的邮件(未使用视图模板)
1、新建测试方法:
主要修改了heper.setText方法,传入一个html结构,结构内塞一张图片。
@Test
void test2() throws MessagingException {
File file = new File("E:/java集合框架图.gif");
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
//heper 是一个辅助工具
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom("3425928061@qq.com");
helper.setTo("3425928061@qq.com");
helper.setSentDate(new Date());
helper.setSubject("邮件主题--测试邮件");
helper.setText("<div>hello , 这是一封带图片资源的邮件...</div><div><img src='cid:p01'></div>",true);
// p01 : 标记 file : 图片对象
helper.addInline("p01",file);
javaMailSender.send(mimeMessage);
}
2、测试,查看邮箱:
说明:把图片放进邮件正文里面不是一个主流方案,因为可能会出现图片过大无法发送的情况,发大文件建议用附件。若实在需要在邮件正文中嵌套图片,可以使用Freemarker
与Themlef
去做。
五、Freemarker
作为邮件模板
1、pom.xml中引入Freemarker
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
2、创建实体类User
供页面展示用:
@Data
public class User {
private String username;
private Double salary;
private String position;
private String company;
}
3、创建mail.ftl
模板:
<div>欢迎 ${username} 加入 ${company} 大家庭,您的入职信息如下:</div>
<table>
<tr>
<td>姓名</td>
<td>${username}</td>
</tr>
<tr>
<td>职位</td>
<td>${position}</td>
</tr>
<tr>
<td>薪水</td>
<td>${salary}</td>
</tr>
</table>
<div style="color: #ff3f57;font-size: large">希望在未来的日子里携手奋进!</div>
<style>
table {
border-collapse: collapse;
}
tr, td {
border: 1px solid black;
padding: 5px;
text-align: center;
}
tr:nth-child(even) {background-color: #f2f2f2;}
</style>
4、新建测试类方法:
@Test
void test3() throws MessagingException, IOException, TemplateException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
//heper 是一个辅助工具
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom("3425928061@qq.com");
helper.setTo("3425928061@qq.com");
helper.setSentDate(new Date());
helper.setSubject("邮件主题--测试邮件");
Configuration cfg = new Configuration(Configuration.VERSION_2_3_30);
cfg.setClassLoaderForTemplateLoading(MailApplicationTests.class.getClassLoader(), "mail");
Template template = cfg.getTemplate("mail.ftl");
User user = new User();
//输出流 渲染之后的页面内容
user.setCompany("xxx公司");
user.setUsername("小明");
user.setPosition("品保");
user.setSalary(8899.0);
StringWriter out = new StringWriter();
template.process(user,out);
String text = out.toString();
System.out.println("text = " + text);
helper.setText(text,true);
javaMailSender.send(mimeMessage);
}
此处版本号应当与导入的依赖相匹配(2.3.30):
Configuration cfg = new Configuration(Configuration.VERSION_2_3_30);
指定mail.ftl
模板的位置:
cfg.setClassLoaderForTemplateLoading(MailApplicationTests.class.getClassLoader(), "mail");
指定模板名称:
Template template = cfg.getTemplate("mail.ftl");
5、测试,查看邮箱:
六、Thymeleaf
作为邮件模板
1、pom.xml中引入Thymeleaf
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2、创建mail.html
页面:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
table {
border-collapse: collapse;
}
tr, td {
border: 1px solid black;
padding: 5px;
text-align: center;
}
tr:nth-child(even) {background-color: #f2f2f2;}
</style>
</head>
<body>
<div>欢迎 <span th:text="${username}"></span> 加入 <span th:text="${company}"></span> 大家庭,您的入职信息如下:</div>
<table>
<tr>
<td>姓名</td>
<td th:text="${username}"></td>
</tr>
<tr>
<td>职位</td>
<td th:text="${position}"></td>
</tr>
<tr>
<td>薪水</td>
<td th:text="${salary}"></td>
</tr>
</table>
<div style="color: #ff3f57;font-size: large">希望在未来的日子里携手奋进!</div>
</body>
</html>
3、新建测试类方法:
@Autowired
TemplateEngine templateEngine;
@Test
void test4() throws MessagingException, IOException, TemplateException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
//heper 是一个辅助工具
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom("3425928061@qq.com");
helper.setTo("3425928061@qq.com");
helper.setSentDate(new Date());
helper.setSubject("邮件主题--测试邮件");
Context context = new Context();
context.setVariable("username","小明");
context.setVariable("position","工程");
context.setVariable("company","xx集团");
context.setVariable("salary","99889");
String text = templateEngine.process("mail.html", context);
helper.setText(text,true);
javaMailSender.send(mimeMessage);
}
Thymeleaf
提供了TemplateEngine
方便咱们使用,不需要实体类User,在context
中设置好页面要展示的值即可。
5、测试,查看邮箱: