最近接到一個任務,將目前的郵件報表體系規整優化,格式嚴謹。
的確,前段時間為了省事,根據業務邏輯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
喜歡硬件
喜歡樹莓派
喜歡深度學習
喜歡你
