邮件模块开发完成版本
parent
2d7aca22d2
commit
286145e1cd
@ -0,0 +1,2 @@
|
||||
## 生成代码配置
|
||||
pom 注释 sharding相关的依赖,切换druid依赖,配置环境用 single
|
@ -0,0 +1,23 @@
|
||||
package me.zhengjie.common.json;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 用于进行一次性链接返回的转换Json体
|
||||
*/
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class OnceLinkMsgJsonContent implements Serializable {
|
||||
|
||||
/**
|
||||
* 链接地址
|
||||
*/
|
||||
private String onceLink;
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,80 @@
|
||||
package me.zhengjie.modules.mailtask.rest;
|
||||
|
||||
import cn.hutool.json.JSON;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import me.zhengjie.annotation.Log;
|
||||
import me.zhengjie.common.http.CommonResponse;
|
||||
import me.zhengjie.common.http.ResponseCode;
|
||||
import me.zhengjie.common.json.OnceLinkMsgJsonContent;
|
||||
import me.zhengjie.modules.mailtask.service.MailTaskService;
|
||||
import me.zhengjie.modules.tmpfilerecord.service.TempFileRecordService;
|
||||
import me.zhengjie.utils.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@Api(tags = "tmpfilerecord管理")
|
||||
@RequestMapping("/api/temp/file/")
|
||||
public class MailTaskController {
|
||||
|
||||
|
||||
private final MailTaskService mailTaskService;
|
||||
|
||||
@Autowired
|
||||
private TempFileRecordService tempFileRecordService;
|
||||
|
||||
/**
|
||||
* 上传多个文件, 返回一个一次性链接
|
||||
*/
|
||||
@Log("生成文件一次性链接")
|
||||
@PostMapping("link")
|
||||
@ApiOperation("生成一次性链接")
|
||||
public ResponseEntity<Object> buildRequest(@RequestParam(value = "files") MultipartFile[] files){
|
||||
// 校验上传是否有文件
|
||||
if (files!= null && files.length<= 0){
|
||||
return new ResponseEntity<>(CommonResponse.createByError(ResponseCode.NO_FILE_INPUT), HttpStatus.OK);
|
||||
}
|
||||
// 构建一次性链接
|
||||
String result = mailTaskService.buildOnceLinkForInputFile(files);
|
||||
// String jsonResult = null;
|
||||
OnceLinkMsgJsonContent content = new OnceLinkMsgJsonContent();
|
||||
if (StringUtils.isNotBlank(result)){
|
||||
// 进行json相关的转换
|
||||
content.setOnceLink(result);
|
||||
// JSON parse = JSONUtil.parse(content);
|
||||
//// if (parse != null){
|
||||
//// jsonResult = JSONUtil.toJsonStr(parse);
|
||||
//// }
|
||||
}else {
|
||||
return new ResponseEntity<>(CommonResponse.createByError(ResponseCode.NO_MATCH_ARGUMENT_SET), HttpStatus.OK);
|
||||
}
|
||||
|
||||
return new ResponseEntity<>(CommonResponse.createBySuccess(content), HttpStatus.OK);
|
||||
}
|
||||
|
||||
/**
|
||||
* 请求一次性链接,进行下载文件
|
||||
*/
|
||||
@Log("下载文件")
|
||||
@GetMapping("download")
|
||||
@ApiOperation("下载文件")
|
||||
public ResponseEntity<Object> downLoadFile(HttpServletResponse response, HttpServletRequest request, @RequestParam(value = "rand")String rand){
|
||||
// 校验参数,进行下载文件
|
||||
if (StringUtils.isBlank(rand)){
|
||||
return new ResponseEntity<>(CommonResponse.createByError(ResponseCode.EMPTY_ARGUMENT), HttpStatus.OK);
|
||||
}
|
||||
mailTaskService.downloadFilesByRandCode(rand, response, request);
|
||||
return new ResponseEntity<>(CommonResponse.createBySuccess(), HttpStatus.OK);
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package me.zhengjie.modules.mailtask.service;
|
||||
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
public interface MailTaskService {
|
||||
|
||||
|
||||
/**
|
||||
* 构建文件的一次性链接
|
||||
*
|
||||
* @param files 需要进行构建一次性链接的多个文件
|
||||
* @return 返回生成的一次性链接地址
|
||||
*/
|
||||
String buildOnceLinkForInputFile(MultipartFile[] files);
|
||||
|
||||
/**
|
||||
* 根据码来下载文件
|
||||
*
|
||||
* @param rand 验证下载码
|
||||
*/
|
||||
void downloadFilesByRandCode(String rand, HttpServletResponse response, HttpServletRequest request);
|
||||
}
|
@ -0,0 +1,159 @@
|
||||
package me.zhengjie.modules.mailtask.service.impl;
|
||||
|
||||
import cn.hutool.core.util.RandomUtil;
|
||||
import cn.hutool.poi.excel.ExcelUtil;
|
||||
import cn.hutool.system.OsInfo;
|
||||
import cn.hutool.system.SystemUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import me.zhengjie.modules.mailtask.service.MailTaskService;
|
||||
import me.zhengjie.modules.tmpfilerecord.domain.TempFileRecord;
|
||||
import me.zhengjie.modules.tmpfilerecord.service.TempFileRecordService;
|
||||
import me.zhengjie.modules.tmpfilerecord.service.dto.TempFileRecordDto;
|
||||
import me.zhengjie.utils.FileUtil;
|
||||
import me.zhengjie.utils.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
@Slf4j
|
||||
public class MailTaskServiceImpl implements MailTaskService {
|
||||
|
||||
/**
|
||||
* 上传的文件后缀
|
||||
*/
|
||||
private static final String FILE_END = ".xlsx";
|
||||
|
||||
/**
|
||||
* 文件路径的分隔
|
||||
*/
|
||||
private static final String FILE_SPLIT = ",";
|
||||
|
||||
/**
|
||||
* 远程服务器地址
|
||||
*/
|
||||
@Value("${remote.link.address}")
|
||||
private String remoteFileServerAddress;
|
||||
|
||||
/**
|
||||
* 远程上传临时存放文件地址 - linux环境
|
||||
*/
|
||||
@Value("${remote.link.file-base-path-linux}")
|
||||
private String remoteLinkFileBasePathLinux;
|
||||
|
||||
/**
|
||||
* 远程上传临时存放文件地址 - linux环境
|
||||
*/
|
||||
@Value("${remote.link.file-base-path-windows}")
|
||||
private String remoteLinkFileBasePathWindows;
|
||||
|
||||
/**
|
||||
* 远程上传临时存放文件地址 - linux环境
|
||||
*/
|
||||
@Value("${remote.link.file-base-path-mac}")
|
||||
private String remoteLinkFileBasePathMac;
|
||||
|
||||
@Autowired
|
||||
private TempFileRecordService tempFileRecordService;
|
||||
|
||||
|
||||
@Override
|
||||
public String buildOnceLinkForInputFile(MultipartFile[] files) {
|
||||
|
||||
// 路径build
|
||||
StringBuilder pathBuilder = new StringBuilder();
|
||||
|
||||
for (MultipartFile file : files) {
|
||||
String eachFilePath = buildFileWritePath();
|
||||
pathBuilder.append(eachFilePath);
|
||||
pathBuilder.append(FILE_SPLIT);
|
||||
if (StringUtils.isBlank(eachFilePath)){
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
file.transferTo(Paths.get(eachFilePath));
|
||||
} catch (IOException e) {
|
||||
log.error("============== [transferTo file fail, path is {} ] ==============", eachFilePath);
|
||||
}
|
||||
}
|
||||
// 任务记录
|
||||
TempFileRecord tempFileRecord = new TempFileRecord();
|
||||
// 保存当次任务生成的所有日志地址,然后保存在一次,用逗号分隔
|
||||
tempFileRecord.setFilePaths(pathBuilder.toString().substring(0, pathBuilder.length() - 1));
|
||||
// 默认保存7天
|
||||
tempFileRecord.setDays(7);
|
||||
|
||||
// 生成验证码
|
||||
tempFileRecord.setVerificationCode(RandomUtil.randomString(11));
|
||||
// 文件标记 - 生成但是未读
|
||||
tempFileRecord.setFileStatus(0);
|
||||
TempFileRecordDto tempFileRecordDto = tempFileRecordService.create(tempFileRecord);
|
||||
if (tempFileRecordDto == null){
|
||||
log.error(" ====== [ create TempFileRecordDto fail, please check it. tempFileRecord is {} ] =====", tempFileRecord.toString());
|
||||
return "";
|
||||
}
|
||||
// 生成需要请求的接口地址
|
||||
String verificationCode = tempFileRecordDto.getVerificationCode();
|
||||
if (StringUtils.isBlank(verificationCode)){
|
||||
log.error(" ====== [make verificationCode fail. please check .tempFileRecord is {} ] ======", tempFileRecord.toString());
|
||||
return "";
|
||||
}
|
||||
return remoteFileServerAddress + "?" + "rand=" + verificationCode;
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建文件上传保存路径
|
||||
*/
|
||||
private String buildFileWritePath(){
|
||||
// 获取环境配置信息
|
||||
OsInfo osInfo = SystemUtil.getOsInfo();
|
||||
if (osInfo.isWindows()){
|
||||
FileUtil.mkdir(remoteLinkFileBasePathWindows);
|
||||
// 构建存储文件
|
||||
return remoteLinkFileBasePathWindows + RandomUtil.randomString(11) + FILE_END;
|
||||
}else if (osInfo.isLinux()){
|
||||
FileUtil.mkdir(remoteLinkFileBasePathLinux);
|
||||
// 构建存储文件
|
||||
return remoteLinkFileBasePathLinux + RandomUtil.randomString(11) + FILE_END;
|
||||
}else if (osInfo.isMac()){
|
||||
FileUtil.mkdir(remoteLinkFileBasePathMac);
|
||||
// 构建存储文件
|
||||
return remoteLinkFileBasePathMac + RandomUtil.randomString(11) + FILE_END;
|
||||
}else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void downloadFilesByRandCode(String rand, HttpServletResponse response,HttpServletRequest request) {
|
||||
// 根据验证码查出需要的信息
|
||||
TempFileRecord tempFileRecord = tempFileRecordService.findByVerificationCode(rand.trim());
|
||||
// 切分需要的文件地址
|
||||
if (tempFileRecord!= null){
|
||||
String filePaths = tempFileRecord.getFilePaths();
|
||||
if (StringUtils.isNotBlank(filePaths)){
|
||||
String[] split = filePaths.split(FILE_SPLIT);
|
||||
if (split.length > 0){
|
||||
for (String eachPath : split) {
|
||||
// 每天一个文件写入要下载的请求中
|
||||
File file = new File(eachPath);
|
||||
FileUtil.downloadFile(request, response, file, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,63 @@
|
||||
package me.zhengjie;
|
||||
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import me.zhengjie.domain.EmailConfig;
|
||||
import me.zhengjie.domain.vo.EmailVo;
|
||||
import me.zhengjie.service.EmailService;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
|
||||
@Slf4j
|
||||
public class MailTest {
|
||||
|
||||
@Autowired
|
||||
private EmailService emailService;
|
||||
|
||||
private EmailConfig initConfig(){
|
||||
EmailConfig emailConfig = new EmailConfig();
|
||||
emailConfig.setHost("smtp.163.com"); // 邮件服务器SMTP地址
|
||||
emailConfig.setPort("465"); // 465
|
||||
emailConfig.setUser("qyxtoplink666"); // 用户名
|
||||
emailConfig.setPass("QGCUIPZVWZIDMWNG"); // 密码
|
||||
emailConfig.setFromUser("qyxtoplink666@163.com"); // 发件人邮箱
|
||||
|
||||
return emailConfig;
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试 邮箱配置 - 通过
|
||||
*/
|
||||
@Test
|
||||
public void testEmailConfig() throws Exception {
|
||||
EmailConfig emailConfig = initConfig();
|
||||
|
||||
EmailConfig old = new EmailConfig();
|
||||
old.setPass("xxx");
|
||||
emailService.config(emailConfig,old);
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试 邮件发送 - 通过
|
||||
*/
|
||||
@Test
|
||||
public void testEmailSend(){
|
||||
EmailConfig emailConfig = emailService.find();
|
||||
|
||||
|
||||
EmailVo emailVo = new EmailVo();
|
||||
emailVo.setTos(Arrays.asList("496186310@qq.com", "15158080631@163.com"));
|
||||
emailVo.setSubject("测试主题");
|
||||
emailVo.setContent("测试发送内容1");
|
||||
|
||||
emailService.send(emailVo, emailConfig);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue