一、前言
在日常運維的過程中,執行腳本,生成excel報表並發送郵件到郵箱是不可避免的,python生成excel的庫有很多,這里選擇生成csv格式,因為python內置,不需要額外安裝模塊,而且使用簡單。
二、生產CSV代碼
# encoding: utf-8 import codecs import csv import datetime import sys reload(sys) sys.setdefaultencoding( "utf-8" ) def to_csv(datas, env): headers = ['ip', u'操作系統', u'分區屬性', u'輸出返回', u'執行結果'] # newline=''避免出現空行 today = datetime.date.today() filename = "{}-{}.csv".format(env, today) try: with open(filename, 'wb') as f: f.write(codecs.BOM_UTF8) # 標頭在這里傳入,作為第一行數據 writer = csv.DictWriter(f, headers) writer.writeheader() writer.writerows(datas) except Exception as e: print (u'寫入csv錯誤:' + str(e)) finally: return filename if __name__ == '__main__': data = [{"ip": "192.168.1.2", u'操作系統': "LINUX", u'分區屬性': u"x86物理機", u'輸出返回': "ok", u'執行結果': u"成功"}, {"ip": "192.168.1.3", u'操作系統': "LINUX", u'分區屬性': u"x86物理機", u'輸出返回': "error:xxxxxxxxxxx", u'執行結果': u"成功"}, {"ip": "192.168.1.4", u'操作系統': "LINUX", u'分區屬性': u"x86虛擬機", u'輸出返回': "ok", u'執行結果': u"成功"}, {"ip": "192.168.1.5", u'操作系統': "LINUX", u'分區屬性': u"x86虛擬機", u'輸出返回': "ok", u'執行結果': u"成功"}] env = "dev" to_csv(data, env)
生成的文件:
二、發送郵件代碼
from email.header import Header from email.mime.application import MIMEApplication from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText def send_email(filename): # 發送郵箱服務器 smtpserver = 'xx.xx.xx.xx' # 發送郵箱用戶名密碼 user = 'xxxxxxx@xx.com.cn' password = '5tgb^YHN' # 發送和接收郵箱 receives = ['xxxxx@xxx.com.cn'] msg = MIMEMultipart() # 創建一個帶附件的實例 subject = Header("xxxxxx執行結果", 'utf-8').encode() msg["Subject"] = subject # 指定郵件主題 msg["From"] = user # 郵件發送人 msg["To"] = ','.join(receives) # 郵件接收人,如果存在多個收件人,可用join連接 msg.attach(MIMEText('附件為xxxxx執行結果,請查收!', _subtype='html', _charset='utf-8')) part = MIMEApplication(open(filename, 'rb').read()) part.add_header('Content-Disposition', 'attachment', filename=filename) msg.attach(part) try: s = smtplib.SMTP(smtpserver, timeout=10) # 連接smtp郵件服務器,端口默認是25 s.login(user, password) # 登陸服務器 s.sendmail(user, receives, msg.as_string()) # 發送郵件 s.close() except Exception as e: print ("send email error:"+str(e))