1. 程式人生 > >python介面自動化(三十)--html測試報告通過郵件發出去——中(詳解)

python介面自動化(三十)--html測試報告通過郵件發出去——中(詳解)

簡介

  上一篇,我們雖然已經將生成的最新的測試報告發出去了,但是MIMEText 只能傳送正文,無法帶附件,因此我還需要繼續改造我們的程式碼,實現可以傳送帶有附件的郵件。傳送帶附件的需要匯入另外一個模組 MIMEMultipart。還有就是測

試負責人不止一個人,需要將測試報告發給多個人,也就是多個收件人。這篇主要是圍繞這兩個主題進行講解的。

 大致思路

(一)帶有附件傳送郵件

1、匯入模組 MIMEMultipart

from email.mime.multipart import MIMEMultipart

2、先讀取要傳送檔案的內容,file_new 是測試報告路徑的引數名

 

3、下圖紅色框框 file_name 引數是傳送的附件重新命名

 

4、file_new 是測試報告路徑的引數名,傳送郵件是將其傳入

5、執行結果

6、檢視收件箱

(二)傳送給多個收件人

上面都是發給一個收件人,那麼如何一次發給多個收件人呢?其實是非常簡單的,只需改兩個小地方,即可,從這裡就可以看出python的強大之處。
1、原始碼

2、仿造修改

3、執行結果

4、收件箱檢視

公司郵箱

 

 

QQ郵箱

 

參考程式碼

# coding=utf-8
#1.先設定編碼,utf-8可支援中英文,如上,一般放在第一行

#2.註釋:包括記錄建立時間,建立人,專案名稱。
'''
Created on 2019-5-7
@author: 北京-巨集哥
Project:學習和使用將測試報告通過郵件發出去且郵件帶有附件
'''
#3.匯入unittest模組
import unittest
import os
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
import smtplib
#4.編寫測試用例和斷言
def all_case():
    # 待執行用例的目錄
    #case_dir = "C:\\Users\\DELL\\PycharmProjects\\honggetest\\case"
    case_dir = os.path.join(os.getcwd(), "case")
    testcase = unittest.TestSuite()
    discover = unittest.defaultTestLoader.discover(case_dir,
                                                   pattern="test*.py",
                                                   top_level_dir=None)
    # #discover方法篩選出用例,迴圈新增到測試套件中
    # for test_suit in discover:
    #     for test_case in test_suit:
    #         #新增用力到testcase
    #         testcase.addTests(test_case)
    # print(testcase)
    testcase.addTests(discover)  # 直接載入 discover    可以相容python2和3
    print(testcase)
    return testcase
# ==============定義傳送郵件==========
def send_mail(file_new):
    #-----------1.跟發件相關的引數------
    smtpserver = 'smtp.mxhichina.com'                #發件伺服器
    port = 0                      #埠
    username = '[email protected]'  #發件箱使用者名稱
    password = 'ceXXx@@123'        #發件箱密碼
    sender = '[email protected]'    #發件人郵箱
    receiver = ['[email protected]','[email protected]'] #收件人郵箱
    # ----------2.編輯郵件的內容------
    #讀檔案
    f = open(file_new, 'rb')
    mail_body = f.read()
    f.close()
    # 郵件正文是MIMEText
    body = MIMEText(mail_body, 'html', 'utf-8')
    # 郵件物件
    msg = MIMEMultipart()
    msg['Subject'] = Header("自動化測試報告", 'utf-8').encode()#主題
    msg['From'] = Header(u'測試機 <%s>'%sender)                #發件人
    msg['To'] = Header(u'測試負責人 <%s>'%receiver)            #收件人
    msg['To'] = ';'.join(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="test_report.html"'
    msg.attach(att)
    # ----------3.傳送郵件------
    try:
        smtp = smtplib.SMTP()
        smtp.connect(smtpserver)  # 連伺服器
        smtp.login(sender, password)
    except:
        smtp = smtplib.SMTP_SSL(smtpserver, port)
        smtp.login(sender, password)  # 登入
    smtp.sendmail(sender, receiver, msg.as_string())  # 傳送
    smtp.quit()
    # #傳送郵件
    # smtp = smtplib.SMTP()
    # smtp.connect('smtp.mxhichina.com')  # 郵箱伺服器
    # smtp.login(username, password)  # 登入郵箱
    # smtp.sendmail(sender, receiver, msg.as_string())  # 傳送者和接收者
    # smtp.quit()
    print("郵件已發出!注意查收。")
# ======查詢測試目錄,找到最新生成的測試報告檔案======
def new_report(test_report):
    lists = os.listdir(test_report)  # 列出目錄的下所有檔案和資料夾儲存到lists
    lists.sort(key=lambda fn: os.path.getmtime(test_report + "\\" + fn))  # 按時間排序
    file_new = os.path.join(test_report, lists[-1])  # 獲取最新的檔案儲存到file_new
    print(file_new)
    return file_new
if __name__ == "__main__":
    # 返回例項
    runner = unittest.TextTestRunner()
    #匯入第三方模組HTMLTestRunner
    import HTMLTestReportCN
    import time
    # 獲取當前時間,這樣便於下面的使用。
    now = time.strftime("%Y-%m-%M-%H_%M_%S", time.localtime(time.time()))
    #儲存生成報告的路徑
    report_path =  "C:\\Users\\DELL\\PycharmProjects\\honggetest\\report\\"+now+"_result.html"
    fp = open(report_path,'wb')
    runner = HTMLTestReportCN.HTMLTestRunner(stream=fp,
                                           title=u"這是我的自動化測試用例",
                                           description=u"用例執行情況",
                                           verbosity = 2
                                           )
    # run 所有用例
    runner.run(all_case())
    #關閉檔案,記住用open()開啟檔案後一定要記得關閉它,否則會佔用系統的可開啟檔案控制代碼數。
    fp.close()
    #測試報告資料夾
    test_path = "C:\\Users\\DELL\\PycharmProjects\\honggetest\\report\\"
    new_report = new_report(test_path)
    send_mail(new_report)  # 傳送測試報告

小結

 1、第二處我註釋掉也可以發出去,兩個收件人可以收到郵件,但是如果這樣的話,公司郵箱收件人只顯示一個收件人,QQ郵箱顯示兩個收件人。

公司郵箱    PS:如果將紅色框上邊的註釋掉,下邊的不註釋,就可以看到兩個收件人的郵箱

 

 以下是個人愚見,如果不對請指出

from email.mime.text import MIMEText

from email.mime.multipart import MIMEMultipart

import smtplib

以上是匯入的包,通過email和smtplib實現發郵件。

折騰好久,發現是這樣:email中收件人和sendmail中的收件人是沒啥聯絡的。

mail_to = ['[email protected]','[email protected]']

server = smtplib.SMTP()

server.connect()

server.sendmail(mail_from, mail_to, msg.as_string())

server.quit()

mail_to = '[email protected],[email protected]'

msg = MIMEMultipart('related') ##採用related定義內嵌資源的郵件體

msgtext = MIMEText(content,_subtype='html',_charset='utf-8') ##_subtype有plain,html等格式,避免使用錯誤

msg['Subject'] = subject

msg['From'] = mail_from

msg['To'] =mail_to

sendmail中收件人,它的格式應該為list。這個為實際的收件人地址。

而msg['To'] 格式是字串(str)。這個只是為了郵件中打印出來而已。

sendmail查原始碼,python/lib/smtplib.py大概690行左右,或者搜尋tolist。

2、在使用python新增附件傳送時報錯:Cannot attach additional subparts to non-multipart/* 

查詢得知,錯誤的原因在於缺少這行程式碼:

msg = MIMEMultipart() 

將這行加上:msg = MIMEMultipart() 即可

 郵件收不到的幾種原因

1、Subject 和正文內容不要用 hello、hehe、test 等單詞

2、from(發件人)和 to(收件人)不要為空,(要不然會被認為是垃圾郵件)

3、找不到的話,先看下垃圾信箱,是不是跑到垃圾箱了

4、如果前幾次可以收到,後來收不到了,需改下 subject 內容(因為每次都是一個 subject,系統也會拒收的,把 subject 內容設定為動態的是最好的)

5、部分郵箱是 ssl 加密了的,所以無法傳送,如:qq 郵箱(用授權碼去登入)

6、要是按照上面的步驟來報錯了,說明程式碼抄錯了,多檢查幾次。