【springboot】springboot发送email(文本/html格式)邮件
前言
现在发送邮件是一个网站必备的功能,比如注册激活,或者忘记密码等等都需要发送邮件。正常我们会用JavaMail相关api来写发送邮件的相关代码,但现在springboot提供了一套更简易使用的封装。也就是我们使用SpringBoot来发送邮件的话,代码就简单许多,毕竟SpringBoot是开箱即用的 ,它提供了什么,我们了解之后觉得可行,就使用它,自己没必要再写原生的。
实践
导入依赖pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
配置发送方信息
我们需要在SpringBoot配置文件(application.yml)中配置发送方的信息,包括以下信息:
用户名:也就是我们的邮箱账号
密码:我们刚刚生成的授权码
邮箱主机:配置使用哪个邮箱服务器发送邮件
还有等等其他可选配置,在下面配置代码中,大家需要填写自己的用户名、密码、from(和用户名一样)。
spring:
mail:
host: mail.xxxx.com
#发送邮件的邮箱地址
username: hadoop
#客户端授权码,不是邮箱密码,这个在qq邮箱设置里面自动生成的
password: a5ve
properties.mail.smtp.port: 587 #端口号465或587
from: hadoop@xxx.com # 发送邮件的地址,和上面username一致
default-encoding: utf-8
# 收件人 这个是自定义的
to: xxx@xxx.com, op@xxx.com
MailDO
public class MailDO {
/**
* 标题
*/
private String title;
/**
* 内容
*/
private String content;
/**
* 接收人邮箱
*/
private String[] email;
/**
* 附加,value 文件的绝对地址/动态模板数据
*/
private Map<String, Object> attachment;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String[] getEmail() {
return email;
}
public void setEmail(String[] email) {
this.email = email;
}
public Map<String, Object> getAttachment() {
return attachment;
}
public void setAttachment(Map<String, Object> attachment) {
this.attachment = attachment;
}
@Override
public String toString() {
return "MailDO{" +
"title='" + title + '\'' +
", content='" + content + '\'' +
", email=" + Arrays.toString(email) +
", attachment=" + attachment +
'}';
}
}
EmailService
我们需要自己封装邮件服务,这个服务只是便于Controller层调用,也就是根据客户端发送的请求来调用,封装三种邮件服务
- 发送普通文本邮件
- 发送HTML邮件:一般在注册激活时使用
- 发送带附件的邮件:可以发送图片等等附件
public interface EmailService {
/**
* 发送
* @param mailDO
*/
void sendTextMail(MailDO mailDO);
/**
* 发送html邮件
* @param mailDO
* @param isShowHtml
*/
void sendHtmlMail(MailDO mailDO,boolean isShowHtml);
/**
* 发送Template邮件
* @param mailDO
*/
void sendTemplateMail(MailDO mailDO);
}
EmailServiceImpl
@Service
public class EmailServiceImpl implements EmailService {
private final static Logger log = LoggerFactory.getLogger(EmailServiceImpl.class);
//template模板引擎
@Autowired
private TemplateEngine templateEngine;
@Autowired
private JavaMailSender javaMailSender;
@Value("${spring.mail.from}")
private String from;
/**
* 纯文本邮件
* @param mail
*/
@Async
@Override
public void sendTextMail(MailDO mail){
//建立邮件消息
SimpleMailMessage message = new SimpleMailMessage();
// 发送人的邮箱
message.setFrom(from);
//标题
message.setSubject(mail.getTitle());
//发给谁 对方邮箱
message.setTo(mail.getEmail());
//内容
message.setText(mail.getContent());
try {
//发送
javaMailSender.send(message);
} catch (MailException e) {
log.error("纯文本邮件发送失败->message:{}",e.getMessage());
throw new RuntimeException("邮件发送失败");
}
}
/**
* 发送的邮件是富文本(附件,图片,html等)
* @param mailDO
* @param isShowHtml 是否解析html
*/
@Async
@Override
public void sendHtmlMail(MailDO mailDO, boolean isShowHtml) {
try {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
//是否发送的邮件是富文本(附件,图片,html等)
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage,true);
messageHelper.setFrom(from);// 发送人的邮箱
messageHelper.setTo(mailDO.getEmail());//发给谁 对方邮箱
messageHelper.setSubject(mailDO.getTitle());//标题
messageHelper.setText(mailDO.getContent(),isShowHtml);//false,显示原始html代码,无效果
//判断是否有附加图片等
if(mailDO.getAttachment() != null && mailDO.getAttachment().size() > 0){
mailDO.getAttachment().entrySet().stream().forEach(entrySet -> {
try {
File file = new File(String.valueOf(entrySet.getValue()));
if(file.exists()){
messageHelper.addAttachment(entrySet.getKey(), new FileSystemResource(file));
}
} catch (MessagingException e) {
log.error("附件发送失败->message:{}",e.getMessage());
throw new RuntimeException("附件发送失败");
}
});
}
//发送
javaMailSender.send(mimeMessage);
log.info("富文本邮件发送成功,from: {}, to: {}",from,mailDO.getEmail());
} catch (MessagingException e) {
log.error("富文本邮件发送失败->message:{}",e.getMessage());
throw new RuntimeException("邮件发送失败");
}
}
/**
* 发送模板邮件 使用thymeleaf模板
* 若果使用freemarker模板
* Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);
* configuration.setClassForTemplateLoading(this.getClass(), "/templates");
* String emailContent = FreeMarkerTemplateUtils.processTemplateIntoString(configuration.getTemplate("mail.ftl"), params);
* @param mailDO
*/
@Async
@Override
public void sendTemplateMail(MailDO mailDO) {
try {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage,true);
// 发送人的邮箱
messageHelper.setFrom(from);
//发给谁 对方邮箱
messageHelper.setTo(mailDO.getEmail());
//标题
messageHelper.setSubject(mailDO.getTitle());
//使用模板thymeleaf
//Context是导这个包import org.thymeleaf.context.Context;
Context context = new Context();
//定义模板数据
context.setVariables(mailDO.getAttachment());
//获取thymeleaf的html模板
String emailContent = templateEngine.process("indexPatternMail.html",context); //指定模板路径
messageHelper.setText(emailContent,true);
//发送邮件
javaMailSender.send(mimeMessage);
} catch (MessagingException e) {
log.error("模板邮件发送失败->message:{}",e.getMessage());
throw new RuntimeException("邮件发送失败");
}
}
}
模板 mail.html
放在templates/mail目录下
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>title</title>
</head>
<body>
<h3>你看我<span style="font-size: 35px" th:text="${username}"></span>, 哈哈哈!</h3>
</body>
</html>