依赖
<!-- Spring Boot 邮件依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!--freemarker制作Html邮件模板依赖包-->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
</dependency>
邮件模板
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>邮件</title>
<style>
table {
border: 3px solid black;
border-spacing: 0;
border-collapse: collapse;
}
td {
border: 3px solid black;
padding: 10px;
text-align: center;
}
</style>
</head>
<body>
<div style="font-size: 24px">
<div style="border-bottom: 3px solid #eee; margin-bottom: 15px">[[${email.date}]] 农安试验场原始数据上传情况</div>
<table>
<tr style="font-weight: bold">
<td>TEVG System</td>
<td>空间总数据量 Summe:[[${email.amount}]]</td>
<td colspan="3">[[${email.date}]]</td>
</tr>
<tr style="font-weight: bold">
<td>VDS Nr.</td>
<td>日期Date-时间Time</td>
<td>文件夹大小 Size/M</td>
<td>迁移状态 Upload Status</td>
</tr>
<tr th:each="data:${email.list}">
<td><a th:href="${data.codeUrl}">[[${data.code}]]</a></td>
<td><a th:href="${data.dateUrl}">[[${data.date}]]</a></td>
<td>[[${data.folderSize}]]</td>
<td>[[${data.migrations}]]</td>
</tr>
</table>
</div>
</body>
</html>
邮件接口
public interface SmtpMailService {
/**
* 发送文本邮件
*
* @param to 收件人地址
* @param subject 邮件主题
* @param content 邮件内容
* @param cc 抄送地址
*/
void sendSimpleMail(List<String> to, String subject, String content, List<String> cc);
/**
* 发送HTML邮件
*
* @param to 收件人地址
* @param subject 邮件主题
* @param content 邮件内容
* @param cc 抄送地址
* @throws MessagingException 邮件发送异常
*/
void sendHtmlMail(List<String> to, String subject, String content, List<String> cc);
/**
* 发送带附件的邮件
*
* @param to 收件人地址
* @param subject 邮件主题
* @param content 邮件内容
* @param filePath 附件地址
* @param cc 抄送地址
* @throws MessagingException 邮件发送异常
*/
void sendAttachmentsMail(List<String> to, String subject, String content, List<String> filePath, List<String> cc);
/**
* 发送正文中有静态资源的邮件
*
* @param to 收件人地址
* @param subject 邮件主题
* @param content 邮件内容
* @param rscPath 静态资源地址
* @param rscId 静态资源id
* @param cc 抄送地址
* @throws MessagingException 邮件发送异常
*/
void sendResourceMail(List<String> to, String subject, String content, String rscPath, String rscId, List<String> cc);
邮件接口实现
@Service
public class SmtpMailServiceImpl implements SmtpMailService {
@Autowired
private IVwEmailServerService vwEmailServerService;
private String from;
/**
* 发送文本邮件
*
* @param to 收件人地址
* @param subject 邮件主题
* @param content 邮件内容
* @param cc 抄送地址
*/
@Override
public void sendSimpleMail(List<String> to, String subject, String content, List<String> cc) {
JavaMailSenderImpl jms = getMailSender();
MimeMessage mimeMessage = jms.createMimeMessage();
MimeMessageHelper helper;
try {
helper = new MimeMessageHelper(mimeMessage, true);
for (String addressee : to) {
helper.setFrom(from);
helper.setTo(addressee);
helper.setSubject(subject);
helper.setText(content);
if (!cc.isEmpty()) {
helper.setCc(cc.toString());
}
jms.send(mimeMessage);
}
} catch (MessagingException e) {
System.out.println(e);
}
}
/**
* 发送HTML邮件
*
* @param to 收件人地址
* @param subject 邮件主题
* @param content 邮件内容
* @param cc 抄送地址
*/
@Override
public void sendHtmlMail(List<String> to, String subject, String content, List<String> cc) {
JavaMailSenderImpl jms = getMailSender();
MimeMessage mimeMessage = jms.createMimeMessage();
MimeMessageHelper helper;
try {
helper = new MimeMessageHelper(mimeMessage, true);
for (String addressee : to) {
helper.setFrom(from);
helper.setTo(addressee);
helper.setSubject(subject);
helper.setText(content, true);
if (!cc.isEmpty()) {
String[] sup = cc.toArray(new String[cc.size()]);
helper.setCc(sup);
}
jms.send(mimeMessage);
}
} catch (MessagingException e) {
System.out.println(e);
}
}
/**
* 发送带附件的邮件
*
* @param to 收件人地址
* @param subject 邮件主题
* @param content 邮件内容
* @param filePath 附件地址
* @param cc 抄送地址
*/
@Override
public void sendAttachmentsMail(List<String> to, String subject, String content, List<String> filePath, List<String> cc) {
JavaMailSenderImpl jms = getMailSender();
MimeMessage mimeMessage = jms.createMimeMessage();
MimeMessageHelper helper;
try {
helper = new MimeMessageHelper(mimeMessage, true);
for (String address : to) {
helper.setFrom(from);
helper.setTo(address);
helper.setSubject(subject);
helper.setText(content, true);
if (!cc.isEmpty()) {
helper.setCc(cc.toString());
}
for (String attachment : filePath) {
FileSystemResource file = new FileSystemResource(new File(attachment));
String fileName = attachment.substring(filePath.lastIndexOf(File.separator));
helper.addAttachment(fileName, file);
}
jms.send(mimeMessage);
}
} catch (MessagingException e) {
System.out.println(e);
}
}
/**
* 发送正文中有静态资源的邮件
*
* @param to 收件人地址
* @param subject 邮件主题
* @param content 邮件内容
* @param rscPath 静态资源地址
* @param rscId 静态资源id
* @param cc 抄送地址
*/
@Override
public void sendResourceMail(List<String> to, String subject, String content, String rscPath, String rscId, List<String> cc) {
JavaMailSenderImpl jms = getMailSender();
MimeMessage mimeMessage = jms.createMimeMessage();
MimeMessageHelper helper;
try {
helper = new MimeMessageHelper(mimeMessage, true);
for (String address : to) {
helper.setFrom(from);
helper.setTo(address);
helper.setSubject(subject);
helper.setText(content, true);
if (!cc.isEmpty()) {
helper.setCc(cc.toString());
}
FileSystemResource res = new FileSystemResource(new File(rscPath));
helper.addInline(rscId, res);
jms.send(mimeMessage);
}
} catch (MessagingException e) {
System.out.println(e);
}
}
public JavaMailSenderImpl getMailSender() {
List<VwEmailServer> list = vwEmailServerService.selectVwEmailServerList(new VwEmailServer());
VwEmailServer emailServer = list.get(0);
JavaMailSenderImpl jms = new JavaMailSenderImpl();
//邮件服务器主机
jms.setHost(emailServer.getHost());
//邮件服务器端口
jms.setPort(emailServer.getPort());
//邮箱账号
jms.setUsername(emailServer.getUsername());
//邮箱密码
jms.setPassword(emailServer.getPassword());
//邮件协议 这里用的 smtp
jms.setProtocol(emailServer.getProtocol());
//编码
jms.setDefaultEncoding(emailServer.getEncoding());
Properties p = new Properties();
p.setProperty("mail.smtp.auth", "true");
p.setProperty("mail.smtp.starttls.enable", "true");
p.setProperty("mail.smtp.starttls.required", "true");
p.setProperty("mail.smtp.ssl.enable", "false");
//这里填发送邮箱对应的SMTP地址 ,忽略证书,信任域名
p.setProperty("mail.smtp.ssl.trust", emailServer.getHost());
p.setProperty("mail.display.sendmail", "邮件发送");
jms.setJavaMailProperties(p);
from = emailServer.getUsername();
return jms;
}
}
邮件发送
public class SendEmail {
@Autowired
private TemplateEngine templateEngine;
@Autowired
private IVwEmailService vwEmailService;
@Autowired
private ISysFileInfoService sysFileInfoService;
@Autowired
private SmtpMailService smtpMailService;
/**
* 发送文本邮件
* 含抄送人
*
* @param subject 邮件主题
* @param content 邮件内容
* @throws Exception 邮件发送异常
*/
public void sendTextEmailByCC(String subject, String content) throws Exception {
//收件人
List<String> to = vwEmailService.selectEmailByReceivingType(ReceivingType.RECIPIENT.getCode());
//抄送人
List<String> cc = vwEmailService.selectEmailByReceivingType(ReceivingType.CC_TO.getCode());
smtpMailService.sendSimpleMail(to, subject, content, cc);
}
/**
* 发送HTML模板邮件
* 含抄送人
*
* @throws Exception 邮件发送异常
*/
public void sendHtmlEmailByCC() throws Exception {
//收件人
List<String> to = vwEmailService.selectEmailByReceivingType(ReceivingType.RECIPIENT.getCode());
//抄送人
List<String> cc = vwEmailService.selectEmailByReceivingType(ReceivingType.CC_TO.getCode());
//获取邮件vo
FromEmailVo vo = getfromEmailVo();
// 通过 Context 构造模版中变量需要的值
Context context = new Context();
context.setVariable("email", vo);
//模版进行渲染
String emailTemplate = emailTemplate(context);
smtpMailService.sendHtmlMail(to, DateUtils.datePath() + " 农安试验场原始数据上传情况", emailTemplate, cc);
}
/**
* 发送附件邮件
* 含抄送人
*
* @param subject 邮件主题
* @param content 邮件内容
* @param attachment 附件
* @throws Exception 邮件发送异常
*/
public void sendAttachmentByCC(String subject, String content, List<String> attachment) throws Exception {
//收件人
List<String> to = vwEmailService.selectEmailByReceivingType(ReceivingType.RECIPIENT.getCode());
//抄送人
List<String> cc = vwEmailService.selectEmailByReceivingType(ReceivingType.CC_TO.getCode());
smtpMailService.sendAttachmentsMail(to, subject, content, attachment, cc);
}
/**
* 获取封装的邮件vo
*
* @return
*/
public FromEmailVo getfromEmailVo() throws Exception {
String uploadPath = RuoYiConfig.getUploadPath();
List<SysFileInfo> sysFileInfos = sysFileInfoService.selectFileName();
List<EmailDataVo> gpsList = new ArrayList<>();
Long amount = 0L;
for (SysFileInfo fi : sysFileInfos) {
File file = new File(uploadPath + File.separator + fi.getExperimentName() + File.separator + "log" + File.separator + fi.getFileTime());
//判断当天是否上传过数据
if (file.exists() && file.isDirectory()) {
//获取文件夹大小
long totalSizeOfFilesInDir = getTotalSizeOfFilesInDir(file);
Double fileSizeMb = YmlUtil.getFileSizeMb(totalSizeOfFilesInDir);
amount += totalSizeOfFilesInDir;
EmailDataVo vo = new EmailDataVo();
vo.setCode(fi.getExperimentName());
vo.setCodeUrl(fi.getExperimentName() + "/" + "log");
vo.setGpsUrl(fi.getExperimentName() + "/" + "log" + "/" + fi.getFileTime());
vo.setDate(fi.getFileTime());
vo.setFolderSize(fileSizeMb);
gpsList.add(vo);
}
}
FromEmailVo vo = new FromEmailVo();
//字节转换
String fileSize = YmlUtil.getFileSizeString(amount);
vo.setAmount(fileSize);
vo.setDate(DateUtils.datePath());
List<EmailDataVo> list = new ArrayList<>();
for (EmailDataVo gp : gpsList) {
EmailDataVo ed = new EmailDataVo();
ed.setCode(gp.getCode());
//外部链接
ed.setCodeUrl("https://www.baidu.com");
ed.setDate(gp.getDate());
//外部链接
ed.setDateUrl("https://www.baidu.com");
ed.setTrace(gp.getTrace());
ed.setFolderSize(gp.getFolderSize());
ed.setMigrations("迁移完成 Upload Finished");
list.add(ed);
}
vo.setList(list);
return vo;
}
/**
* 返回文件或文件夹大小
*
* @param file
* @return
*/
private long getTotalSizeOfFilesInDir(File file) {
if (file.isFile()) {
return file.length();
}
final File[] children = file.listFiles();
long total = 0;
if (children != null) {
for (final File child : children) {
total += getTotalSizeOfFilesInDir(child);
}
}
return total;
}
/**
* html模板转字符串
*
* @param context
* @return
*/
public String emailTemplate(Context context) {
// 使用TemplateEngine 对模版进行渲染(Thymeleaf 模版默认位置是 resources/templates)
String template = "template/email-template.html";
return templateEngine.process(template, context);
}
}
结果