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

最近接到一个任务,将目前的邮件报表体系规整优化,格式严谨。
    的确,前段时间为了省事,根据业务逻辑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
喜欢硬件
喜欢树莓派
喜欢深度学习
喜欢你
posted @ 2019-01-02 18:06  正版乔  阅读(1089)  评论(0编辑  收藏  举报