【實操系列】| Python傳送郵件的一個具體應用
阿新 • • 發佈:2021-01-23
歡迎關注微信公眾號“Python小灶,和我一起每天學習Python新知識”
文章目錄
簡單介紹
本人是自動化測試工程師,主要語言為Python。
實操系列是結合我平時工作中遇到的情況寫的一些指令碼,總結分享出來的東西;
因為真實的場景難以模擬,只能說個大概,但是因為真實場景的總結分享,應該來說有一定的參考和學習價值。
不過有沒有通用性就不好講了,因為這個完全是和業務相關,業務場景決定指令碼邏輯,寫程式碼主要還是鍛鍊解決問題的能力。
需求
公司測試場景是用遠端PC(windows10)連線測試物料,具體測試啥就不說了哈,現在大部分都是這種場景:遠端PC連線測試物料,本地PC連線遠端PC操作,直接自動化測試。
現在的問題是,在測試場景不穩定的情況下,經常會測試中斷,然後登陸遠端伺服器排查問題後繼續跑起來。
因為不知道何時異常中斷,需要頻繁的登陸(這個環節還沒整合到CI)檢視情況,所以想定時將環境截圖或者蒐集log,然後通過郵件傳送給指定人員,如果有異常,再登陸檢視(每次輸賬號密碼也很煩人)。
如果沒有此應用場景,可以作為參考。
回顧
程式碼
導包
# -*- coding: UTF-8 -*-
import os
import time
import socket
import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
from PIL import ImageGrab
郵件的一些常規設定
# 第三方SMTP服務
mail_host = "smtp.qq.com" # 設定伺服器
mail_user = "[email protected]" # 你的使用者名稱
mail_pass = "xxx" # 你生成的口令,不知道的請看回顧
# 設定傳送人和收件人
sender = "[email protected]" # 會顯示由這個郵箱代發
receivers = "[email protected]" # 你要傳送給的人,可以固定,可以讀取檔案
pic_name = time.strftime("%Y%m%d_%H%M%S", time.localtime())
hostname = socket.gethostname()
ip = socket.gethostbyname(hostname)
截圖功能
def pic():
im = ImageGrab.grab()
im.save(r'C:\Python_Code\email\picture\{}.jpeg'.format(pic_name))
time.sleep(2)
傳送郵件功能
def send_email(info):
# 傳送郵件
subject = 'IP:{} Time:{}'.format(ip, pic_name) # 郵件主題
msg = MIMEMultipart('related')
# 第一個引數為郵件內容,第二個引數為設定文字格式,第三個引數為編碼設定
content = MIMEText('<p>status check</p>'
'<html><body><img src="cid:imageid" alt="imageid"></body></html>', 'html', 'utf-8')
msg.attach(content)
msg['Subject'] = Header(subject, 'utf-8') # 標題
msg['From'] = Header("blyang", 'utf-8') # 發件人
file = open(r'C:\Python_Code\email\picture\{}.jpeg'.format(pic_name), "rb")
img_data = file.read()
file.close()
img = MIMEImage(img_data)
img.add_header('Content-ID', 'imageid')
msg.attach(img)
try:
smtpObj = smtplib.SMTP_SSL(mail_host, 465) # qq郵箱帶SSL
smtpObj.login(mail_user, mail_pass) # 登陸
smtpObj.sendmail(sender, receivers, msg.as_string())
print("send success")
except smtplib.SMTPException:
print("Error: send fail")
if __name__ == "__main__":
while True:
pic()
send_email()
time.sleep(60 * 60)
總結
這是一個臨時的小需求,不過確實可以幫助節省很多精力,省去了頻繁登陸檢視的低效,事實上也可以傳送日誌,附件等等,看具體場景。