- Author: 杜七
- Date: 2016.06.13
为解决工作中日报问题,基于Rmarkdown+Python+SHELL 上线了日报自动化,简单记录,供大家参考
1,日报准备
- 明确日报内容
- 准备需要的数据:
- 可以直接调用mysql
- 可以提前download,然后通过
read.csv()
等来读取
- 熟悉rmarkdown和markdown语法,了解knitr,以及
\```r {}
```使用 - 公司使用的是阿里云邮箱,阿里云邮箱不支持html内置图片base64图片的展现,所以rmarkdown生成html的时候做了一点变化,然后用sed把生成的html做了修改,最后用python 自动化发送日报
2,Rmarkdown的自动化html日报
1) 生成HTML的时候不能用base64编码图片
- 生成html的时候,图片不要base64编码,阿里云邮箱不支持HTML内置的base64编码的图片发送
- 读一下markdown包的文档,里面markdownToHTML函数的帮助中告诉如何设置选项(把默认的base64_images去掉应该就可以了)
library(markdown) knit("kongge_daily_report.rmd",output="report.md") markdownToHTML("report.md","report.html",options=c("hard_wrap","use_xhml","smartypants"))
2)用Rmarkdown生成一个html日报
3,SHELL对html做一些修改
把python发送邮件中的图片引用地址替换掉,比如,src = "figure/unnamed-chunk-3-1.png",替换为src = "cid:image3" ,然后MIMEImage再引用就可以了
sed 's/figure\/unnamed\-chunk\-/cid\:image/g' report.html | sed 's/\-1.png//g' > new_report.html
4,Python发送邮件
- 编写一个Python的发送邮件的文件,包括发送HTML和图片
- 图片可以循环调用,比如:
for img in figure: fp = open(settings.MEDIA_ROOT+img[0], 'rb') msgImage = MIMEImage(fp.read()) fp.close() msgImage.add_header('Content-ID', '<'+img[1]+'>') msgRoot.attach(msgImage)