生成 Charts 圖片,併傳送 Charts 圖片郵件

ityike發表於2017-10-17

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 協議》,轉載必須註明作者和本文連結

相關文章