概述

为了增强邮件内容展示的样式,可以将普通的文本邮件转换为HTML内容格式。

在Java中,可以通过页面模板技术来实现。具体来说,可以使用Thymeleaf模板。

具体实现

首先,在项目中引入Thymeleaf依赖:

<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.15.RELEASE</version>
</dependency>

其次,编写页面模板内容:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>TOP100车系车友圈精华帖双周增量监控</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<style type="text/css">
.znwh_tb {
border: 1px solid rgba(87, 84, 84, 0.99);
border-collapse:collapse;
}
.znwh_tb th,
.znwh_tb td {
border: 1px solid #545454;
padding: 3px 5px;
}
.znwh_tb th {
background-color:#DCDCDC;
}
</style>
</head>
<body style="margin: 0; padding: 0;">
<h3>精华帖统计</h3>
<p>时间:<span th:text="${startDate}"></span>-<span th:text="${endDate}"></span>,新增帖子数:<span th:text="${bbsIncrement}"></span></p> <h3>按阅读数倒序TOP<span th:text="${topSize}"></span>精华帖列表</h3>
  <table class="znwh_tb">
<tr>
<th>序号</th><th>发帖时间</th><th>加精日期</th><th>阅读数</th><th>评论数</th><th>点赞数</th><th>分享数</th><th>车系</th><th>标题</th>
</tr>
<tr th:each="bbs,bbsStat:${bbsList}">
<td th:text="${bbsStat.index+1}"></td>
<td th:text="${#dates.format(bbs.publishTimeDate, 'yyyy-MM-dd HH:mm:ss')}"></td>
<td th:text="${#dates.format(bbs.createdStimeDate, 'yyyy-MM-dd HH:mm:ss')}"></td>
<td th:text="${bbs.viewCount}"></td>
<td th:text="${bbs.commentCount}"></td>
<td th:text="${bbs.likeCount}"></td>
<td th:text="${bbs.shareCount}"></td>
<td th:text="${bbs.seriesName}"></td>
<td><a th:href="@{${bbs.originUrl}}" rel="noopener noreferrer"><span th:text="${bbs.title}"></span></a></td>
</tr>
</table>
<p><b>注:</b>完整数据详见附件文档。</p>
</body>
</html>

最后,加载页面模板渲染最终结果。

private static void buildTop100SeriesBbsMail(List<CyqBbs> bbsList) throws IOException {
//构造模板引擎
ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
resolver.setPrefix("templates/");//模板所在目录,相对于当前classloader的classpath。
resolver.setSuffix(".html");//模板文件后缀
TemplateEngine templateEngine = new TemplateEngine();
templateEngine.setTemplateResolver(resolver); //构造上下文(Model)
Context context = new Context();
context.setVariable("startDate", "10.21");
context.setVariable("endDate", "11.10");
context.setVariable("bbsIncrement", "100");
context.setVariable("topSize", "50");
context.setVariable("bbsList", bbsList); //渲染模板
String fileName = "dcd_result.html";
FileWriter write = new FileWriter(fileName);
templateEngine.process("dcd_top100series_bbs_monitor_mail", context, write);
write.close();
} public static void main(String[] args) throws IOException {
CyqBbs bbs = CyqBbs.builder()
.id(10)
.publishTimeDate(Calendar.getInstance().getTime())
.createdStime(LocalDateTime.now())
.behotTime(System.currentTimeMillis())
.seriesName("艾薇塔11")
.viewCount(100)
.commentCount(1000)
.likeCount(10)
.shareCount(2)
.originUrl("http://www.baidu.com")
.title("测试数据")
.build();
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = bbs.getCreatedStime().atZone(zoneId);
Date createdTimeDate = Date.from(zdt.toInstant());
bbs.setCreatedStimeDate(createdTimeDate);
List<CyqBbs> bbsList = Collections.singletonList(bbs);
buildTop100SeriesBbsMail(bbsList);
}

最终输出的结果如下:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>TOP100车系车友圈精华帖双周增量监控</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<style type="text/css">
.znwh_tb {
border: 1px solid rgba(87, 84, 84, 0.99);
border-collapse:collapse;
}
.znwh_tb th,
.znwh_tb td {
border: 1px solid #545454;
padding: 3px 5px;
}
.znwh_tb th {
background-color:#DCDCDC;
}
</style>
</head>
<body style="margin: 0; padding: 0;">
<h3>精华帖统计</h3>
<p>时间:<span>10.21</span>-<span>11.10</span>,新增帖子数:<span>100</span></p> <h3>按阅读数倒序TOP<span>50</span>精华帖列表</h3>
  <table class="znwh_tb">
