SpringBoot整合邮件发送
利用JavaMail完成发送激活邮件的功能。当前案例是以腾讯qq邮箱服务器为演示案例:
开启邮件服务授权
qq邮箱服务器官方会回送一个授权码在网页,类似下图的效果:
邮件发送流程
因为springboot提供了java操作邮件发送的启动器,所以在springboot 项目中完成邮件发送的功能,还是很简单、方便的。大致流程如下所示:
pom.xml 引入邮件发送启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
通过JavaMail的API完成邮件发送功能的代码封装,此处直接提供的工具类
- 抽取接口
public interface MailService {
void sendSimpleMail(String to, String subject, String content);
void sendHtmlMail(String to, String subject, String content);
void sendAttachmentsMail(String to, String subject,String content, String filePath);
void sendInlineResourceMail(
String to, String subject,
String content, String rscPath, String rscId);
}
- 实现类
@Slf4j
@Component
@Data
@ConfigurationProperties(prefix = "spring.mail")
public class MailUtil implements MailService{
@Autowired
private JavaMailSender mailSender; //springboot提供的邮件发送的api
private String from;//获取发件人的邮箱地址
@Override
public void sendSimpleMail(String to, String subject, String content) {
log.info("from===="+from);
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from); //发件人
message.setTo(to); //收件人
message.setSubject(subject); //邮件主题
message.setText(content); //邮件内容,只能纯文本
try {
mailSender.send(message);
log.info("简单邮件已经发送。");
} catch (Exception e) {
e.printStackTrace();
log.error("发送简单邮件时发生生异常!", e);
}
}
@Override
public void sendHtmlMail(String to, String subject, String content) {
MimeMessage message = mailSender.createMimeMessage();
try {
// true 表示需要创建一一个 multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true); //邮件内容包含html
mailSender.send(message);
log.info("html邮件发送成功");
} catch (Exception e) {
log.error("发送html邮件时发生生异常!", e);
}
}
@Override
public void sendAttachmentsMail (
String to, String subject,
String content, String filePath) {
MimeMessage message = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
FileSystemResource file = new FileSystemResource(new File(filePath));
String fileName = file.getFilename();
helper.addAttachment(fileName, file); //设置附件
// helper.addAttachment("test"+fileName, file);
mailSender.send(message);
log.info("带附件的邮件已经发送。");
} catch (Exception e) {
log.error("发送带附件的邮件时发生生异常!", e);
}
}
@Override
public void sendInlineResourceMail(
String to, String subject,
String content, String rscPath, String rscId) {
MimeMessage message = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
FileSystemResource res = new FileSystemResource(new File(rscPath));
helper.addInline(rscId, res); //内嵌静态资源
mailSender.send(message);
log.info("嵌入静态资源的邮件已经发送。");
} catch (Exception e) {
log.error("发送嵌入静态资源的邮件时发生异常!", e);
}
}
}
- from,即为邮件发送者,一般设置在配置文件中
- to,邮件接收者,此参数可以为数组,同时发送多人
- subject,邮件主题
- content,邮件的主体
- 邮件发送者 from 一般采用固定的形式写到配置文件中。
application.yaml中配置邮件服务器信息
spring:
mail:
protocol: smtp
host: smtp.qq.com #邮箱服务器主机,可以配置不用的邮件服务商 126 163 qq
username: xxxxxxxxxx@qq.com # 开通邮件授权功能的邮箱用户名
password: xxxxxxxx #授权码
port: 25 # 端口
from: xxxxxxx@qq.com #实际发送邮件的邮箱地址发件人
default-encoding: utf-8 #编码格式,设置邮件正文的编码格式,因为邮件可以发送富文本[即html代码,需要浏览器解析,解析使用什么编码通过该属性指定]
properties: # 设置超时时间
mail:
smtp:
connectiontimeout: 5000
timeout: 3000
writetimeout: 5000
ssl: # 配置SSL 加密
# 本地测试
enable: false
required: false
# 开启debug模式,这样邮件发送过程的日志会在控制台打印出来,方便排查
debug: true
扩展:其他邮箱服务器的配置方式:
在 application.properties 中添加邮箱配置,不同的邮箱参数稍有不同,下面面列举几个常用邮箱配置。
163 邮箱配置
spring.mail.host=smtp.163.com // 邮箱服务器器地址
spring.mail.username=xxx@163.com // 用用户名
spring.mail.password=xxx // 密码
spring.mail.default-encoding=UTF-8
// 超时时间,可选
spring.mail.properties.mail.smtp.connectiontimeout=5000
spring.mail.properties.mail.smtp.timeout=3000
spring.mail.properties.mail.smtp.writetimeout=5000
126 邮箱配置
spring.mail.host=smtp.126.com
spring.mail.username=xxx@126.com
spring.mail.password=xxx
spring.mail.default-encoding=UTF-8
QQ 邮箱配置如下:
spring.mail.host=smtp.qq.com
spring.mail.username=xxx@qq.com
spring.mail.password=xxx
spring.mail.default-encoding=UTF-8
测试时需要将 spring.mail.username 和 spring.mail.password 改成自自己邮箱对应的登录名和密码,这里的密码不是邮箱的登录密码,是开启 POP3 之后设置的客户端授权密码。
测试工具类方法:
在日常使用的过程中,我们通常在邮件中加入图片或者附件来丰富邮件的内容。
发送 HTML 格式邮件
邮件发送支持以 HTML 语法去构建自定义的邮件格式,Spring Boot 支持使用用 HTML 发送邮件。
我们在 MailService 中添加支持 HTML 邮件发送的方法:
public void sendHtmlMail(String to, String subject, String content) {
MimeMessage message = mailSender.createMimeMessage();
try {
// true 表示需要创建一一个 multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
mailSender.send(message);
logger.info("html邮件发送成功");
} catch (MessagingException e) {
logger.error("发送html邮件时发生生异常!", e);
}
}
富文本邮件抄送使用:helper.addCc(cc) 来实现。
和文本邮件发送代码对比,富文本邮件发送使用 MimeMessageHelper 类,该类支持发送复杂邮件模板,支持文本、附件、HTML、图片等。
在测试类中构建 HTML 内容,测试发送:
@Test
public void testHtmlMail() throws Exception {
String content =
"<html>\n" +
"<body>\n" +
"<h3>hello world ! 这是一一封html邮件!</h3>\n" +
"</body>\n" +
"</html>";
mailService.sendHtmlMail("xxxx@xxx.com","这是一封HTML邮件", content);
}
代码中拼接出的 HTML 的 String 字符串交给 MimeMessageHelper 来处理理,最后由邮件客户端负责渲染显示内容。
发送带附件的邮件
在 MailService 添加 sendAttachmentsMail 方法,发送带附件的邮件主要是使用 FileSystemResource 对文件进行封装,再添加到 MimeMessageHelper 中。
public void sendAttachmentsMail (
String to, String subject,
String content, String filePath) {
MimeMessage message = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
FileSystemResource file = new FileSystemResource(new File(filePath));
String fileName = file.getFilename();
helper.addAttachment(fileName, file);
// helper.addAttachment("test"+fileName, file);
mailSender.send(message);
logger.info("带附件的邮件已经发送。");
} catch (MessagingException e) {
logger.error("发送带附件的邮件时发生生异常!", e);
}
}
添加多个附件可以使用多条 helper.addAttachment(fileName, file) 。
在测试类中添加测试方法:
@Test
public void sendAttachmentsMail() {
String filePath = "e:\\temp\\fastdfs-client-java-5.0.0.jar";
mailService.sendAttachmentsMail("xxx@xx.com", "主题:带附件的邮件", "有附件,请查收!", filePath);
}
附件可以是图片、压缩包、Word 等任何文件,但是邮件厂商一般都会对附件大小有限制,太大的附件建议使用网盘上传后,在邮件中给出链接。
发送带静态资源的邮件
邮件中的静态资源一般指图片,在 MailService 中添加 sendInlineResourceMail 方法:
public void sendInlineResourceMail(
String to, String subject,
String content, String rscPath, String rscId) {
MimeMessage message = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
FileSystemResource res = new FileSystemResource(new File(rscPath));
helper.addInline(rscId, res);
mailSender.send(message);
logger.info("嵌入静态资源的邮件已经发送。");
} catch (MessagingException e) {
logger.error("发送嵌入静态资源的邮件时发生异常!", e);
}
}
在测试类中添加测试方法:
@Test
public void sendInlineResourceMail() {
String rscId = "neo006";
String content = "<html><body>这是有图片的邮件:<img src='cid:" + rscId + "' ></body></html>";
String imgPath = "e:\\temp\\weixin.jpg";
mailService.sendInlineResourceMail("xxxx@xxxx.com", "主题:这是有图片的邮件", content, imgPath, rscId);
}
添加多个图片可以使用多条 img src=‘cid:“+ rscId +”’ > 和 helper.addInline(rscId, res) 来实现。
原文地址:https://blog.csdn.net/zhuge_long/article/details/140491550
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!