在我們運行完整個項目後,已經生成了 測試報告,一般自動化會在本地或者公司服務器上運行,那如何獲取自動化測試的運行結果呢,此時就需要把測試結果以郵件的形式發送到郵箱,這樣就可以在測試完成的第一時間知道測試結果。
所以我們需要來學習一下如果使用python第三方庫來發送郵件。
其實關於發送郵件的方法,複製粘貼過來,修改下參數、賬號、密碼後,直接使用就可以了,再把數據寫到配置中參數化基本就搞定。
一、發送郵件的步驟
關於發送郵件,步驟有三步:定義配置信息、定義郵件內容、發送郵件
第一步:定義配置信息
這一步將所有需要用到的:郵箱服務器地址、郵箱端口、郵箱賬號、密碼等信息先列出來,可以在方法中直接賦值,也可以放到config配置文件中,讀取後賦值。
# 接收郵箱
receiver = "***@****.com"
# 發送郵件服務器
smtp_server = "smtp.***.com"
port = "25"
# 發送郵箱賬號和密碼(或者授權碼)
username = "***@***.com"
password = "****"
第二步:定義郵件內容
郵件內容,我通過文件路徑來讀取html格式的文件,從而獲取到郵件的內容。然後設置郵件的標題、發送方、收件方、正文內容、附件格式、附件內容等。
# 讀取測試報告文件(report_file:測試報告文件路徑)
mail_body = open(report_file, "r", encoding="utf-8").read()
# 定義郵件內容
msg = MIMEMultipart()
body = MIMEText(mail_body, _subtype='html', _charset='utf-8')
msg['Subject'] = u"自動化測試報告"
msg['from'] = username
msg['to'] = receiver
msg["date"] = time.strftime('%a, %d %b %Y %H:%M:%S %z')
msg.attach(body)
# 定義附件內容
att = MIMEText(mail_body, "base64", "utf-8")
att["Content-Type"] = "application/octet-stream"
att["Content-Disposition"] = 'attachment; filename= "report.html"'
msg.attach(att)
第三步:發送郵件
確定好郵件內容後,需要發送郵件了,不同的加密方式發送方法會有些不同,這個在下文具體探討下。
# 連接郵箱服務器
smtp = smtplib.SMTP()
smtp.connect(host=smtp_server, port=port)
# tls加密方式
smtp.ehlo()
smtp.starttls()
smtp.ehlo()
# 登錄郵箱
smtp.login(username, password)
# 發送郵件
smtp.sendmail(username, receiver, msg.as_string())
# 斷開連接
smtp.quit()
二、發送郵件的注意事項
我在研究了發送郵件後,發現不同情況下,發送郵件的方式也有不同之處,這裏整理如下:
2.1使用不同郵件發送方
目前我嘗試過使用163郵箱、qq郵箱、zimbra郵箱進行發送郵件,每個郵箱設置不同,每個郵箱也沒有全面測試所支持的發送類型,這裏大概講下我對每個郵箱的感受吧,不作爲參考。其中:
163郵箱比較簡單,我只設置了服務地址,在connect連接後直接可以登錄發送(可能和我163郵箱設置有關)
qq郵箱需要設置一個授權碼,然後使用授權碼來進行連接登錄
zimbra郵箱是公司部署的一個郵箱系統,沒有授權碼,但是需要加密進行登錄。
郵箱賬戶開啓第三方發送功能:
163郵箱:在設置菜單中,選擇POP3/SMTP/IMAP選項,設置開啓SMTP發送功能。
qq郵箱:在設置-賬戶中,設置開啓SMTP發送功能
2.2不同加密方式的登錄
這裏我整理的幾種加密方式,有明文不加密、ssl、tls這三種方式,不同的加密方式有不同的登錄方法。
明文不加密:
默認使用smtp的端口(默認值25)具體端口值以郵箱設置爲準。
# 連接郵箱服務器
smtp = smtplib.SMTP()
smtp.connect(host=smtp_server, port='25')
# 登錄郵箱
smtp.login(username, password)
ssl加密方式:
默認使用ssl端口(默認值465)具體端口值以郵箱設置爲準。
# 連接郵箱服務器
smtp = smtplib.SMTP_SSL()
smtp.connect(host=smtp_server, port='465')
# 登錄郵箱
smtp.login(username, password)
tls加密方式:
默認使用smtp的端口(默認值25)具體端口值以郵箱設置爲準。
# 連接郵箱服務器
smtp = smtplib.SMTP()
smtp.connect(host=smtp_server, port='25')
# tls加密
smtp.ehlo()
smtp.starttls()
smtp.ehlo()
# 登錄郵箱
smtp.login(username, password)
2.3無法發送時如何檢查
當遇到無法發送郵件時,根據我踩過的坑,來給出幾點建議吧。
1.確定郵箱已經開啓smtp功能,並且確定是否開啓授權碼登錄,如果開啓則需要使用授權碼登錄。
2.確定郵箱端口port值是否正確,是465、587、25,或者郵箱系統定義的其他端口
3.確定郵箱支持的加密方式,以及不同加密方式對應的端口值正確與否。
三、代碼實例
這裏根據項目,我創建了send_mail.py的文件,在裏面除了發送郵件的方法,根據項目結構加入了一個查找report報告文件夾最後生成文件的方法,並且獲取到文件路徑後,作爲要發送的內容:
send_mail.py
# -*- coding: UTF-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import time
import os
def find_report_name():
"""查找最後生成的報告文件的路徑"""
result_dir = os.path.abspath('..') + "\\report\\"
lists = os.listdir(result_dir)
lists.sort(key=lambda fn: os.path.getmtime(result_dir + "\\" + fn))
file_name = os.path.join(result_dir, lists[-1])
return file_name
def send_email(report_file):
"""發送郵件方法"""
try:
# 配置郵件信息
# 接收郵箱
receiver = "***@***.com"
# 發送郵件服務器
smtp_server = "smtp.***.com"
port = "25"
# 發送郵箱賬號和密碼(授權碼)
username = "***@***.com"
password = "***"
# 讀取測試報告文件
mail_body = open(report_file, "r", encoding="utf-8").read()
# 定義郵件內容
msg = MIMEMultipart()
body = MIMEText(mail_body, _subtype='html', _charset='utf-8')
msg['Subject'] = u"自動化測試報告"
msg['from'] = username
msg['to'] = receiver
msg["date"] = time.strftime('%a, %d %b %Y %H:%M:%S %z')
msg.attach(body)
# 定義附件內容
att = MIMEText(mail_body, "base64", "utf-8")
att["Content-Type"] = "application/octet-stream"
att["Content-Disposition"] = 'attachment; filename= "report.html"'
msg.attach(att)
# 連接郵箱服務器
smtp = smtplib.SMTP()
smtp.connect(host=smtp_server, port=port)
# tls加密方式
smtp.ehlo()
smtp.starttls()
smtp.ehlo()
# 登錄郵箱
smtp.login(username, password)
# 發送郵件
smtp.sendmail(username, receiver, msg.as_string())
# 斷開連接
smtp.quit()
print("%s 發送成功,查收%s郵箱" % (username, receiver))
except Exception as e:
print(e)
def send_report():
"""發送測試報告"""
send_email(find_report_name())