共计 6234 个字符,预计需要花费 16 分钟才能阅读完成。
本文简介
本文次要介绍了应用 SpringBoot 发送邮件,次要蕴含如何获取发送邮件的受权码,这里以 QQ 邮箱为例,而后介绍了性能如何实现,包含通过模板发送邮件,发送带图片的邮件,发送带附件的邮件,发送带有多个附件的邮件。
获取 SMTP 受权码
应用 SPringBoot 发送邮件呢,首先须要发送邮件的地址开明 SMTP 服务,并获取到对应的受权码,接下来就以 QQ 邮箱为例,简略的介绍一下怎么可通 SMTP,并且获取到受权码值。具体操作如下图所示:
- 首先登录 QQ 邮箱网页版,而后在设置外面找到账户
- 能够看到下图中的一堆服务,咱们只有开明 SMTP 服务即可。
- QQ 邮箱开明 SMTP 服务须要应用密保手机发送短信码验证,我在发送的时候,提醒
1069070069
这个号码已敞开服务,能够发送上面的10690329021269
。
- 验证胜利后,能够看到对应的受权码,咱们复制进去,留着备用。😺
发送邮件性能实现
下面咱们曾经获取到 QQ 邮箱的 STMP 服务的受权码,接下来咱们看看怎么实现性能。
-
pom.xml 增加援用
<!-- 配置 thymeleaf 模板依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!-- 反对发送邮件依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> -
配置发送邮件的 application
spring mail: default-encoding: UTF-8 host: smtp.qq.com username: 你的邮箱地址 password: 你的受权码 port: 22 protocol: smtp properties: mail: smtp: ssl: enable: true socketFactory: port: 465 class: javax.net.ssl.SSLSocketFactory
这里的配置文件是以 QQ 邮箱的为例,如果是其余的邮箱,能够参考表格里的 SMTP 服务器地址和对应的端口号。
邮箱类型 | SMTP 服务器地址 | 端口号 |
---|---|---|
QQ 邮箱 | smtp.qq.com | 465 或 587 |
sina 邮箱 | smtp.sina.cn | 465 或 587 |
126 邮箱 | smtp.126.com | 465 或 994 |
aliyun 邮箱 | smtp.aliyun.com | 465 或 994 |
163 邮箱 | smtp.163.com | 465 或 994 |
yeah 邮箱 | smtp.yeah.net | 465 或 994 |
- 在
config.bean
包下编写发送邮件类EmailBean.java
👇
package com.maple.demo.config.bean; | |
import lombok.AllArgsConstructor; | |
import lombok.Builder; | |
import lombok.Data; | |
import lombok.RequiredArgsConstructor; | |
import org.thymeleaf.context.Context; | |
import java.util.List; | |
/** | |
* @author 笑小枫 | |
* @date 2022/7/22 | |
*/ | |
@Data | |
@Builder | |
@AllArgsConstructor | |
@RequiredArgsConstructor | |
public class EmailBean { | |
/** | |
* 填充内容 | |
*/ | |
private Context context; | |
/** | |
* 应用模板,和 text 互斥,优先应用模板,模板不存在发送 text 内容 | |
*/ | |
private String templateName; | |
/** | |
* 发送给谁 | |
*/ | |
private String toUser; | |
/** | |
* 抄送给谁 | |
*/ | |
private String[] ccUser; | |
/** | |
* 邮件主体 | |
*/ | |
private String subject; | |
/** | |
* 邮件内容,和 templateName 互斥,优先应用模板,模板不存在发送 text 内容 | |
*/ | |
private String text; | |
/** | |
* 附件列表 | |
*/ | |
private List<String> attachmentList; | |
} |
- 在
util
包下编写邮件的工具类EmailUtil.java
👇
package com.maple.demo.util; | |
import com.maple.demo.config.bean.EmailBean; | |
import lombok.RequiredArgsConstructor; | |
import org.apache.commons.lang3.StringUtils; | |
import org.springframework.beans.factory.annotation.Value; | |
import org.springframework.core.io.FileSystemResource; | |
import org.springframework.mail.javamail.JavaMailSender; | |
import org.springframework.mail.javamail.MimeMessageHelper; | |
import org.springframework.scheduling.annotation.Async; | |
import org.springframework.stereotype.Service; | |
import org.thymeleaf.TemplateEngine; | |
import javax.mail.MessagingException; | |
import javax.mail.internet.MimeMessage; | |
/** | |
* @author 笑小枫 | |
* @date 2022/7/22 | |
*/ | |
@Service | |
@RequiredArgsConstructor | |
public class EmailUtil { | |
private final JavaMailSender mailSender; | |
private final TemplateEngine templateEngine; | |
@Value("${spring.mail.username}") | |
private String from; | |
@Async | |
public void sendEmail(EmailBean emailBean) { | |
try { | |
// 解决附件名称过长导致的附件名称乱码问题 | |
System.setProperty("mail.mime.splitlongparameters", "false"); | |
// 定义邮件信息 | |
MimeMessage message = mailSender.createMimeMessage(); | |
MimeMessageHelper helper; | |
helper = new MimeMessageHelper(message, true); | |
helper.setFrom(from); | |
helper.setTo(emailBean.getToUser()); | |
helper.setSubject(emailBean.getSubject()); | |
if (emailBean.getCcUser() != null && emailBean.getCcUser().length > 0) {helper.setCc(emailBean.getCcUser()); | |
} | |
// 如果存在模板,定义邮件模板中的内容,context 的内容对应 email.html 的 ${project}占位的内容 | |
if (emailBean.getContext() != null && StringUtils.isNotBlank(emailBean.getTemplateName())) {String emailContent = templateEngine.process(emailBean.getTemplateName(), emailBean.getContext()); | |
helper.setText(emailContent, true); | |
} else {helper.setText(emailBean.getText()); | |
} | |
// 如果存在附件,定义邮件的附件 | |
if (emailBean.getAttachmentList() != null && !emailBean.getAttachmentList().isEmpty()) {for (String attachment : emailBean.getAttachmentList()) {FileSystemResource file = new FileSystemResource(attachment); | |
if (StringUtils.isNotBlank(file.getFilename())) {helper.addAttachment(file.getFilename(), file); | |
} | |
} | |
} | |
mailSender.send(message); | |
} catch (MessagingException e) {e.printStackTrace(); | |
} | |
} | |
} |
-
配置发送邮件的模板
在resources
目录下创立templates
目录。创立email.html
模板。这里能够依据本人的需要配置 html 页面,这种形式是通过配置 thymeleaf 模板的模式进行发送,如果间接能够发送文本内容即可,则不必配置。
如果配置的模版比拟多,且常常变动或者由业务人员配置,能够间接增加一张邮件模版配置表,前端通过富文本的模式进行页面配置,而后取邮件模版的配置表内容即可。绝对简单一些,这里只说一下思路,不再进行演示,有什么疑难能够留言或者分割我。
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <title>xiaoxiaofeng</title> <style> body { text-align: center; margin-left: auto; margin-right: auto; } #main {text-align: center;} </style> </head> <body> <div id="main"> <h3> 欢送应用 <span th:text="${project}"></span></h3> 您的验证码是:<h2><span th:text="${code}"></span></h2> <span> 本站由 <a href="https://www.xiaoxiaofeng.com" target="_blank"> 笑小枫(https://www.xiaoxiaofeng.com)</a> 提供技术支持 </span> </div> </body> </html>
功能测试
编写一个发送邮件的拆穿 controller,次要演示两种模式发送邮件
- 通过纯文本发送邮件,蕴含附件
- 通过 html 模版发送邮件
package com.maple.demo.controller; | |
import com.maple.demo.config.bean.EmailBean; | |
import com.maple.demo.util.EmailUtil; | |
import io.swagger.annotations.Api; | |
import io.swagger.annotations.ApiOperation; | |
import lombok.AllArgsConstructor; | |
import org.springframework.web.bind.annotation.PostMapping; | |
import org.springframework.web.bind.annotation.RequestMapping; | |
import org.springframework.web.bind.annotation.RestController; | |
import org.thymeleaf.context.Context; | |
import java.util.ArrayList; | |
import java.util.List; | |
/** | |
* @author 笑小枫 | |
* @date 2022/7/22 | |
*/ | |
@RestController | |
@AllArgsConstructor | |
@RequestMapping("/example") | |
@Api(tags = "实例演示 - 发送邮件") | |
public class TestSendEmailController { | |
private final EmailUtil emailUtil; | |
@PostMapping("/sendEmailText") | |
@ApiOperation(value = "发送纯文本带附件的邮件") | |
public void sendEmailText(String text) {List<String> attachmentList = new ArrayList<>(); | |
// 定义绝对路径 | |
attachmentList.add("D:\\xiaoxiaofeng.jpg"); | |
// 定义相对路径 | |
attachmentList.add("src/main/resources/templates/email.html"); | |
EmailBean emailBean = EmailBean.builder() | |
.text(text) | |
.subject("欢送应用笑小枫集体博客") | |
.toUser("1150640979@qq.com") | |
.attachmentList(attachmentList) | |
.build(); | |
emailUtil.sendEmail(emailBean); | |
} | |
@PostMapping("/sendEmailTemplate") | |
@ApiOperation(value = "依据 html 模板发送验证码邮件") | |
public void sendEmailTemplate() {Context context = new Context(); | |
context.setVariable("project", "笑小枫集体博客"); | |
// 生成 6 位数字验证码 | |
String code = String.valueOf((int) (Math.random() * 900000 + 100000)); | |
context.setVariable("code", code); | |
EmailBean emailBean = EmailBean.builder() | |
.context(context) | |
.templateName("email") | |
.subject("笑小枫发送验证码") | |
.toUser("1150640979@qq.com") | |
.build(); | |
emailUtil.sendEmail(emailBean); | |
} | |
} |
应用咱们的接口服务平台进行调用
纯文本的邮件的测试后果👇,能够看到增加的两个附件。
通过 html 模版发送邮件的测试后果👇
对于笑小枫💕
本章到这里完结了,喜爱的敌人关注一下我呦😘😘,大伙的反对,就是我保持写下去的能源。
微信公众号:笑小枫
笑小枫集体博客:https://www.xiaoxiaofeng.com
本文源码:https://github.com/hack-feng/maple-demo