[TOC]
[Flask] Flask-Mail
Welcome to Flask-Mail, you can use to send mail in your web site.
0x00 簡介
Flask-Mail 提供了一個簡單的接口,讓我們可以方便的在 Flask 應用中使用 SMTP協議 發送郵件。
0x01 安裝
安裝:
pip install Flask-Mail
目前最新版本是 0.9.1 ,從 Flask-Mail 的 github地址可以發現,兩年沒有更新了。不過這個并不影響我們使用,畢竟發送郵件是個比較成熟的東西,只祈求和最新的Flask不要出現兼容問題即可。
如果你不想使用這個工具,可以找找其他的,不過你會發現,其他的可能更老,也是醉了=_=
如果時間充足,我們可以去讀讀 Flask-Mail 的源碼,你會發現,最終是用系統自帶的 smtplib 實現的。
0x02 使用
一句話總結:Flask-Mail 的使用還是相當easy的。
配置
Flask-Mail 使用 Flask 標準的配置 API 進行配置。下面是所有的配置選項:
- MAIL_SERVER : 默認為 '127.0.0.1'
- MAIL_PORT : 默認為 25
- MAIL_USE_TLS : 默認為 False
- MAIL_USE_SSL : 默認為 False
- MAIL_DEBUG : 默認為 app.debug
- MAIL_USERNAME : 默認為 None
- MAIL_PASSWORD : 默認為 None
- MAIL_DEFAULT_SENDER : 默認為 None
- MAIL_MAX_EMAILS : 默認為 None
- MAIL_SUPPRESS_SEND : 默認為 app.testing
- MAIL_ASCII_ATTACHMENTS : 默認為 False
這個配置的參數我們可以在這里看到。
初始化
可以使用下面的兩種方式進行初始化:
-
第一種方式:
使用傳入到 Mail 實例中的應用程序的配置項進行郵件發送
from flask import Flask from flask_mail import Mail app = Flask(__name__) mail = Mail(app)
-
第二種方式:
使用 Flask 的 current_app 中的配置項進行郵件發送,如果我們有多個 不同配置的應用程序 則使用此種方式比較方便
mail = Mail() app = Flask(__name__) mail.init_app(app)
發送
發送之前我們需要先構建一個 Message 對象,如下:
from flask_mail import Message
msg = Message("Hello Flask", sender="ttdevs@gmail.com", recipients=["ttdevs@live.com"])
我們也可以同時指定多個收件人
msg.recipients = ["ttdevs@gmail.com", "ttdevs@foxmail.com"]
msg.add_recipient("ttdevs@live.com")
如果我們配置了 MAIL_DEFAULT_SENDER
字段,就可以不再設置 sender ,這個時候會使用 MAIL_DEFAULT_SENDER
中指定的發件人,像這樣:
msg = Message("Hello Flask", recipients=["ttdevs@live.com"])
如果我們希望在收件列表中顯示一個名字,可以通過一個二元祖來指定:
msg = Message("Hello", sender=("ttdevs", "ttdevs@live.com"))
同時, 我們還可以指定下面兩個字段:
msg.body = "this is body string"
msg.html = "<h2>this is html message</b>"
最后就是發送:
mail.send(msg)
發送完畢后,與郵件服務器的鏈接就會關閉。
發送大量郵件
如果我們一次發送大量的郵件,可以通過下面的方式發送:
with mail.connect() as conn:
for user in users:
message = '...'
subject = "hello, %s" % user.name
msg = Message(recipients=[user.email],
body=message,
subject=subject)
conn.send(msg)
與電子郵件服務器的連接會一直保持直到所有的郵件都已經發送完畢才會斷開。
Some mail servers set a limit on the number of emails sent in a single connection. You can set the max amount of emails to send before reconnecting by specifying theMAIL_MAX_EMAILS setting.
添加附件
在郵件中添加附件同樣非常簡單:
image = 'umbrella_傘.jpg'with app.open_resource(image) as fp:
msg.attach(image, 'image/jpg', fp.read())
0x03 Demo
Demo
下面是一個簡單的Demo,裝好相關的類庫, 直接可以跑,大家可以參考:
#!/usr/bin/env python3
# coding:utf-8
from flask import Flask
from flask_mail import Mail
from flask_mail import Message
app = Flask(__name__)
app.config['MAIL_SERVER'] = 'smtp.qq.com'
app.config['MAIL_PORT'] = 465
app.config['MAIL_USE_SSL'] = True
app.config['MAIL_USERNAME'] = 'iot.raspi@qq.com'
app.config['MAIL_PASSWORD'] = '********'
app.config['MAIL_DEFAULT_SENDER'] = 'iot.raspi@qq.com'
mail = Mail(app)
@app.route('/')
def welcome():
msg = Message('這是一封測試郵件Header', recipients=['56532799@qq.com'])
msg.body = '這是一封測試郵件 bodyer'
msg.html = '這是一封測試郵件 htmler'
image = 'umbrella_傘.jpg'
with app.open_resource(image) as fp:
msg.attach(image, 'image/jpg', fp.read())
mail.send(msg)
return 'Hello world!'
if __name__ == '__main__':
app.run(debug=tuple)
郵件參數說明
上面的Demo中用到QQ郵箱,這里簡單介紹下。由于QQ郵箱需要安全驗證,所以我們配置下面幾個參數:
-
MAIL_SERVER
SMTP地址:smtp.qq.com
-
MAIL_PORT
由于需要安全驗證,所以此處用465
-
MAIL_USE_SSL:True
SSL,走加密方式
-
MAIL_USERNAME
-
MAIL_PASSWORD
這個地方我們需要使用授權碼:
打開QQ郵箱
>設置
>POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務
>生成授權碼
最后別忘了打開SMTP服務~~
0x04 其他
(TODO 留坑,其實暫時還沒學到~~)
單元測試
禁止發送郵件
頭注入
信號量
API
