測試開發【提測平台】分享11-Python實現郵件發送的兩種方法實踐

微信搜索【大奇測試開】,關注這個堅持分享測試開發乾貨的傢伙。

按照開發安排,本篇本應該是關於提測頁面的搜索和顯示實現,怕相似內容疲勞,這期改下內容順序,將郵件服務的相關的提前,在之前的產品需求和原型中有一個功能點,就是需要在提測人進行提測,以及測試完成的操作的時候要按照一定的模版發送郵件通知,那我們就研究一下Python flask 後台服務如何實現發送郵件的知識點,最後形成一個郵件工具類,以便在實現提測功能流程中使用。

本篇內容思維導讀

內置郵件模塊 smtplib

從某度搜索關於python如何發送郵件,給到結果最多的就是 smtplib,資料參差不齊,抑或內容太陳舊,這裡通過實踐整理總結如下:

首先 了解基本使用

官方 [註解1] 的語法以及教程參考 [註解2]:

# 導入包,python環境默認自有,無需而外安裝
import smtplib
from smtplib import SMTP

# 通過給定參數鏈接服務對象
smtplib.SMTP(host='', port=0, local_hostname=None, [timeout, ]source_address=None)
# 或需要SSL連接
smtplib.SMTP_SSL(host='', port=0, local_hostname=None, keyfile=None, certfile=None, [timeout, ]context=None, source_address=None)

# 支持with方式,否則一般上邊的操作需要手動關閉
with smtplib.SMTP("domain.org") as smtp:
     # 配置發送地址和內容等

建立服務對象重要參數說明:

  • host: SMTP 服務器主機。你可以指定主機的ip地址或者域名;

  • port: 需要指定 SMTP 服務使用的端口號,一般情況下 SMTP 端口號為25;

 

Python SMTP 對象使用 sendmail 方法發送郵件,語法如下:

SMTP.sendmail(from_addr, to_addrs, msg, mail_options=(), rcpt_options=())
其中重要參數說明:
  • from_addr: 郵件發送者地址。

  • to_addrs: 字符串列表,郵件發送地址。

  • msg: 發送消息

其次 準備一個可用的郵件發送服務

可以本地,公司郵箱服務,或者是第三方服務,我這裡準備的一個測試郵件服務是「企業微信郵箱」,如果你在編碼測試過程中沒有可用的,可以私信我發我信息,給你添加個我註冊測試用的企業微信郵箱,也可以直接使用自己的如網易和QQ郵箱,只不過需要提前在設置開啟對應的權限設置,具體配置可以在網上搜索下。用賬號密碼登錄企業郵箱後在設置中找到如圖信息,在測試代碼中會使用到。

最後 一個完整的例子

直接通過給定HTML樣式,實現模版發送,內容文字+鏈接,這裡需要特別注意的是測試「微信企業郵箱」鏈接需要SSL,所以需要使用 SMTP_SSL 創建鏈接,而非往上很多例子使用SMTP進行創建,對應代碼(源代碼在github上)和執行測試內容如下:

查看我自己的郵箱是否真的收到了郵件,可以看到功能正常,上邊代碼中有一處需要主要是發件人和服務登錄人應為為同一個否則會報SMTP 501錯誤。

但這裡有個問題,在郵箱列表裡的發件人信息和詳細內容里的郵件人信息展示異常,如圖:列表顯示空白,郵件詳細沒能正確顯示郵箱等。

 

 經過資料查詢,需要依賴包的一個工具類進行格式化,分別是email.utils 中的 parseaddr, formataddr,經過優化後代碼如圖紅色標註: 

增加優化邏輯後再發送一個測試郵件,看看結果,列表和詳細都正常顯示了。

 

本來調研的例子還準備寫如何添加附件和圖片等,看了麻煩,另外從上邊的體驗來看smtplib坑不少,然後在解決的問題的過程中發現有文章推薦 yagmail 這個python郵件服務包,感覺眼前一亮,有更好的方法就要學會使用,因為我們處在了一個好的信息共享時代~

簡單易用郵件模塊 yagmail

yagmail 使用

yagmail 是個外部包,使用前需要安裝

# 可能需要外網訪問
pip3 install yagmail
# 或從github安裝
pip3 install -e git+//github.com/kootenpv/yagmail#egg=yagmail

從實踐的例子來看,發送郵件變得如此簡單,不需要多說,直接上代碼:

def demo_yagmail():
    # 設置收件人(不需要再設置發件人)
    receivers = ['[email protected]', '[email protected]']
    # 郵件主題
    subject = 'Yagmail測試主題'
    # 內容,可以單獨定義,然後組成一個內容體
    body = 'Body描述'
    html = '<a href="//github.com/mrzcode/TestProjectManagement">項目代碼點我!</a>'

    # 附件文件絕對路徑, 或者 通過open打開直接給io流文件
    path_file = os.path.dirname(os.path.abspath(__file__))+'/source/result.txt'
    attachments =[path_file]

    # 初始化服務對象直接根據參數給定,更多參考SMTP()內部
    server = yagmail.SMTP(host='smtp.exmail.qq.com', port=465, user='[email protected]', password='Test@2021')
    # 發送內容,設置接受人等信息,更多參考SMTP.send()內部
    server.send(to=receivers,
                subject=subject,
                contents=[body, html],
                attachments=attachments)

    server.close()
    print("郵件發送的如此簡單!")

if __name__ == "__main__":
    demo_yagmail()

看看發送結果,正常收到,各項均沒有異常,完美~ 更多參數說明參考官方 [注釋3] 或者在idea 開發工具點跳到源碼。

是不是Pyhon 發送郵件變得如此輕鬆愉快了~,上述的調研實踐代碼均提交到git項目代碼庫了,可以前去查看位置:/demoCode/emailDemo.py

郵件工具類編寫

調研和實踐完了上述「Python 如何實現郵件發送服務」 內容,最終目的是編寫個工具類和一些方法來供後續的提測流程使用

1. configs/config.py 添加郵件服務的常量

# config.py
MAIL_HOST = "發送服務的地址"
MAIL_PORT = 25
MAIL_USER = "發送服務郵箱賬號"
MAIL_PASSWORD = "發送服務郵箱密碼"

2. 創建/utils/emialUtils.py 實現的參數化方法,這裡對於模版因為是否也定義在其中,後邊實際開發後再優化

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import yagmail
import traceback
from configs import config
'''
receivers 收件人,字符數組['郵件地址']
subject 郵件主題, 字符串
contents 郵件內容,自定義 字符數組
attachments 附件默認為空
'''
def sendEmail(receivers, subject,contents, attachments=[]):

    try:
        # 初始化服務對象直接根據參數給定,更多參考SMTP()內部
        server = yagmail.SMTP(host=config.MAIL_HOST, port=config.MAIL_PORT,
                              user=config.MAIL_USER, password=config.MAIL_PASSWORD)
        # 發送內容,設置接受人等信息,更多參考SMTP.send()內部
        server.send(to=receivers,
                    subject=subject,
                    contents=contents,
                    attachments=attachments)
        server.close()    except Exception:
        print('traceback.format_exc(): {}'.format(traceback.format_exc()))
        return False

    # 無任何異常表示發送成功
    return True

3. 調用測試,工具類直接編寫變量調用方法進行測試,查看郵件發送是否OK

if __name__ == "__main__":
    # 測試發送服務
    receivers = ['[email protected]', '[email protected]']
    subject = 'DaQi工具類測試'
    body = '簡單的問題內容體'
    sendEmail(receivers,subject,[body])

以上本篇內容所有知識點,後邊文章會繼續進行提測平台功能開發,另外馬上也到國慶了,不知道依然不敢太放肆走的你,有什麼安排,如果宅家裡,學學習,動動手也是不錯的選擇,也提前透漏下,後邊文章更新會上一些新方向,比如性能測試,比如接口自動化測試等等,敬請期待下吧,祝大家2021國慶快樂!

問題集錦

1. smtplib騰訊郵箱鏈接和收發郵件人顯示問題

使用SMTP_SSL()創建鏈接而非SMTP(),顯示問題通過工具類方法parseaddr, formataddr優化發送和接收郵件地址格式 

2. 郵箱服務常見的兩個錯誤提示

  • 賬號或密碼錯誤 535, b’Error: authentication failed, system busy’)

  • 發送人和登錄不一致 501, b’mail from address must be same as authorization user)

【代碼更新】

  • 地址://github.com/mrzcode/TestProjectManagement

  • TAG:TPMShare11

【註解&參考】

  • [註解1]://docs.python.org/zh-cn/3.8/library/smtplib.html#

  • [註解2]://www.runoob.com/python/python-email.html

  • [註解3]://github.com/kootenpv/yagmail

堅持原創,堅持實踐,堅持乾貨,如果你覺得有用,請點擊推薦,也歡迎關注我博客園和微信公眾號。