生成 Charts 图片,并发送 Charts 图片邮件

CTEmail(Charts and Text Eamil)是一个发送带有图片的邮件的小工具,这个图片是邮件内容中显示,不是添加在附件中,这个脚本实现的比较简单粗暴,不管长相丑陋,只能能解决实际问题就行。

项目地址dyike/CTEmail求star!!!

为什么有CTEmail?

  • 没有一个不懒的程序员,做啥都想着写个脚本跑一下,跑个脚本抢月饼,跑个脚本...能用脚本的干嘛不用脚本。每天的数据报表需要一个邮件脚本发送。
  • 对接了各大厂商,每天每周每月都会往来邮件。报表用图表的形式更简单直观的反馈数据,为什么我们不在邮件中使用图表。
  • 各大厂商的邮件中图表都是小姐姐手动制作,手动发出%>_<%,为什么不跑一个脚本。
  • 如果解决上面的问题,是不是解放了小手。1) 用数据生成图表,2) 将图表拼接到邮件中发出。

这个小工具的初衷,解决实际问题还是很重要的。

哪些人需要这个工具?

  • 产品同学,图表是展示数据的最佳实践!
  • 运营同学,图表是展示报表的最佳实践!
  • 技术同学,为了继续懒下去!
  • ...零编程基础的同学都能使用【只要会科学上网就能解决一切】

说这些都是没用,那就跟来做一下吧。
项目托管在github上,地址:dyike/CTEmail。记得来star哟!!!

怎么使用?

首先,稍微知道怎么操作Python,像我这种不会写代码都能操作,你一定也可以。其次是到Plotly——这是一个可视化数据的工具有点类似于HighCharts,不过支持多种语言,很强大了。先熟悉一下, 然后注册一个账号,后面会用到。本文着重数据生成图表图片。邮件服务配置查看README

1st Step:

将项目clone下来,熟悉项目的结构,里面不到两百行代码,简单粗暴。

git clone git@github.com:dyike/CTEmail.git

send.py文件中配置自己的邮箱账号,密码,邮件标题,邮件模板路径和发送到的邮箱。

邮件模板的默认路径是./content/,会自动读取该路径下的html文件。

from ctemail import CTEmail
e = CTEmail('Your email acount', 'Your password')
# " ./content/ 邮件文件的路径 "
e.send_email('Test Email Title', './content/', ['i@ityike.com'])

默认是配置QQ的STMP发送服务(stmp.qq.com),端口是25。你也可以配置163.gmail等等,在初始化CTEmail()配置相应的配置即可。

2nd Step:

项目中提供了一个默认的模板,你可以根据你的实际需求定制的模板,content文件夹下面还有图片资源,我们生成的图表的图片资源也是在该文件夹下面。

需要注意的是,html文件中,将img标签用给包了一层,这样只是为了能够方便Python解析,替换。【ps:这里可以了解一下Python发送图片邮件的实现,将图片cid替换进来】参考廖雪峰老师的教程 这里你可以不Care这些事。

模板中需要注意的一点:也是非常重要的一点就是:html中多个标签需要换行。不换行就无法正确解析。

    <a><EMAIL_IMG><img src="image1.png"></EMAIL_IMG></a>
    <a><EMAIL_IMG><img src="image2.png"></EMAIL_IMG></a>

3th Step:

快要结束了,本文的却重点来了,不要慌,也很简单。就是使用Plotly,关于使用离线(本地)模式还是在线模式,看自己实际需求。我这里说在线的。因为我用的是定时脚本,我只能调用在线的API生成图片保存到本地content文件夹下面。

  • 安装Plotly

    pip install plotly 
  • get_img.py文件,文件名可以重命名,里面需要的配置你的认证信息credentials,信息在https://plot.ly/settings/api中查看。有两种方式:第一种如下
    设置username和api_key。

import plotly 
plotly.tools.set_credentials_file(username='DemoAccount', api_key='lr1c37zw81')

或者在安装完成后,在~/.plotly/.credentials文件中配置你的账号信息。
看到的信息大致如下:修改对应的即可。

{
    "username": "DemoAccount",
    "stream_ids": ["ylosqsyet5", "h2ct8btk1s", "oxz4fm883b"],
    "api_key": "lr1c37zw81"
}
  • 继续get_img.py文件
import plotly.plotly as py
import plotly.graph_objs as go

py.sign_in('Your account', 'API Token') # 注意:这里是plotly网站的用户名和密码

trace = go.Bar(x=[2, 4, 6], y= [10, 12, 15])
data = [trace]
layout = go.Layout(title='A Simple Plot', width=800, height=640)
fig = go.Figure(data=data, layout=layout)
# 保存图片文件的路径
py.image.save_as(fig, filename='./content/image1.png')

# 拼接模板文件
template = "<!DOCTYPE html><html><head><meta charset="UTF-8"></head><body>" + "\n" + "<a><EMAIL_IMG><img src="image1.png"></EMAIL_IMG></a>" + "\n" + "<a><EMAIL_IMG><img src="image2.png"></EMAIL_IMG></a>" + "\n" + "</body></html>"

print template

注意上面拼接模板文件内容的时候使用了换行符"\n",为什么这样使用,一简单粗暴,二为了引起重视【这里有坑】。

  • 执行上面的脚本文件python get_img.py > ./content/index.html 这样就可以将模板文件写入到content目录下的index.html

  • 执行python send.py邮件就可以发送邮件,将上面的几个命令写入到shell脚本中,更新方便快捷。

  • 其他图表的生成也可以参考官方文档的介绍。

4th Enjoy it!!!

放在最后的不是不重要,解决实际问题才是更重要,欢迎来CTEmailStar!!!

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Summer 于 3年前 加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 9
Patrick95

巧巧巧,star 表示支持!

3年前 评论

@Patrick95 好的,大袋鼠

3年前 评论

@NicolaBonelli 其实无关乎哪种语言,能解决实际问题就行了。

3年前 评论

@ityike 我的意思是,这既然是laravel论坛,来发其他框架其他语言的trick合适吗

3年前 评论

@NicolaBonelli 我错了。是我的错。不喜欢就不看嘛

3年前 评论

@mingyun 谢谢,希望这个小工具对你有所帮助。哈哈哈哈哈

3年前 评论
hxd

这个很实用

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!