文章目录
本内容根据松哥的 SpringBoot 付费视频所做的学习笔记,想具体详细了解内容的,请关注微信公众号:江南一点雨。
使用 Java Mail 发送QQ邮件
1. 准备工作:打开QQ邮箱的账号设置,开启服务。
在账号设置中,找到以下选项。其中 POP3 和 IMAP 两个都行,选择其中一个开启,这里选择第一个。
我们通过打开如何使用 Foxmail 等软件收发邮件,在里面可以找到服务器端口号。
在设置开启服务,客户端需要你进行短信验证,验证成功后将会返回以下授权码。授权码将会代替邮箱密码进行发送邮件。
准备工作完成后,就可以开始创建工程了。先来一个简单的发送邮件。
创建 SpringBoot 项目,添加以下这两个依赖。
创建完成项目后,我们首先需要对邮箱进行基本配置。配置信息如下:
# 腾讯的邮件服务器
spring.mail.host=smtp.qq.com
# 我们在准备工作中找到的服务器端口号
spring.mail.port=465
# 邮箱的账号
spring.mail.username=111@qq.com
# 开启服务时,服务器返回给我们的授权码
spring.mail.password=xfpmlqmyxhpudecf
# 编码
spring.mail.default-encoding=utf-8
# 加密连接的工具类
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
# 开启debug
spring.mail.properties.mail.debug=true;
配置完以上信息,我们就可以在进行邮件发送了。
2. 简单的邮件发送
@Autowired
JavaMailSender javaMailSender;
@Test
void contextLoads() {
SimpleMailMessage simpMsg = new SimpleMailMessage();
// 发送人的邮箱
simpMsg.setFrom("111@qq.com");
// 接收人的邮箱
simpMsg.setTo("222@qq.com");
// 发送的时间
simpMsg.setSentDate(new Date());
// 发送邮件的主题
simpMsg.setSubject("邮件主题-测试邮件");
// 发送邮件的内容
simpMsg.setText("邮件内容-测试邮件");
javaMailSender.send(simpMsg);
}
3. 带附件的邮件发送
@Test
void test1() throws MessagingException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
// 发送人的邮箱
helper.setFrom("1963385876@qq.com");
// 接收人的邮箱
helper.setTo("2516313840@qq.com");
// 发送的时间
helper.setSentDate(new Date());
// 发送邮件的主题
helper.setSubject("邮件主题-测试邮件");
// 发送邮件的内容
helper.setText("邮件内容-测试邮件");
// 要发送的附件
File file = new File("C:/Users/19633/Desktop/123.png");
helper.addAttachment(file.getName(),file);
javaMailSender.send(mimeMessage);
}
4. 邮件内容中带有图片的邮件发送
不推荐,原因是如果发送的图片太大太多会导致邮件发送失败。并且有时候,成功发送带有图片的邮件,但是有时候在邮箱中查看并不显示图片,这并不是图片没有发送的原因。
@Test
void test2() throws MessagingException {
// 要发送的附件
File file = new File("C:/Users/19633/Desktop/123.png");
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
// 发送人的邮箱
helper.setFrom("1963385876@qq.com");
// 接收人的邮箱
helper.setTo("2516313840@qq.com");
// 发送的时间
helper.setSentDate(new Date());
// 发送邮件的主题
helper.setSubject("邮件主题-测试邮件");
// 发送邮件的内容, 第一个参数表示发送的 HTML 文件内容,第二个参数表示支持 HTML 。
// 其中,img 标签中的 'cid:p01' 表示占位符
helper.setText("<div>带有图片的邮件内容:</div><div><img src='cid:p01'/></div>",true);
helper.addAttachment("p01",file);
javaMailSender.send(mimeMessage);
}
5. 使用 freemarker 模板实现邮件发送
使用 freemarker 模板进行邮件发送,也就只是将定义好的模板转换成字符的形式发送到邮箱中。
- 添加 freemarker 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
- 在 resources 下创建 freemarker 邮件模板,这里在 mail 目录下创建。
mail.ftl
邮件模板:
<div>欢迎 ${username} 加入 ${company} 大家庭,您的入职信息如下:</div>
<table border="1">
<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: #ff0016;font-size: large">希望在未来的日子里携手奋进!</div>
- 为邮件模板创建一个 model 实体类,用于邮件模板的属性设置。
public class User {
private String username;
private double salary;
private String position;
private String company;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public String getPosition() {
return position;
}
public void setPosition(String position) {
this.position = position;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
}
- 发送邮件。
@Test
void test3() throws MessagingException, IOException, TemplateException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
// 发送人的邮箱
helper.setFrom("1963385876@qq.com");
// 接收人的邮箱
helper.setTo("2516313840@qq.com");
// 发送的时间
helper.setSentDate(new Date());
// 发送邮件的主题
helper.setSubject("邮件主题-测试邮件");
// 注意:Configuration 为 freemarker.template.Configuration
Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
// 参数1表示类加载器,参数2表示 freemarker 模板加载的目录
cfg.setClassLoaderForTemplateLoading(MailApplicationTests.class.getClassLoader(),"mail");
// 获取 freemarker 模板
Template template = cfg.getTemplate("mail.ftl");
// model 实例
User user = new User();
user.setUsername("crc");
user.setCompany("xxx公司");
user.setPosition("Java架构师");
user.setSalary(999999999.0);
// 设置 freemarker 模板属性
StringWriter out = new StringWriter();
template.process(user,out);
// 将 freemarker 模板转换成字符串
String text = out.toString();
// 可以在控制台查看生成的 HTML 文件内容
System.out.println(text);
// 设置邮件内容
helper.setText(text, true);
javaMailSender.send(mimeMessage);
}
6. 使用 Thymeleaf 模板实现邮件发送(推荐)
Thymeleaf 与 freemarker 的区别:
- Thymeleaf 实现邮件发送比 freemarker 更加简洁。
- Thymeleaf 实现邮件发送不需要指定 Thymeleaf 模板位置
- 导入 Thymeleaf 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
- 在 resources/templates 目录下创建 Thymeleaf 模板
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>欢迎 <span th:text="${username}"></span> 加入 <span th:text="${company}"></span> 大家庭,您的入职信息如下:</div>
<table border="1">
<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: #ff0016;font-size: large">希望在未来的日子里携手奋进!</div>
</body>
</html>
- 发送邮件
@Autowired
TemplateEngine templateEngine;
@Test
void test4() throws MessagingException, IOException, TemplateException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
// 发送人的邮箱
helper.setFrom("1963385876@qq.com");
// 接收人的邮箱
helper.setTo("2516313840@qq.com");
// 发送的时间
helper.setSentDate(new Date());
// 发送邮件的主题
helper.setSubject("邮件主题-测试邮件");
// 设置上下文
Context ctx = new Context();
ctx.setVariable("username","crc");
ctx.setVariable("position","Java工程师");
ctx.setVariable("company","xxx集团");
ctx.setVariable("salary","99999");
// 参数1 表示模板的位置(默认在template目录下查找),参数2 表示模板的上下文,不能使用对象
String text = templateEngine.process("mail.html", ctx);
// 设置邮件内容
helper.setText(text, true);
javaMailSender.send(mimeMessage);
}