<tr>
<th>序号</th><th>发帖时间</th><th>加精日期</th><th>阅读数</th><th>评论数</th><th>点赞数</th><th>分享数</th><th>车系</th><th>标题</th>
</tr>
<tr>
<td>1</td>
<td>2022-12-21 18:34:25</td>
<td>2022-12-21 18:34:26</td>
<td>100</td>
<td>1000</td>
<td>10</td>
<td>2</td>
<td>艾薇塔11</td>
<td><a href="http://www.baidu.com" rel="noopener noreferrer"><span>测试数据</span></a></td>
</tr>
</table>
<p><b>注:</b>完整数据详见附件文档。</p>
</body>
</html>

这里要注意: 不同的邮件客户端对于css样式的兼容效果不同,所以最好对常见的邮件客户端展示结果做一下充分的测试。

相比起使用页面模板技术实现的HTML邮件,直接手动输出HTML内容的方式就显得非常笨拙,且不容易维护。

如下是手动输出HTML字符串的实现方式参考:

private static String buildTop100SeriesBbsHtmlStr(List<CyqBbs> bbsList) {
StringBuilder builder = new StringBuilder();
builder.append("<html>");
builder.append("<head>");
builder.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />");
builder.append("<title>TOP100车系车友圈精华帖双周增量监控</title>");
builder.append("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"/>");
builder.append("<style type=\"text/css\">");
builder.append(".znwh_tb { border: 1px solid rgba(87, 84, 84, 0.99);border-collapse:collapse; }");
builder.append(".znwh_tb th,.znwh_tb td {border: 1px solid #545454; padding: 3px 5px; }");
builder.append(".znwh_tb th { background-color:#DCDCDC; }");
builder.append("</style>");
builder.append("</head>");
builder.append("<body style=\"margin: 0; padding: 0;\">");
builder.append("<h3>精华帖统计</h3>");
builder.append("<p>时间:").append("10.21").append("-").append("11.10").append(",新增帖子数:").append(100).append("</p>");
builder.append("<h3>按阅读数倒序TOP").append(50).append("精华帖列表</h3>");
builder.append("<table class=\"znwh_tb\">");
builder.append("<tr><th>序号</th><th>发帖时间</th><th>加精日期</th><th>阅读数</th><th>评论数</th><th>点赞数</th><th>分享数</th><th>车系</th><th>标题</th></tr>");
for (int i = 0; i < bbsList.size(); i++) {
CyqBbs bbs = bbsList.get(i);
builder.append("<tr>");
builder.append("<td>").append(i).append("</td>");
builder.append("<td>").append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(bbs.getPublishTimeDate())).append("</td>");
builder.append("<td>").append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(bbs.getBehotTime()))).append("</td>");
builder.append("<td>").append(bbs.getViewCount()).append("</td>");
builder.append("<td>").append(bbs.getCommentCount()).append("</td>");
builder.append("<td>").append(bbs.getLikeCount()).append("</td>");
builder.append("<td>").append(bbs.getShareCount()).append("</td>");
builder.append("<td>").append(bbs.getSeriesName()).append("</td>");
builder.append("<td>").append("<a href=\"").append(bbs.getOriginUrl()).append("\" rel=\"noopener noreferrer\">").append(bbs.getTitle()).append("</a>").append("</td>");
builder.append("</tr>");
}
builder.append("</table>");
builder.append("<p><b>注:</b>完整数据详见附件文档。</p>");
builder.append("</body>");
builder.append("</html>");
return builder.toString();
}

它们使用到的共同实体类定义如下:

@Data
@Builder
static class CyqBbs {
private Integer id;
private String title;
private String content;
private String originUrl;
private String authorName;
private String cover;
private String keywords;
private String tags;
private String seriesId;
private String seriesName;
private Integer commentCount;
private Integer likeCount;
private Integer viewCount;
private Integer playCount;
private Integer shareCount;
private Integer duration;
private Long publishTime;
private Date publishTimeDate;
private Long behotTime;
private LocalDateTime createdStime;
private Date createdStimeDate;
private LocalDateTime modifiedStime;
}

