flask
flask_ext
python
mail
flask-mail
本身是將smtplib
包裝起來的一個套件,這部份可以從flask-mail.py
看的出來,搭配Flask應用對於我們派送註冊驗證信或警示訊息傳遞都非常實用。
import的模式跟其它擴展一樣都有兩種方式,實作的時候放入app
,或是利用init_app
,視你的使用情境來選用,如下兩個範例:
如果你有使用github
的習慣也請注意,flask-mail
的參數設置或許會有隱密性資料,請記得使用環境變數來設置,如下(Windows範例):
設置之後,就可以利用os.environ.get
來取得環境變數,如此即可避免敏感資訊置於公開場合
這次的範例使用的是hotmail
做SMTP Server,如果你使用的是公司內部的Mail Server或是Gmail,再依實際情況調整設置即可,如下範例:
相關的說明皆寫於註解,設置完畢之後就可以執行專案測試,輸入網址http://127.0.0.1:5000/message
,得到訊息如下:
現在可以開啟郵箱來確認是否收到信件,如下:
在flask-mail
中有三個class分別為Mail
,Message
,Connection
,這部份最好的理解方式就是看一次官方文件說明。
Message
是實作郵件內容的類別,除了可以以文字做內容之外,也可以利用Html,這代表我們可以利用jinja2
的樣板來做渲染,也可以透過attach
實作夾帶附件。(下面有簡單說明)
另外,不同於操作smtplib
需要做connect
,在實作Mail.send
的時候flask-mail
會幫我們處理這部份的作業。
參考來源請見文章開頭連結
使用非同步的主因在於不希望使用者在按下發送信件按鈕之後需要浪費時間等待寄送信件的程序,這個等待時間會造成使用者體驗不佳,而且使用者也不需要浪費時間等待,因此利用多執行緒將使用者點擊按鈕之後的信件派送程序切割,如下範例:
第44行:你必需讓程序是在相同的Context內,因此需要也必需利用app.app_context
來確保線程。
這個範例我用Html做郵件內容的渲染,如下:
threading
的部份不在此節的範圍,不多說,我們看send_async_email
這個function。我們取得了app
跟msg
兩個物件之後,利用了app.app_context
來讓整個程序是在一個程序的上下文內,這是flask-mail
中的send
的限制。
雖然兩個物件都是從context
中傳來的,但是因為我們開了另一個新的thread
,所以必需手動將物件放入一個程序上下文中。
調整為非同步模式,執行專案會發現流暢許多,網頁不會有停頓的感覺,整個使用者的體驗是可以有效提高的,因為使用者不需要再等待信件派送的程序。
如果你拿掉了with app.app_context
的話,會有以下錯誤說明:
這一話我們討論了flask-mail
的應用以及非同步對使用者體驗的改善,在非同步的部份如果相進一步的瞭解,會建議可以搭配Celery
來使用,值得學習,另外我們將測試使用jinja2
來實作版面,不要忘了繼續學習。
Flask-Mail_利用模板渲染:Flask實作_ext_10_Flask-Mail_利用模板渲染
部份配合原始碼看一下比較能夠理解,如下圖說明:
使用gmail記得要先申請低安全性應用程式的密碼,可以產生一組跟你的密碼不同的密碼,不過如果你有申請兩段式登入認證的話,就不能用了!
如果覺得使用其它smtp測試很麻煩的話,可以試著自己建置一個測試用的smtp。
只是個人透過此方法沒有成功過,我另外寫一個利用smtplib直接寄可以成功,利用telnet去測也正常,但是透過flask-mail一直出現錯誤訊息(目標電腦拒絕連線 10061),如果有成功的前輩再指導。