126邮箱邮件发送
- 授权码申请
- pom依赖
- 邮件配置
- 代码编写
- Bean与配置自动装载
- 原始手工方式发送邮件
- 发送纯文本的邮件
- 发送包含HTML标签的邮件
- 发送包含附件的邮件
- 发送包含静态资源的文件
- 测试
SpringBoot 提供了系统级别邮箱服务,只需要导入一个邮箱启动器然后进行配置就可以使用邮件发送
的功能了,简直太方便了。
实现功能期间也踩了一些坑,为了方便后来者快速接入,特意记录下来供有需要的人进行参考。
授权码申请
开启POP3/SMTP,然后按照步骤获取授权码
pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
邮件配置
## 126邮箱配置
# 指定默认MimeMessage的编码,默认为: UTF-8
spring.mail.default-encoding=UTF-8
spring.mail.host=smtp.126.com
spring.mail.username=你的126邮箱地址
## 指定SMTP server登陆授权码
spring.mail.password=授权码
# 指定SMTP server使用的协议,默认为: smtp
spring.mail.protocol=smtp
spring.mail.port=465
# 下面的四项是必须配置的,否则会因为验证不通过而无法连接上邮件服务器, 这里一定要注意是ssl不是其它的认证方式
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.ssl.enable=true
spring.mail.properties.mail.smtp.ssl.required=true
spring.mail.properties.mail.smtp.socketFactoryClass=javax.net.ssl.SSLSocketFactory
# 表示开启debug模式,邮件发送过程的日志会在控制台打印出来,方便排查问题
spring.mail.properties.mail.debug=true
# 指定是否在启动时测试邮件服务器连接,默认为false
spring.mail.test-connection=false
# 邮件接收者
#spring.mail.to.user=panyongjie@hfitech.com
spring.mail.to.user=771006587@qq.com
代码编写
首先先对全局配置加载,后面会用到这些全局配置
Bean与配置自动装载
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.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.Properties;
/**
* 邮箱测试
*
* @author panyongjie
* @date 2022/12/28
*/
@SpringBootTest
public class MallTest {
/**
* 自动注入的Bean
*/
@Autowired
private JavaMailSender mailSender;
/**
* 读取配置文件中的邮件发送者
*/
@Value("${spring.mail.username}")
private String from;
/**
* 读取配置文件中的邮件接收者
*/
@Value("${spring.mail.to.user}")
private String toUser;
private final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
原始手工方式发送邮件
这里提供一个手动的硬编码的方式发送邮件的代码示例是为了更好的理解自动读取配置发送邮件所需要的流程
/**
* 通过手动配置邮件信息,发送邮件
* */
@Test
public void sendEmailByManualConfig() throws MessagingException {
String from = "你的126邮箱地址";
String toUser = "771006587@qq.com";
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
// 邮箱服务器
mailSender.setHost("smtp.126.com");
// 端口号
mailSender.setPort(465); // 25 465 994
// 发送邮件的邮箱地址
mailSender.setUsername(from);
// 这里要用登录授权码,不是你登录邮箱的密码
mailSender.setPassword("登录授权码");
// 设置属性, 下面各项缺一不可
Properties pro = System.getProperties();
// 打开调试开关
pro.put("mail.debug", "true");
pro.put("mail.smtp.auth", "true");
pro.put("mail.smtp.ssl.enable", "true");
pro.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
mailSender.setJavaMailProperties(pro);
// 默认编码方式
mailSender.setDefaultEncoding("utf-8");
// 协议类型
mailSender.setProtocol("smtp");
// 测试gong
mailSender.testConnection();
MimeMessage message = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from); // 发送人
helper.setTo(toUser); // 收件人
helper.setSubject("使用JavaMailSenderImpl和MimeMessageHelper发送邮件"); // 标题
helper.setText("这是我用Springboot自带的mail启动器给你发送的邮件,当前时间是: " + simpleDateFormat.format(new Date())); // 内容
mailSender.send(message);
System.out.println("邮件发送完毕!!!");
} catch (Exception e) {
e.printStackTrace();
}
}
发送纯文本的邮件
/**
* 读取配置文件,自动转载邮件发送Bean,然后发送纯文本的邮件
* */
@Test
public void sendSimpleMail() {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);
message.setTo(toUser);
message.setSubject("使用JavaMailSender和SimpleMailMessage发送邮件");
message.setText("这是我用Springboot自带的mail启动器给你发送的邮件,当前时间是: " + simpleDateFormat.format(new Date())); // 内容
mailSender.send(message);
}
发送包含HTML标签的邮件
/**
* 发送包含HTML标签的邮件
* */
@Test
public void sendHtmlMessage() {
MimeMessage message;
message = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
// 创建邮件发送者地址
helper.setFrom(new InternetAddress(MimeUtility.encodeText("发送者") + "<" + from + ">"));
// 创建邮件发送者地址
helper.setTo(new InternetAddress(MimeUtility.encodeText("接收方") + "<" + toUser + ">"));
//标题
helper.setSubject("这是一份内容包含HTML标签的网页");
String content = "<h1>中奖通知</h1>" +
"<p style='color:red;'>恭喜你获得大乐透三等奖,点击此处<a>https://www.baidu.com<a>进行领奖</p>";
//第二个参数指定发送的是HTML格式
helper.setText(content, true);
} catch (MessagingException | UnsupportedEncodingException e) {
e.printStackTrace();
}
mailSender.send(message);
}
发送包含附件的邮件
/**
* 发送包含附件的邮件
* */
@Test
public void sendAttachmentsMail() {
MimeMessage message = null;
try {
message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
// 创建邮件发送者地址
helper.setFrom(new InternetAddress(MimeUtility.encodeText("发送者") + "<" + from + ">"));
// 创建邮件发送者地址
helper.setTo(new InternetAddress(MimeUtility.encodeText("接收方") + "<" + toUser + ">"));
helper.setSubject("报销申请-报销明细在附件里");
String content = "<h1>报销单</h1>" +
"<p style='color:red;'>报销详情请下载附件进行查看</p>";
//第二个参数指定发送的是HTML格式
helper.setText(content, true);
//添加附件
helper.addAttachment("报销费用.png", new FileSystemResource(new File("src/main/resources/static/fee.png")));
} catch (Exception e) {
e.printStackTrace();
}
mailSender.send(message);
}
发送包含静态资源的文件
/**
* 发送包含静态资源的文件
* 静态资源可以包含在HTML标签中进行展示,不用和附件一样需要下载或者预览才能看到内容
* */
@Test
public void sendInlineMail() {
MimeMessage message = null;
try {
message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
// 创建邮件发送者地址
helper.setFrom(new InternetAddress(MimeUtility.encodeText("发送者") + "<" + from + ">"));
// 创建邮件发送者地址
helper.setTo(new InternetAddress(MimeUtility.encodeText("接收方") + "<" + toUser + ">"));
helper.setSubject("邮件里包含静态资源,请注意查收");
//第二个参数指定发送的是HTML格式
helper.setText("<html><body>带静态资源的邮件内容 图片:<img src='cid:fee'/></body></html>", true);
FileSystemResource file = new FileSystemResource(new File("src/main/resources/static/fee.png"));
helper.addInline("fee", file);
} catch (Exception e) {
e.printStackTrace();
}
mailSender.send(message);
}
测试
每一个测试用例都运行一遍,再去查看邮箱,可以看到各种样式的邮件都发送成功了。