如果想從頭學起接口自動化測試,可以去看看這個系列的文章哦!
https://www.cnblogs.com/miki-peng/category/1671261.html
前言
SMTP(Simple Mail Transfer Protocol)也就是簡單郵件傳輸協議,是一種提供可靠且有效電子郵件傳輸的協議。python的smtplib
模塊就提供了一種很方便的途徑發送電子郵件,它對smtp協議進行了簡單的封裝。
python發郵件主要需要兩個模塊:smtplib
和email
,這兩個模塊是python自帶的庫,import即可使用。smtplib
主要負責發送郵件,即一個發送郵件的動作,如連接郵箱服務器,登錄郵箱,發送郵件。email
主要負責構造郵件,指的是郵箱頁面顯示的一些構造,如發件人,收件人,主題,正文,附件等。
smtp授權
上面已經說到發送郵件是基於smtp服務的,那么我們就需要一個可以登錄smtp服務器的賬號及授權碼,這里以qq郵箱為例,登錄qq郵箱后,在設置》賬戶這里就可以開啟smtp,開啟后發送短信獲取授權碼即可。

發送郵件
涉及的部分參數說明:
- 連接到smtp服務器:
smtplib.SMTP_SSL(smtp服務器地址, 端口號)
- 登錄smtp服務器:
smtp.login(smtp郵件地址, 登錄smtp的授權碼)
- 構造郵件對象:
MIMEMultipart()
- 創建郵件內容:
MIMEText(郵件內容, "plain", "utf8")
兩個參數文本類型,編碼格式;如果要發送html格式的郵件內容,則把plain
(默認)替換成html
- 把相關內容添加到郵件:
smg.attach(具體的內容)
,添加郵件內容 - 設置郵件主題:
smg["Subject"] = 主題內容
- 設置郵件發件人:
smg["From"] = 郵件地址
- 設置郵件收件人:
smg["To"] = 郵件地址
- 發送郵件:
smtp.send_message(郵件對象, from_addr=發件人郵件地址, to_addrs=收件人郵件地址)
如果有多個收件人則用list格式傳給to_addrs
- 創建附件:
MIMEApplication(附件內容)
- 創建圖片:
MIMEImage(圖片內容)
,與附件一樣 - 設置附件或圖片等:
file_msg.add_header(\_name, \_value, **\_params)
:擴展標題設置,_name為要添加的標題字段,_value為標題的值。msg.add_header('Content-ID', 'imgid')
#設置圖片IDmsg.add_header('Content-Disposition', 'attachment', filename='test.xlsx')
#為附件添加一個標題msg.add_header('Content-Disposition', 'attachment', filename=('utf-8', '', '中文標題'))
#添加非ASCII字符時需指定編碼
import smtplib
from email.mime.text import MIMEText # 創建文本內容的郵件內容
from email.mime.multipart import MIMEMultipart # 創建帶附件的實例
from email.mime.application import MIMEApplication # 用於創建附件的
from email.mime.image import MIMEImage # 用於創建圖片,與添加附件一樣的,下面不做舉例
# 第一步: 連接到smtp服務器
smtp = smtplib.SMTP_SSL("smtp.qq.com", 465)
smtp.login("xxxxxx@qq.com","afajccbab")
# 第二步:構建郵件
smg = MIMEMultipart()
text_smg = MIMEText("這是郵件文本內容", "plain", "utf8") # 郵件內容
smg.attach(text_smg) # 添加到郵件
# 添加附件
file_msg = MIMEApplication(open(r"C:\project\test\reports\report.html","rb").read())
file_msg.add_header('content-disposition', 'attachment', filename='report.html')
smg.attach(file_msg) # 添加到郵件
smg["Subject"] = "測試測試" # 主題
smg["From"] = "aaaaaa@qq.com" # 郵件內顯示的發件人
smg["To"] = "bbbbb@163.com" # 郵件內顯示的收件人
# 第三步發送郵件
smtp.send_message(smg, from_addr="aaaaaa@qq.com", to_addrs="bbbbb@163.com")
還有更多的用法,有興趣的可以再深入研究。
封裝及應用
下面是一個簡單的封裝例子,可以根據自己的需要優化,甚至可以把郵件的主題、發件人、收件人以及smtp的登錄郵箱授權密碼等提取出來放到配置文件來維護。
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
def send_email(file_path):
smtp = smtplib.SMTP_SSL("smtp.qq.com",465)
smtp.login("xxxxx@qq.com","smtp登錄密碼")
smg = MIMEMultipart()
text_smg = MIMEText("這是郵件文本內容", "plain", "utf8")
smg.attach(text_smg)
file_msg = MIMEApplication(open(file_path,"rb").read())
file_msg.add_header('content-disposition', 'attachment', filename='report.html')
smg.attach(file_msg)
smg["Subject"] = "測試報告"
smg["From"] = "aaaaaa@qq.com"
smg["To"] = "bbbbbbb@163.com"
smtp.send_message(smg,from_addr="aaaaaa@qq.com",to_addrs="bbbbbbb@163.com")
測試報告都是測試用例運行完之后才生成,那么我們就可以把發郵件這一步放到測試報告生成之后:
import unittest
import os
from common.contants import CASE_DIR, REPORT_DIR
from common.send_email import send_email
# 第一步:創建測試套件
suite = unittest.TestSuite()
# 第二步加載用例到套件
loader = unittest.TestLoader()
suite.addTest(loader.discover(CASE_DIR))
report_path = os.path.join(REPORT_DIR, "report.html")
with open(report_path, "wb") as f:
runner = HTMLTestRunner(stream=f,
title="24期的測試報告",
description="測試報告的描述信息。。。。。",
tester="MuSen"
)
# 運行測試套件
runner.run(suite)
# 執行完代碼之后,發送報告
send_email(report_path)