从头开始,并不意味着失败,相反,正是拥抱成功的第一步,即使还会继续失败
上一章简单介绍了 SpringBoot 整合 ES (四十二), 如果没有看过,请观看上一章
一. 发送邮件
关于发送邮件的功能和基础知识,老蝴蝶这儿就不重点讲解了。
一.一 前期准备, 获取邮件相应的信息
以 QQ 邮箱为例子, 首先登录 QQ邮箱 web 端, 点击设置
https://wx.mail.qq.com/account/index?sid=zYdOWYytOXku61hLAExYZgAA#/
在安全设置—> 生成授权码
扫描发送短信后,就会生成授权码, 是一个 字符串。
一.二 发送邮件的依赖
发送邮件 使用 spring-boot-starter-mail 依赖 的 org.springframework.mail.javamail.JavaMailSender 类
<!--添加 email 邮件发送-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-velocity</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
一.三 application.yml 配置信息
spring:
# 配置发送邮件# 配置发送邮件
mail:
host: smtp.qq.com # smtp.qq.com 对应的ip
username: Xxxxx@qq.com
password: Xxxx
port: 465
default-encoding: utf-8
protocol: smtp
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
ssl:
enable: true
socketFactory:
port: 465
class: javax.net.ssl.SSLSocketFactory
一.四 发送邮件接口和相应的服务
二. 邮件发送
@Value("${spring.mail.username}")
private String from;
@Resource
private JavaMailSender javaMailSender;
二.一 发送普通的文本
二.一.一 接口
/**
* 发送普通的文本消息
*
* @param toArr 发送人, 之间用 ,号分隔
* @param subject 发送主题
* @param content 发送的内容, 普通文本内容
*/
boolean sendSimpleMail(String[] toArr, String subject, String content);
二.一.二 接口实现
@Override
public boolean sendSimpleMail(String[] toArr, String subject, String content) {
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
simpleMailMessage.setTo(toArr);
simpleMailMessage.setSubject(subject);
simpleMailMessage.setText(content);
simpleMailMessage.setFrom(from);
// 发送时间
simpleMailMessage.setSentDate(new Date());
//发送信息
try {
javaMailSender.send(simpleMailMessage);
return true;
} catch (Exception e) {
log.error("componentAndSendReqeust simple mail error", e);
return false;
}
}
二.一.三 测试
@Test
public void simpleEmailTest() {
String[] toArr = new String[]{"1290513799@qq.com"};
emailService.sendSimpleMail(toArr, "发送测试简单文件", "一封简单的测试文件");
log.info(">>>发送邮件成功");
}
二.二 发送 html 消息
二.二.一 接口
/**
* 发送 HTML 消息
*
* @param toArr 发送人, 之间用 ,号分隔
* @param subject 发送主题
* @param content 发送的内容 ,html 形式
*/
boolean sendHtmlMail(String[] toArr, String subject, String content);
二.二.二 接口实现
@Override
public boolean sendHtmlMail(String[] toArr, String subject, String content) {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
try {
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
mimeMessageHelper.setTo(toArr);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(content, true);
mimeMessageHelper.setFrom(from);
//发送信息
javaMailSender.send(mimeMessage);
return true;
} catch (MessagingException e) {
log.error("componentAndSendReqeust mail error ", e);
return false;
}
}
二.二.三 测试
@Test
public void htmlEmailTest() {
String[] toArr = new String[]{"1290513799@qq.com"};
emailService.sendHtmlMail(toArr, "发送测试HTML文件", "<a href='https://wwww.baidu.com'>百度</a>");
log.info(">>>发送邮件成功");
}
二.三 发送 携带附件的 邮件
二.三.一 接口
/**
* 发送 携带附件的邮件
* @param toArr 发送人, 之间用 ,号分隔
* @param subject 发送主题
* @param content 发送的内容 ,html 形式
* @param filePaths 附件路径地址集合
* @return
*/
boolean sendAttachmentsMail(String[] toArr, String subject, String content,
List<String> filePaths);
二.三.二 接口实现
/**
* 附件邮件
* @param toArr 接收者邮件
* @param subject 邮件主题
* @param content HTML内容
* @param filePaths 附件路径
*/
@Override
public boolean sendAttachmentsMail(String[] toArr, String subject, String content,
List<String> filePaths) {
MimeMessage message = javaMailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setTo(toArr);
helper.setSubject(subject);
helper.setText(content, true);
helper.setFrom(from);
if (!CollectionUtils.isEmpty(filePaths)){
for (String filePath : filePaths) {
FileSystemResource file = new FileSystemResource(new File(filePath));
String fileName = file.getFilename();
// 可以添加多个复杂
helper.addAttachment(fileName, file);
}
}
javaMailSender.send(message);
return true;
} catch (MessagingException e) {
log.error("componentAndSendReqeust mail error ", e);
return false;
}
}
二.三.三 测试
有两个图片文件
@Test
public void sendAttachmentsMailTest() {
String[] toArr = new String[]{"1290513799@qq.com"};
emailService.sendAttachmentsMail(toArr, "发送附件文件", "<a href='https://wwww.baidu.com'>百度</a>",
Arrays.asList("E:\\Alan\\logoold.jpg", "E:\\Alan\\logo.jpg"));
log.info(">>>发送邮件成功");
}
二.四 模板邮件消息
一般我们发送给用户的邮件信息,都是一个固定的模板。 我们这里用 Velocity 模板
关于 Velocity 的使用, 可以看 老蝴蝶之前写的文章: SpringBoot整合Velocity(十二)
定义一个模板内容:
二.四.一 模板邮件接口
/**
* 发送邮件 velocity 模板邮件
* @param toArr 发送人
* @param subject 主题
* @param dataMap 发送模板邮件填充数据
* @param templateName 模板名称
*/
boolean sendVelocityMail(String[] toArr, String subject, Map<String, Object> dataMap, String templateName);
二.四.二 模板接口实现
private VelocityEngine velocityEngine;
@PostConstruct
public void initVelocityEngine() {
velocityEngine = new VelocityEngine();
Properties p = new Properties();
velocityEngine.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
velocityEngine.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
// 配置资源
// velocityEngine.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, "/usr/local/templates/");
velocityEngine.init(p);
}
@Override
public boolean sendVelocityMail(String[] toArr, String subject, Map<String, Object> dataMap, String templateName) {
try {
String velocityMailText = getVelocityMailText(dataMap,templateName);
return sendHtmlMail(toArr, subject, velocityMailText);
} catch (Exception ex) {
log.error(">>>componentAndSendReqeust email is error,", ex);
return false;
}
}
private String getVelocityMailText(Map<String, Object> dataMap, String templateName) {
VelocityContext velocityContext = new VelocityContext(dataMap);
StringWriter writer = new StringWriter();
velocityEngine.mergeTemplate(templateName, "UTF-8", velocityContext, writer);
return writer.toString();
}
二.四.三 测试模板
@Test
public void velocityTest() {
String[] toArr = new String[]{"1290513799@qq.com"};
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("line",System.lineSeparator());
dataMap.put("title","你叫什么名称");
dataMap.put("content","我叫岳泽霖,是一个快乐的程序员");
emailService.sendVelocityMail(toArr, "发送velocity 文件", dataMap,"interface_tenwhy.vm" );
log.info(">>>发送测试邮件成功");
}
发送邮件时,如果发送失败, 会抛出相应的异常。 如 发送人授权信息不对,接收人信息不对等。
三. 其它邮件的配置
常见的还有 163 ,google 邮件
163 的配置
spring:
mail:
host: smtp.163.com
port:
username: xxxx@163.com
password: ************
google 邮箱配置
spring:
mail:
host: smtp.gmail.com
port: 465
username: xxxxx@gmail.com
password: ****************
本章节的代码放置在 github 上:
https://github.com/yuejianli/springboot/tree/develop/SpringBoot_Email
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!