使用springboot发送复杂类型正文的邮件
时间:2022-07-23
本文章向大家介绍使用springboot发送复杂类型正文的邮件,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
缘起
日前,客户需要项目中有发送邮件功能,并且给了一个邮件模板是excel的
需要在邮件正文中按照这个模板显示出来,经过一般折腾,最后实现了这个功能,效果如下
可以看到是把excel模板内容插入到了邮件的正文中,那么这是如何实现的呢?
实现思路
在java中发送邮件,是可以采用模板功能的。大概思路也就是定义好一个模板,然后再模板的对应位置打上标记,再用代码给这些标记赋值就行。
模板类型以ftl结尾,一个可用的模板类似如下
可用看到,模板基本上就是一个html形式,那么下一步就是思考如何把一个excel转成html文件,这里可以用excel的另存为功能
另存为之后,可以在桌面看到html文件和css文件以及一些图片文件,这里html文件中引用了CSS,图片等,但是模板中好像是不能通过相对路径去引用这些文件的,需要采用绝对路径。这里有两种解决方案
- 把css中的内容全部copy到html文件中,然后统一copy到ftl模板文件中
- 通过在ftl文件中引用路径的位置定义标签,通过java代码的方式动态设置请求的绝对路径
我这里两种方式都采用了,css中的内容是全部copy到html文件中的,然后图片是路径是通过java代码动态设置的。
- 这里把css copy到html中保存的时候可能会提示你字符集不匹配,需要把一些看不懂的字符,类似mso-style-name:³£¹æ;这种给删掉<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>配置文件中配置springboot邮件发送支持配置
image.png - 关于如何在java代码中动态设置图片的请求绝对路径可以采用如下方式,
- 先在模板中定义标签
image.png
- 先在模板中定义标签
- 然后在java代码中获取项目的请求绝对路径,然后给这个标签赋值
image.png
- 然后在java代码中获取项目的请求绝对路径,然后给这个标签赋值
发送类
public void send(Message message) {
try {
//建立邮件消息
MimeMessage mainMessage = jms.createMimeMessage();
//用MimeMessageHelper组装复杂邮件,第二个参数为true,可以发送附件
MimeMessageHelper helper = new MimeMessageHelper(mainMessage, true);
FhdTemplateDto fhdTemplateDto = (FhdTemplateDto) message.getContent();
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
StringBuilder urlSb = new StringBuilder(request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/");
if (!StringUtils.isEmpty(request.getContextPath())) {
urlSb.append(request.getContextPath()).append("/");
}
urlSb.append("system/images/company_logo.png");
fhdTemplateDto.setLogo("<img src=" + urlSb.toString() + " height="81" width="133">");
Template template = freeMarkerConfigurationFactory.createConfiguration().getTemplate("emailTemplates/FhdMail.ftl");
String text = FreeMarkerTemplateUtils.processTemplateIntoString(template, fhdTemplateDto);
helper.setFrom(mailusername);
helper.setTo(message.getAddressee());
helper.setSubject(message.getTitle());
helper.setText(text, true);
//添加附件
// helper.addAttachment(message.getAttachmentFileName(), new File(message.getAttachmentFilePath()));
jms.send(mainMessage);
log.debug("发送成功");
} catch (Exception e) {
log.debug("发送失败", e);
}
}
Message
@Data
public class Message {
/**
* 消息标题
*/
private String title;
/**
* 收信人
*/
private String addressee;
/**
* 内容
*/
private Object content;
/**
* 附件名称
*/
private String attachmentFileName;
/**
* 附件路径
*/
private String attachmentFilePath;
}
模板文件(隐私问题不列出代码)
使用
参考:
https://blog.csdn.net/qq_40205116/article/details/83932316
https://blog.csdn.net/qq_31281189/article/details/97760951
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 腾讯云TKE-PV使用cos存储案例: 容器目录权限问题
- Vue3 究竟好在哪里?(和 React Hook 的详细对比)
- 前端「N皇后」递归回溯经典问题图解
- 深入 TypeScript 中的子类型、逆变、协变,进阶 Vue3 源码前必须搞懂的。
- Vue3 + TypeScript 实现递归菜单组件
- TypeScript 4.1 新特性:字符串模板类型,Vuex 终于有救了?
- TS 4.1 新特性实现 Vuex 无限层级命名空间的 dispatch 类型推断。
- egg.js踩坑记录(一)开始篇
- VUI创建日志(二)——防抖节流组件的实现
- 为你的VuePress博客添加GitTalk评论
- Go 中 Set 的实现方式
- Go 译文之词法分析与解析 Part Three
- React-Native踩坑记
- 【译】成为优秀程序员(和人类)的101个技巧
- 谈谈ES6语法(汇总中篇)