热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

大佬要我写自动邮件报表系统

最近接到一个任务,将目前的邮件报表体系规整优化,格式严谨。的确,前段时间为了省事,根据业务逻辑sql产生对应的csv格式的数
最近接到一个任务,将目前的邮件报表体系规整优化,格式严谨。
的确,前段时间为了省事,根据业务逻辑sql产生对应的csv格式的数据报表,用csvtotable工具将长长的csv转化为页面友好的html,由于产生的html带有js,邮件正文不允许任何带有js内容文件充当正文,防止邮件木马行为。所以我们采用了数据html作为附件,正文写附件简介的方案定时发送相关报表。
在电脑端一切正常,还有点小激动,毕竟比csv下载再查看的体验好多了。正当我已熟悉这种模式,将所有类似任务都转化为附件+说明的方式的时候,一封发给大boss的自动报表敲醒了我,大佬们不按套路出牌,拿手机看邮件,结果我就被冠以给领导发木马的罪名。冷静下来,也不冤,的确是在开发过程中没有考虑用户的使用习惯、平台兼容性。
然后,带罪优化的任务来了。
理清思路,寻找问题。自动邮件报表系统是为了减少人工跑数、做Excel、发邮件的重复工作,用脚本定时执行相应任务。管理定时任务用crontab,组织执行用shell,业务跑数用sql,做Excel用csvtotable,发邮件用python,一条龙服务!
但是,,问题来了,附件看起来像木马,大佬想看正文,正文不能装带js的html,数据报表太长,全部罗列邮件长度可能撑爆。
经过再三思量,附件对业务人员是必要的,不能取消;正文大佬想看,那就汇总一版大佬需要的简洁指数报表;正文不能带js,那就用jinja2配和css来写。
方案有了就开工!
根据业务逻辑得到一份业务汇总sql,产生供正文使用的csv,利用 jinja2模板将csv数据填充到html页面,形成正文html,渲染发送!这样一封既有大佬需要的汇总报表,又有业务人员需要的详细数据的自动报表就出锅了~
下面建议介绍一下,摸索过程中的细节:

1 #含有中文的csv解析
2 import sys
3 import csv
4 base_path = os.getcwd()+’/'
5
6 def unicode_csv_reader(csv_path, dialect=csv.excel, **kwargs):
7 with open(base_path + csv_path) as f:
8 csv_reader = csv.reader(f, dialect=dialect, **kwargs)
9 for row in csv_reader:
10 yield [unicode(cell, 'utf-8') for cell in row]

 

谨记:在使用jinja的时候需要在项目文件夹中生成一个空的__init__.py,jinja模版放在templates文件夹路径下,模板中针对表格格式做了设置,表头突出,第一列文字靠左,数字靠右,最后一行汇总加浅灰底纹。。。

1 from jinja2 import Template
2 from jinja2 import Environment, PackageLoader
3
4 env = Environment(loader=PackageLoader(‘项目文件夹名’))
5
6 template = env.get_template('template.html')
7 content = template.render(data=tables)

好吧,关注微信公众号“正版乔”回复“邮件”,给你项目代码,且用且珍惜,说不定大佬又有进一步的需求。 
一个学统计的程序员
喜欢Coding
喜欢硬件
喜欢树莓派
喜欢深度学习
喜欢你

转:https://www.cnblogs.com/qiaohaoforever/p/10209989.html



推荐阅读
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 从Oracle安全移植到国产达梦数据库的DBA实践与攻略
    随着我国对信息安全和自主可控技术的重视,国产数据库在党政机关、军队和大型央企等行业中得到了快速应用。本文介绍了如何降低从Oracle到国产达梦数据库的技术门槛,保障用户现有业务系统投资。具体包括分析待移植系统、确定移植对象、数据迁移、PL/SQL移植、校验移植结果以及应用系统的测试和优化等步骤。同时提供了移植攻略,包括待移植系统分析和准备移植环境的方法。通过本文的实践与攻略,DBA可以更好地完成Oracle安全移植到国产达梦数据库的工作。 ... [详细]
  • 如何在HTML中获取鼠标的当前位置
    本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
  • 本文介绍了在Ubuntu下制作deb安装包及离线安装包的方法,通过备份/var/cache/apt/archives文件夹中的安装包,并建立包列表及依赖信息文件,添加本地源,更新源列表,可以在没有网络的情况下更新系统。同时提供了命令示例和资源下载链接。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
author-avatar
啊123
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有