最近在工作時,需要實現在公司開發的調度系統上實現:將每天產生的游戲數據查詢統計出,並發送郵件給數據分析的開發人員。
考慮到python語言的簡潔易上手,在我沒有任何python基礎的情況下,十分輕松的完成了這個腳本功能。
下面放出代碼,展示了通過python發送html郵件的模板:
1.生成數據:
1 #!/usr/bin/env python 2 # -*-coding: UTF-8 -*- 3 import MySQLdb 4 import sys 5 6 from constant import DB_PARAMS_91 7 from db_utils import new_execsqlr 8 9 10 def query_data(): 11 try: 12 sql = 13 result = new_execsqlr(sql, DB_PARAMS_91) #這里調用的是公司內部封的數據庫查詢模塊,內部用的是MySQLdb 14 print result 15 return [x.split("\t") for x in filter(is_warning_column, result)] 16 except MySQLdb.Error, e: 17 print "Mysql Error %d: %s" % (e.args[0], e.args[1]) 18 sys.exit(1) 19 20 21 # 過濾結果中的信息 22 def is_warning_column(x): 23 return ("mysql" not in x) and ("ds" not in x) and ("Warning" not in x)
2.拼接html模板(注意html的樣式最好只寫在標簽內,大部分的郵箱都不支持外聯css樣式,而且js腳本也不會起作用):
1 #!/usr/bin/env python 2 # encoding:utf-8 3 import sys 4 5 sys.path.append("..") 6 sys.path.append("../..") 7 sys.path.append("../../..") 8 sys.path.append("../../../..") 9 from consume_data import query_data 10 11 12 # 將sql語句拼接到html中:注意樣式只能嵌套在標簽中,不能寫在head和css中 13 def get_html_msg(): 14 result = query_data() 15 head = """<head><meta charset="utf-8"> 16 </head>""" 17 18 th = """<body>"""""" 19 <div class="container" style = "margin-left:calc(50% - 372px);"> 20 <table border="1" style = "text-align: center;border-collapse:collapse;"> 21 <tbody> 22 <tr bgcolor = "#E3E3E3"> 23 <th colspan="11" style = " padding: 2px 5px; font-size: 10px;">廣告推廣每日監控報表郵件</th> 24 </tr> 25 <tr bgcolor = "#E3E3E3"> 26 <th rowspan="2" style = " padding: 2px 5px; font-size: 10px;">date</th> 27 <th colspan="5" style = " padding: 2px 5px; font-size: 10px;">iOS</th> 28 <th colspan="5" style = " padding: 2px 5px; font-size: 10px;">Android</th> 29 </tr> 30 <tr bgcolor = "#E3E3E3"> 31 <th style = " padding: 2px 5px; font-size: 10px;">點擊PV</th> 32 <th style = " padding: 2px 5px; font-size: 10px;">當日激活</th> 33 <th style = " padding: 2px 5px; font-size: 10px;">當日注冊</th> 34 <th style = " padding: 2px 5px; font-size: 10px;">當日創角</th> 35 <th style = " padding: 2px 5px; font-size: 10px;">當日付費</th> 36 <th style = " padding: 2px 5px; font-size: 10px;">點擊PV</th> 37 <th style = " padding: 2px 5px; font-size: 10px;">APP當日激活</th> 38 <th style = " padding: 2px 5px; font-size: 10px;">SDK當日激活</th> 39 <th style = " padding: 2px 5px; font-size: 10px;">當日注冊</th> 40 <th style = " padding: 2px 5px; font-size: 10px;">當日付費</th> 41 </tr>""" 42 tr = '' 43 for row in result: 44 td = '' 45 td = td + '<td style = " padding: 2px 5px; font-size: 10px;">' + row[0] + '</td>' 46 td = td + '<td style = " padding: 2px 5px; font-size: 10px;">' + row[1] + '</td>' 47 td = td + '<td style = " padding: 2px 5px; font-size: 10px;">' + row[2] + '</td>' 48 td = td + '<td style = " padding: 2px 5px; font-size: 10px;">' + row[3] + '</td>' 49 td = td + '<td style = " padding: 2px 5px; font-size: 10px;">' + row[4] + '</td>' 50 td = td + '<td style = " padding: 2px 5px; font-size: 10px;">' + row[5] + '</td>' 51 td = td + '<td style = " padding: 2px 5px; font-size: 10px;">' + row[6] + '</td>' 52 td = td + '<td style = " padding: 2px 5px; font-size: 10px;">' + row[7] + '</td>' 53 td = td + '<td style = " padding: 2px 5px; font-size: 10px;">' + row[8] + '</td>' 54 td = td + '<td style = " padding: 2px 5px; font-size: 10px;">' + row[9] + '</td>' 55 td = td + '<td style = " padding: 2px 5px; font-size: 10px;">' + row[10] + '</td>' 56 tr = tr + '<tr>' + td + '</tr>' 57 tr = tr.encode('utf-8') 58 body = tr 59 tail = '</tbody></table></div></body></html>' 60 # 將內容拼接成完整的HTML文檔 61 html = head + th + body + tail 62 return html
3.發送html郵件:
1 #!/usr/bin/env python 2 # encoding:utf-8 3 import smtplib 4 import sys 5 6 sys.path.append("..") 7 sys.path.append("../..") 8 sys.path.append("../../..") 9 sys.path.append("../../../..") 10 from email.mime.text import MIMEText 11 from email.mime.multipart import MIMEMultipart 12 13 from SMTPConstant import mail_host, sender, receivers, mail_port 14 from produce_htmltemplate import get_html_msg 15 16 17 # 郵件發送 18 def send_mail(html_msg, mail_host, mail_port, sender, receivers): # recivers定義了一個數組 19 msg = MIMEMultipart() 20 content = MIMEText(html_msg, 'html', _charset='utf8') 21 msg.attach(content) 22 msg['To'] = ";".join(receivers) 23 msg['From'] = sender 24 msg['Subject'] = "。。。。。" 25 s = smtplib.SMTP(mail_host, mail_port) 26 s.sendmail(sender, receivers, msg.as_string()) 27 s.quit() 28 print " send ok!" 29 30 31 # test 32 if __name__ == "__main__": 33 html = get_html_msg() 34 send_mail(html, mail_host, mail_port, sender, receivers)
如果使用的qq郵箱,則需要先登錄自己的qq郵箱,自己的郵箱需要開通pop3服務,登錄時的賬號密碼填寫qq提供的授權碼。