【python3.x】傳送自動化測試報告郵件

miki_peng發表於2021-02-28

​ SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協議,它是一組用於由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。python的smtplib提供了一種很方便的途徑傳送電子郵件。它對smtp協議進行了簡單的封裝。

​ python發郵件主要需要兩個模組:smtplibemail,這兩個模組是python自帶的庫,import即可使用。smtplib主要負責傳送郵件,即一個傳送郵件的動作,如連線郵箱伺服器,登入郵箱,傳送郵件。email主要負責構造郵件,指的是郵箱頁面顯示的一些構造,如發件人,收件人,主題,正文,附件等。

傳送郵件

​ 涉及的部分引數說明:

  • 連線到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') #設定圖片ID
    • msg.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)

相關文章