應用場景: 用戶在註冊或者密碼丟失等過程中,賬號綁定郵箱,用戶在進行身份認證的過程中,電子郵箱確實是一種很常用的方式,Python中提供了smtplib可以實現發送電子郵件功能,Flask框架也有對應的flask email庫,擴展對電子發送的支持 安裝 導入及初始化 Flask mail可以連 ...
應用場景: 用戶在註冊或者密碼丟失等過程中,賬號綁定郵箱,用戶在進行身份認證的過程中,電子郵箱確實是一種很常用的方式,Python中提供了smtplib可以實現發送電子郵件功能,Flask框架也有對應的flask-email庫,擴展對電子發送的支持
安裝
pip3 install flask-mail
導入及初始化
from flask_mail import Mail
mail=Mail(app)
Flask-mail可以連接SMTP伺服器,並把郵件利用這個伺服器發送出去. Flask-mail伺服器相關配置參數:
參數 | 預設值 | 說明 |
---|---|---|
MAIL_SERVER | loaclhost | SMTP伺服器主機或者IP地址 |
MAIL_PORT | 25 | 電子郵件伺服器埠 |
MAIL_USE_TLS | False | 是否啟用傳輸層安全協議(TLS) |
MAIL_USE_SSL | False | 是否啟用安全套接層協議(SSL) |
MAIL_USERNAME | None | 電子郵箱賬號用戶名 |
MAIL_PASSWORD | None | 電子郵箱賬號密碼 |
MAIL_DEBUG | False | 是否啟動調試 |
一般在配置文件config配置如下
#方式1在config文件中配置
MAIL_SERVER='smtp.163.com'
MAIL_PORT=25
MAIL_USE_TLS=True
MAIL_USERNAME='***@163.com'
MAIL_PASSWORD='******'
MAIL_DEBUG=True
#方式2 在app中配置
app.config["MAIL_SERVER"] = "smtp.163.com"
app.config["MAIL_PORT"] = 25
app.config["MAIL_USE_SSL"] = True
app.config["MAIL_USERNAME"] = "[email protected]"
app.config["MAIL_PASSWORD"] = "123456"
#方式3 在app中直接配置config
app.config['MAIL_SERVER'] = os.environ.get('MAIL_SERVER','smtp.1000phone.com')
app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME','[email protected]')
app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD','123456')
# os.environ.get('環境變數名','環境變數值'),將獲取的環境變數綁定到config文件
同步郵件發送
from flask import Flask, render_template_string
from flask_mail import Mail, Message
import os
app = Flask(__name__)
app.config['MAIL_SERVER'] = os.environ.get('MAIL_SERVER', 'smtp.163.com')
app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME', '發件人@163.com')
app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD', 'mm22kk11')
# 綁定實例化mail對象
mail = Mail(app)
@app.route('/')
def index():
msg = Message(subject='郵件激活', recipients=['收件人@qq.com'], sender=app.config['MAIL_USERNAME'])
msg.html = render_template_string('<h1>大郎,我是金蓮啊<h1>')
mail.send(message=msg)
return '發送郵件'
if __name__ == '__main__':
app.run(debug=True)
# sender 發送人郵箱 recipients接收人郵箱
# smtp為發送郵件伺服器
註意:
1 subject為郵件標題。
2 sender為發送方
3 recipients為接收方,可以設置一個或者多個收件人,也可以後續再添加
4 郵件內容可以包含主體body以及/或者 HTML:
msg.recipients = ["[email protected]"]
msg.add_recipient("[email protected]")
msg.body = "testing"
msg.html = "<b>testing</b>"
5 實例化Message 傳參如下
msg = Message(subject="Hello World!",
sender="[email protected]",
recipients=["[email protected]"])
但是這樣明顯發現有個問題,因為是同步單線程的郵件發送,一旦用戶多進入消息隊列,這樣響應時間會較長影響用戶體驗,因此我們改進下採用非同步多線程的形式發送.
非同步多線程發送郵件
from flask import Flask,render_template_string,render_template
from flask_mail import Mail,Message
import os
from threading import Thread
app = Flask(__name__)
app.config['MAIL_SERVER'] = os.environ.get('MAIL_SERVER','smtp.163.com')
app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME','發件人@163.com')
app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD','mm22kk11')
mail = Mail(app)
#開啟非同步處理
def async_send_mail(app,msg):
#獲取當前程式的上下文
with app.app_context():
#郵件發送
mail.send(message=msg)
def send_mail(subject,to,tem,**kwargs):
#實例化的message對象(subject,recipients,sender)
msg = Message(subject=subject, recipients=[to], sender=app.config['MAIL_USERNAME'])
#重定向到mail.html
msg.html = render_template(tem+'.html',**kwargs)
#thread代表發送郵件的線程信息
thread = Thread(target=async_send_mail,args=(app,msg))
thread.start()
@app.route('/')
def index():
send_mail('郵件激活','收件人@qq.com','mail',username='zhangsan')
return '發送郵件'
if __name__ == '__main__':
app.run(debug=True)
#mail.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>郵件信息</title>
</head>
<body>
{{ username }},金蓮我來了!!
</body>
</html>
以上就是開啟的多線程非同步發送郵件,可以處理大量的郵件請求,減少用戶的等待時間.