背景
- 项目使用的事ruoyi低代码开发平台
- ruoyi中有常见的web端下载excel的方式,但是这种方式是直接把输出流写到一个response中,而不是给一个outputstream,如果是给一个outputstream的话,就可以写入到一个固定的文件中去了
解决思路
- 原本打算使用项目中自带的easyexcel框架,但是后来发现有和springboot集成的框架方案
spring-boot-starter-mail
- 将excel写入到本地或者服务器,使用邮件发送之后再删除
- 需要注意的是:
本地和服务器的盘符和路径不一致
引入依赖
- 记得在common共用的模块中引入这个依赖,因为后续的
工具类
会写在这个模块下
<!--邮件-->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
配置
- 这个有一个属性
path
,这个不是spring-boot-starter-mail自带的属性,使我们自定义的属性,用于保存需要发送邮件的附件的位置
- 这一块是tls加密,但是有一些服务器是不允许加密的,这块配置去掉就可以了
spring:
mail:
host: smtp.qq.com # 设置邮箱主机(服务商),这里使用QQ邮件服务器
username: 1184266892@qq.com # 设置用户名 - 发送方
password: xjirjxexiadciafb # 该处的密码是QQ邮箱开启SMTP的授权码而非QQ密码
path: @profile.email.path@ # 设置附件路径
properties:
mail:
smtp:
auth: true # 必须进行授权认证,它的目的就是阻止他人任意乱发邮件
starttls: #SMTP加密方式:连接到一个TLS保护连接
enable: true
required: true
@profile.email.path@ 动态路径
这个变量需要搭配profile环境文件使用,这里不详述了,可以搜索 多环境profile配置就可以找到相关内容
在admin的pom文件中,需要配置上述的邮件附件路径,不同环境的路径不同
邮件工具类
邮件工具类的链接
配置一个获取路径的工具类
- @Component:被ioc容器识别
- 路径定义成静态变量,方便静态方法获取
- @Value 使用配置文件的属性,进行静态属性注入
@Component
@Getter
public class SysDirectoryUtil {
private static String systemEmailDirectory;
@Value("${spring.mail.path}")
public void setSystemEmailDirectory(String emailDirectory) {
SysDirectoryUtil.systemEmailDirectory = emailDirectory;
}
public static String getSystemEmailDirectory() {
return systemEmailDirectory;
}
}
使用示例
- 获取数据list
- 配置邮件相关配置
- 获取附件地址,存储excel
- 从指定位置获取附件,发送邮件
- 发送成功之后删除附件
// 获取最新的成本自动化和mes数据缺失的部分
List<MaterialInfo> materialInfos = materialInfoService.selectLastDataFormMes();
List<String> tos = new ArrayList<>();
tos.add("111@163.com");
tos.add("222@163.com");
String subject = "主题";
String content = "内容";
List<File> fileList = new ArrayList<>();
// 设置文件路径并存储文件
String systemEmailDirectory = SysDirectoryUtil.getSystemEmailDirectory();
// 获取时间戳
long time = System.currentTimeMillis();
String fileName = "新增物料信息_"+ time +".xlsx";
// 创建文件
File file = new File(systemEmailDirectory , fileName);
// 将materialInfos 写入到file中
EasyExcel.write(file, MaterialInfo.class)
.useDefaultStyle(true)
.sheet("新增物料信息")
.doWrite(materialInfos);
// 添加附件
if (size > 0){
fileList.add(file);
EmailHelper.sendEmailMassWithAttachment(tos,subject,content,fileList);
}
// 删除文件
file.delete();