python:利用smtplib模塊發送郵件


自動化測試中,測試報告一般都需要發送給相關的人員,比較有效的一個方法是每次執行完測試用例后,將測試報告(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郵箱的處理結果,是將郵件放進垃圾郵件里面。。。

總結:發生報錯的原因還是技術不到家,不夠細心啊,唉,年輕人。。。

附:常用的郵箱服務器(POP3、SMTP)地址、端口

 

利用python對SMTP的內置封裝支持,發送郵件的代碼和注意事項基本就是以上幾點,當然,其中的代碼都是demo,具體實踐過程還需要根據實際情況做調整。。。

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM