Python-Flask框架(二),flask_mail模塊的應用
前言
flask_mail 是一個可以跨平臺發送郵件的模塊,是一個十分優秀輕便的模塊,但是如果不認真看文檔的話,這簡單優秀的模塊可能會變的十分“笨”(到底誰笨呢),這篇就講一下如何食用以及剛開始容易遇到的坑吧
官方文檔
再言一句,官方文檔很重要
如何應用
配置
注意:
-
SSL/TLS 加密
MAIL_USE_SSL = True
MAIL_PORT = 465 -
STARTTLS 加密
MAIL_USE_TLS = True
MAIL_PORT = 587 -
163郵箱的服務器不支持STARSSLS加密
-
qq郵箱的MAIL_PASSWORD並不是qq密碼而是授權碼
打開qq郵箱->設置->帳號->下面就是 如何獲得授權碼自己百度一下啊!!!
初始化
方法一
from flask import Flask
from flask_mail import Mail
app = Flask(__name__)
mail = Mail(app)
方法二
flask_mail 也有init_app的方法
from flask import Flask
from flask_mail import Mail
mail = Mail()
app = Flask(__name__)
mail.init_app(app)
初始化完成
發送郵件
更多的細節,翻官方文檔啊
現在的情況是,我打算用qq郵箱給自己發個hello world郵件(授權碼自己配置哦)
from flask import Flask
from flask_mail import Mail, Message
from threading import Thread
app = Flask(__name__)
app.config.update(dict(
DEBUG=True,
MAIL_SERVER='smtp.qq.com',
# MAIL_PORT=587,
# MAIL_USE_TLS=True,
# qq郵箱並沒有限制加密方式
MAIL_PORT=465,
MAIL_USE_SSL=True,
MAIL_USERNAME="[email protected]",
MAIL_PASSWORD="qq郵箱授權碼",
))
mail = Mail(app)
def send_async_email(app, message):
with app.app_context():
mail.send(message)
@app.route('/')
@app.route('/mail')
def index():
try:
message = Message(subject='hello, world!',
sender=('99Kies',app.config["MAIL_USERNAME"]),
recipients=['[email protected]'],
body='Hello World')
thread = Thread(target=send_async_email, args=[app, message])
# 使用多線程
thread.start()
return '發送成功!!!'
except:
return 'Error!!!'
if __name__ == '__main__':
app.run()
# # 手動,添加到app上下文中
# with app.app_context():
# message = Message(subject='hello, world!',
# sender=('99Kies',app.config["MAIL_USERNAME"]),
# recipients=['[email protected]'],
# body='Hello World')
# #
# thread = Thread(target=send_async_email, args=[app, message])
# # 使用多線程
# thread.start()
發送成功!!!需要注意的是 需要將發送郵件和多線程配合使用,這樣主要是爲了當發送郵件時可以進行其他的操作。
配合.env實現
啥概念呢,就是.env裏的內容是可以當成全局變量使用,通過os.getenv()獲得其內容,再將其內容寫入app的配置中即可。
首先安裝python-dotenv庫
pip install python-dotenv
配置文件 .env 內容:
MAIL_SERVER=smtp.qq.com
MAIL_USERNAME="[email protected]"
MAIL_PASSWORD="qq郵箱授權碼"
配置文件需要和代碼文件放在同一級目錄下
from flask import Flask
from flask_mail import Mail, Message
from threading import Thread
import os
app = Flask(__name__)
app.config.update(dict(
DEBUG=True,
MAIL_SERVER=os.getenv('MAIL_SERVER'),
# MAIL_PORT=587,
# MAIL_USE_TLS=True,
MAIL_PORT=465,
MAIL_USE_SSL=True,
MAIL_USERNAME=os.getenv('MAIL_USERNAME'),
MAIL_PASSWORD=os.getenv('MAIL_PASSWORD'),
))
mail = Mail(app)
def send_async_email(app, message):
with app.app_context():
mail.send(message)
@app.route('/')
@app.route('/mail')
def index():
try:
message = Message(subject='hello, world!',
sender=('99Kies',app.config["MAIL_USERNAME"]),
recipients=['[email protected]'],
body='Hello World')
thread = Thread(target=send_async_email, args=[app, message])
# 使用多線程
thread.start()
return '發送成功!!!'
except:
return 'Error!!!'
if __name__ == '__main__':
app.run()
# # 手動,添加到app上下文中
# with app.app_context():
# message = Message(subject='hello, world!',
# sender=('99Kies',app.config["MAIL_USERNAME"]),
# recipients=['[email protected]'],
# body='Hello World')
# #
# thread = Thread(target=send_async_email, args=[app, message])
# # 使用多線程
# thread.start()
利用flask_mail庫製作 “郵箱轟炸機”
爲了快速提醒一個同學起牀打代碼,我們就需要多進程來幫助我們發送郵件。
from flask import Flask
from flask_mail import Mail, Message
from threading import Thread
import os
from multiprocessing.pool import Pool
app = Flask(__name__)
app.config.update(dict(
DEBUG=True,
MAIL_SERVER=os.getenv('MAIL_SERVER'),
# MAIL_PORT=587,
# MAIL_USE_TLS=True,
MAIL_PORT=465,
MAIL_USE_SSL=True,
MAIL_USERNAME=os.getenv('MAIL_USERNAME'),
MAIL_PASSWORD=os.getenv('MAIL_PASSWORD'),
))
mail = Mail(app)
def send_async_email(app, message):
with app.app_context():
mail.send(message)
def main(i):
with app.app_context():
message = Message(subject='hello, world!',
sender=('99Kies',app.config["MAIL_USERNAME"]),
recipients=['[email protected]'],
body='Hello World')
#
thread = Thread(target=send_async_email, args=[app, message])
# 使用多線程
thread.start()
print(i)
@app.route('/')
def index():
pool = Pool()
group = [i for i in range(50)]
print(group)
pool.map(main, group)
pool.close()
pool.join()
return 'hello'
if __name__ == '__main__':
app.run(debug=True)
需要注意的是 qq郵箱是有防護措施的,如果發送過多的郵件。。。
在使用.env時容易遇到的問題(大坑必看)
所謂坑就是 別人和你的代碼一模一樣 別人可以跑,你就有bug
下面是可能會遇到的錯誤
兩種報錯,一個原因,就是因爲沒有安裝python-dotenv庫,如果沒有安裝python-dotenv那麼os.getenv()的內容就是None
解決方法就是安裝python-dotenv庫了,但是又有一個問題,當安裝python-dotenv之後,就無法使用flask shell, flask command 等相關命令了,所以這反人類的設計,有點讓人抓狂,還好我們有強大的ide可以通過ctrl+shift+f10實現flask run