发送HTML模板邮件的更多相关文章

  1. spring 5.x 系列第20篇 ——spring简单邮件、附件邮件、内嵌资源邮件、模板邮件发送 (代码配置方式)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构说明 邮件发送配置类为com.heibaiyin ...

  2. spring 5.x 系列第19篇 ——spring简单邮件、附件邮件、内嵌资源邮件、模板邮件发送 (xml配置方式)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构说明 邮件发送配置文件为springApplic ...

  3. SpringBoot整合Mail发送邮件&发送模板邮件

    整合mail发送邮件,其实就是通过代码来操作发送邮件的步骤,编辑收件人.邮件内容.邮件附件等等.通过邮件可以拓展出短信验证码.消息通知等业务. 一.pom文件引入依赖 <dependency&g ...

  4. 使用javaMail和velocity来发送模板邮件

    之前在ssh项目中有用过javaMail和velocity来发送邮件,实现的效果如下所示. 这类邮件主要用于公司的推广宣传,比如商城的促销等场景. 今天打算将邮件模块也集成到ssm项目,也算是对之前做 ...

  5. 循序渐进VUE+Element 前端应用开发(33)--- 邮件参数配置和模板邮件发送处理

    在系统处理中,有时候需要发送邮件通知用户,如新增用户的邮件确认,密码找回,以及常规订阅消息.通知等内容处理,都可以通过邮件的方式进行处理.本篇随笔介绍结合VUE+Element 前端,实现系统的邮件参 ...

  6. SpringBoot系列(十四)集成邮件发送服务及邮件发送的几种方式

    往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件详解 SpringBoot系列(四)web静 ...

  7. ORACLE发送带附件邮件的二三事之一

    在oracle使用过程中,我们可以通过pl/sql生成数据文件,也可以通过spool on spool off生成,但某些环境下,我们需要通过存储过程处理数据,数据处理完,需要自动生成数据文件,手工导 ...

  8. linux 安装wordpress 无故往外发送大量垃圾邮件

    linux 安装wordpress 无故往外发送大量垃圾邮件 始末 表现出来的现象就是, 网站运行没多久,mysql服务就挂了,重启也无法启动起来,提示 No such file or dicrion ...

  9. EBS中使用JAVA方式发送HTML格式邮件

    转自huan.gu专栏:http://blog.csdn.net/gh320/article/details/17174769 EBS中使用JAVA方式发送HTML格式邮件 一.开发工具:JDevel ...

  10. linux使用mail发送外部smtp邮件

    linux使用mail发送外部smtp邮件 第一章 说明 参考资料: http://coolnull.com/2614.html linux自带的mail可以实现外部smtp发邮件.不需要本地配置po ...

随机推荐

  1. [转帖]可直接拿来用的kafka+prometheus+grafana监控告警配置

    kafka配置jmx_exporter 点击:https://github.com/prometheus/jmx_exporter,选择下面的jar包下载: 将下载好的这个agent jar包上传到k ...

  2. [转帖]实战演练 | Navicat 数据生成功能

    https://zhuanlan.zhihu.com/p/631823381 数据生成的目的是依据某个数据模型,从原始数据通过计算得到目标系统所需要的符合该模型的数据.数据生成与数据模型是分不开的,数 ...

  3. [转帖]armv6、armv7、armv7s、armv8、armv64及其i386、x86_64区别

    ARM处理器指令集 一. 苹果模拟器指令集: 指令集 分析 i386 针对intel通用微处理器32架构的 x86_64 针对x86架构的64位处理器 i386|x86_64 是Mac处理器的指令集, ...

  4. [转帖]Arm vs X86 (unfinished)

    http://home.ustc.edu.cn/~shaojiemike/posts/arm/   ARM Ltd history 诞生 1981年,被Intel拒绝的Acorn(橡子) Comput ...

  5. Ubuntu2204设置固定IP地址

    前言 Ubuntu每次升级都会修改一部分组件. 从1804开始Ubuntu开始使用netplan的方式进行网络设置. 但是不同版本的配置一直在升级与变化. 今天掉进坑里折腾了好久. 所以这边总结一下, ...

  6. 银河麒麟v10 安装 virt-manager 的过程

    上个月公司购置一台飞腾2000+ 银河麒麟v10的机器. 想着能够利用虚拟化 安装一下虚拟机 提高测试灵活度 找了一下原厂要了一下相关的命令 在这里进行一下测试工作. 第一步: 安装必备的包 yum ...

  7. 【分享一个工具】通过定义proto3来自动生成多进程模式的插件代码

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 我在多进程插件框架 hashicorp/go-plugin ...

  8. 【0基础学爬虫】爬虫基础之自动化工具 Pyppeteer 的使用

    大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶.逆向相关文章,为实现从易到难全方位覆盖,特设[0基础学爬 ...

  9. Fabric区块链浏览器(3)

    本文是区块链浏览器系列的第五篇,项目完整代码在这里. 在上一篇文章中给浏览器增加了简单的用户认证,至此浏览器的基本功能就已经大致完成了. 在这片文章中,我将使用kratos对区块链浏览器器进行重构,使 ...

  10. github clone或访问慢

    做技术的我们经常会访问github.com,有时出现github访问非常慢或者git clone速度很慢,git push也很慢 原因很简单:github被高高的墙屏蔽了. 所以解决方案就是手动把 c ...