springboot 发送邮箱功能
一、开启邮箱服务
不同的邮箱提供商,其 SMTP 服务器地址和端口可能不同。常用邮箱系统提供商如 126 邮箱的 SMTP 服务器地址 smtp.126.com,端口号为 465 或者 994;163 邮箱的 SMTP 服务器地址为 smtp.163.com,端口号为 465 或者 994 等。在配置时需根据实际使用的邮箱进行相应设置。同时,要注意获取授权码的操作,例如登录 QQ 邮箱网页版,在设置中开启相关服务以获取授权码。
QQ 邮箱:https://mail.qq.com/
进入官网点击账号与安全,点击下图所示开启服务
开启服务之后,先将授权码复制并且保存好
使用QQ第三方客户端服务需要配置以下服务信息
二、导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
三、配置 yml 文件
spring:
mail:
# 邮件服务器主机地址
host: smtp.qq.com
# 邮件服务器端口号
port: 465
# 你自己的发送邮件的用户名
username: xxxxx@qq.com
# 客户端授权码
password: xxxxxxxxxx
# 默认邮件编码为 UTF-8
default-encoding: UTF-8
properties:
mail:
smtp:
# 启用 SMTP 认证,一般用于验证发件人身份,这是与邮件服务器正确通信的必要设置
auth: true
starttls:
# 启用 STARTTLS(如果支持的话),STARTTLS 是一种在现有的不安全连接上通过加密来增强安全性的机制
enable: true
# 要求使用 STARTTLS(如果服务器支持,客户端必须使用 STARTTLS 进行安全连接)
required: true
ssl:
# 启用 SSL 连接,用于在与邮件服务器通信时进行加密,保障通信安全
enable: true
四、封装发送邮件工具类
在发送邮件的代码中,通常会使用以下一些关键类来实现邮件发送功能:
JavaMailSender
:这是一个高级接口,用于发送邮件。它抽象了底层邮件发送的具体实现细节,提供了一套方便的方法来发送各种类型的邮件。SimpleMailMessage
:用于构建简单的文本邮件消息。MimeMessage
和MimeMessageHelpe
:通常在处理复杂邮件时使用。MimeMessageHelper
是一个辅助类,用于更方便地创建和设置MimeMessage
的各种属性
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.util.Objects;
/*
* 发送邮件工具类
* */
@Component
public class EmailSenderUtil {
// 你自己的邮箱服务器地址
private static final String EMAIL_HOST = "xxxxxx@qq.com";
@Autowired
private JavaMailSender javaMailSender;
// 1.发送纯文本格式邮件
public void sendEmail(String to, String subject, String content) {
// 创建 一个SimpleMailMessage 对象,用于构建邮件消息
SimpleMailMessage message = new SimpleMailMessage();
// 设置发件人邮箱地址
message.setFrom(EMAIL_HOST);
// 设置收件人邮箱地址
message.setTo(to);
// 设置邮件主题
message.setSubject(subject);
// 设置邮件正文内容(纯文本)
message.setText(content);
// 发送邮件
try {
javaMailSender.send(message);
System.out.println("邮件发送成功!");
} catch (Exception e) {
System.out.println("邮件发送失败!" + e.getMessage());
}
}
// 2.发送 HTML 格式邮件
// 发送HTML格式邮件的方法
public void sendHtmlEmail(String to, String subject, String content) {
try {
// 创建一个 MimeMessage 对象,用于构建复杂邮件消息
MimeMessage message = javaMailSender.createMimeMessage();
// 使用 MimeMessageHelper 来简化设置 MimeMessage 属性,第二个参数 true 表示需要创建 multipart 类型的邮件
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(EMAIL_HOST);
helper.setTo(to);
helper.setSubject(subject);
// 设置邮件内容和格式,第二个参数 true 表示内容为 HTML 格式
helper.setText(content, true);
// 发送邮件
javaMailSender.send(message);
System.out.println("邮件发送成功!");
} catch (MessagingException e) {
System.out.println("邮件发送失败!" + e.getMessage());
}
}
// 3.发送带附件的邮件
public void sendAttachmentEmail(String to, String subject, String content, String filePath) {
try {
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(EMAIL_HOST);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
// 创建 FileSystemResource 对象以加载附件文件
FileSystemResource file = new FileSystemResource(new File(filePath));
// 添加附件到邮件中,getFilename()用于获取文件名,Objects.requireNonNull 确保文件名不为 null
helper.addAttachment(Objects.requireNonNull(file.getFilename()), file);
// 发送邮件
javaMailSender.send(message);
System.out.println("邮件发送成功!");
} catch (MessagingException e) {
System.out.println("邮件发送失败!" + e.getMessage());
}
}
// 4.发送带图片的邮件
public void sendImageEmail(String to, String subject, String content, String imgPath) {
try {
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(EMAIL_HOST);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
// 创建 FileSystemResource 对象以加载附件文件
FileSystemResource img = new FileSystemResource(new File(imgPath));
// 添加图片到邮件中,getFilename()用于获取文件名,Objects.requireNonNull 确保文件名不为 null
helper.addInline("img", img);
javaMailSender.send(message);
System.out.println("邮件发送成功!");
} catch (MessagingException e) {
System.out.println("邮件发送失败!" + e.getMessage());
}
}
}
五、发送邮件
1 发送纯文本邮件
@SpringBootTest
public class ApplicationTests {
@Autowired
private EmailSenderUtil emailSenderUtil;
@Test
public void sendEmail() {
String to = "xxxx@qq.com";// 你要发送的邮箱地址
String subject = "文本邮件测试";
String content = "这是一篇纯文本内容";
emailSenderUtil.sendEmail(to, subject, content);
}
}
测试结果:
2 发送 HTML 格式邮件
@SpringBootTest
public class ApplicationTests {
@Autowired
private EmailSenderUtil emailSenderUtil;
@Test
public void sendHtmlEmail() throws IOException {
// 从资源目录加载 HTML 文件内容
String to = "xxxx@qq.com";
String subject = "HTMl邮件测试";
// 创建一个 Resource 对象,用于加载 classpath 中的文件
Resource resource = new ClassPathResource("index.html");
// 读取资源文件的所有字节,并将其转换为字符串
String htmlContent = new String(resource.getInputStream().readAllBytes());
emailSenderUtil.sendHtmlEmail(to, subject, htmlContent);
}
}
index.html 文件位置
测试结果:
3 发送带附件的邮件
@SpringBootTest
public class ApplicationTests {
@Autowired
private EmailSenderUtil emailSenderUtil;
@Test
public void sendAttachmentEmail() {
String to = "xxxx@qq.com";
String subject = "附件邮件测试";
String content = "";
String filePath = "D:\\test.txt";
emailSenderUtil.sendAttachmentEmail(to, subject, content, filePath);
}
}
测试结果:
4 发送带图片的邮件
@SpringBootTest
public class ApplicationTests {
@Autowired
private EmailSenderUtil emailSenderUtil;
@Test
public void sendImageEmail() {
String to = "xxxx@qq.com";
String subject = "图片邮件测试";
String content = "<html><body><h1>图片演示</h1><br>
<img style='width:100px;height:100px;' src='cid:img'/></body></html>";
String imgPath = "D:\\autar.jpeg";
emailSenderUtil.sendImageEmail(to, subject, content, imgPath);
}
}
测试结果: