自動化測試中,測試報告一般都需要發送給相關的人員,比較有效的一個方法是每次執行完測試用例后,將測試報告(HTML、截圖、附件)通過郵件方式發送。
參考代碼:send_mail.py
一、python對SMTP的支持
SMTP(Simple Mail Transfer Protocol)是簡單傳輸協議,它是一組用於用於由源地址到目的地址的郵件傳輸規則。
python中對SMTP進行了簡單的封裝,可以發送純文本郵件、HTML郵件以及帶附件的郵件。
1、python對SMTP的支持
①email模塊:負責構建郵件
②smtplib模塊:負責發送郵件
可以通過help()方法查看SMTP提供的方法:
1 >>> from smtplib import SMTP 2 >>> help(SMTP) 3 Help on class SMTP in module smtplib: 4 5 class SMTP(builtins.object) 6 | This class manages a connection to an SMTP or ESMTP server. 7 | SMTP Objects: 8 | SMTP objects have the following attributes: 9 | helo_resp 10 | This is the message given by the server in response to the 11 | most recent HELO command. 12 | 13 | ehlo_resp 14 | This is the message given by the server in response to the 15 | most recent EHLO command. This is usually multiline. 16 | 17 | does_esmtp 18 | This is a True value _after you do an EHLO command_, if the 19 | server supports ESMTP.
20 | ......
導入SMTP,查看對象注釋。。。。。。
2、sendmail()方法的使用說明
①connect(host,port)方法參數說明
host:指定連接的郵箱服務器
port:指定連接的服務器端口
②login(user,password)方法參數說明
user:登錄郵箱用戶名
password:登錄郵箱密碼
③sendmail(from-addr,to_addrs,msg...)方法參數說明
from_addr:郵件發送者地址
to_addrs:字符串列表,郵件發送地址
msg:發送消息
④quit():結束當前會話
二、發送不同格式的郵件
1、純文本格式的郵件
1 # coding=utf-8 2 import smtplib 3 from email.mime.text import MIMEText 4 # 發送純文本格式的郵件 5 msg = MIMEText('hello,send by python_test...','plain','utf-8') 6 #發送郵箱地址 7 sender = 'sender@163.com' 8 #郵箱授權碼,非登陸密碼 9 password = '123456' 10 #收件箱地址 11 receiver = 'receiver@qq.com' 12 #smtp服務器 13 smtp_server = 'smtp.163.com' 14 #發送郵箱地址 15 msg['From'] = sender 16 #收件箱地址 17 msg['To'] = receiver 18 #主題 19 msg['Subject'] = 'from IMYalost' 20 server = smtplib.SMTP(smtp_server,25) 21 22 server.login(sender,password) 23 server.sendmail(sender,receiver,msg.as_string()) 24 server.quit()
login()方法用來登錄SMTP服務器,sendmail()方法就是發郵件,可以一次發給多個人,所以傳入一個list,郵件正文是一個str,as_string()把MIMEText對象變成str。
為了方便演示,這里用的是163和QQ郵箱,收到的郵件內容如下:
2、HTML格式的郵件
如果想發送HTML類型的郵件,只需要下面的一段代碼即可:
1 # coding=utf-8 2 import smtplib 3 from email.mime.text import MIMEText 4 # 發送HTML格式的郵件 5 msg = MIMEText('<html><h1>人生苦短,我用python</html></h1>','html','utf-8')
收到的郵件內容如下:
PS:注意這里的區別,msg中輸入的是郵件正文,因此需要根據具體內容格式選擇合適的類型!
關於不同類型文件的對應類型,可參考此鏈接:HTTP Content-type 對照表
3、郵件格式的關系
構造一個郵件對象就是一個message對象,如果構造一個MIMEText
對象,就表示一個文本郵件對象,如果構造一個MIMEImage
對象,就表示一個作為附件的圖片;
要把多個對象組合起來,就用MIMEMultipart
對象,而MIMEBase
可以表示任何對象。它們的繼承關系如下:
1 Message 2 +- MIMEBase 3 +- MIMEMultipart 4 +- MIMENonMultipart 5 +- MIMEMessage 6 +- MIMEText 7 +- MIMEImage
可以通過email.mime文檔查看它們所在的包以及詳細的用法。
三、SMTP發送郵件之坑
1、協議之坑
因為采用的是SMTP協議,那么需要確保自己的發送優郵箱地址開啟了SMTP服務,否則,會報錯
2、password之坑
看了很多例子,都是將郵箱登錄密碼設置為password,然后就華麗麗的懵逼了,報錯!!!whf!!!
事實的真相是:password需要輸入郵箱授權碼,而非郵箱登錄密碼!!!
3、各種報錯
我在調試的時候,遇到很多的報錯,大多都是這些:smtplib.SMTPDataError(553/554...)
根據報錯里面的鏈接:see http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html,找到對應的問題,仔細檢查代碼,慢慢debug吧。。。
PS:如果收件郵箱的傳輸經過加密,必須經過SSL加密再STMP傳輸,出現554(發送的郵件內容包含了未被許可的信息,或被系統識別為垃圾郵件),發生了一件有趣的事情:
網易郵箱的處理結果是發生回退,即郵件發送失敗,轉回了收件箱。。。
QQ郵箱的處理結果,是將郵件放進垃圾郵件里面。。。
總結:發生報錯的原因還是技術不到家,不夠細心啊,唉,年輕人。。。
利用python對SMTP的內置封裝支持,發送郵件的代碼和注意事項基本就是以上幾點,當然,其中的代碼都是demo,具體實踐過程還需要根據實際情況做調整。。。