使用依赖:flask
flask_mailapp
安装方式: 异步
pip3 install flask-mail
代码示例: async
from flask import Flask from flask_mail import Mail, Message app = Flask(__name__)
#经过app.config对象的update()方法来加载配置 app.config.update( MAIL_SERVER="smtp.xxx.com", MAIL_USE_SSL=True, MAIL_PORT=465, MAIL_USERNAME='wangju@xxx.com', MAIL_PASSWORD="受权码", MAIL_DEFAULT_SENDER=('wangju', 'wangju@xxx.com') #默认发件人 发件人邮箱
) mail = Mail(app) subject='脚本测试用例维护通知' #邮件主题
recipients='wxx@xxx.com' #收件人
body='测试邮件' #邮件内容
#发送邮件
def send_email(subject,to,body): message = Message(subject,recipients=[to],body=body) mail.send(message) @app.route('/') def subscribe(): send_email(subject,'收件人邮件',body) return '发送邮件成功,请查收'
if __name__ == '__main__': app.run(debug=True)
遇到的问题1:ide
运行demo.py时报错:函数
查询了一番,只知道这个错的意思是没有激活上下文,可是不清楚,没有激活上下文又表明什么意思。测试
最后才发现,原来就是我在demo.py中spa
加了视图函数subscribe(),并在其中调用 send_email,就能够正常发送邮件了。线程
参考文档:debug
遇到的问题2:
在视图函数中调用 send_email()函数,致使响应时间超过20秒
这是由于 程序正在发送电子邮件,发信的操做阻断了请求-响应循环,直到发信的send_mail()函数调用结束后,视图函数才会返回响应。
为了不这个延迟,能够将发信函数放入后台线程异步执行。
示例代码:
from threading import Thread #异步发送电子邮件
def _send_async_mail(app,message): with app.app_context(): mail.send(message) def send_email(subject,to,body): message = Message(subject,recipients=[to],body=body) thr=Thread(target=_send_async_mail,args=[app,message]) thr.start() return thr
由于Flask-Mail的send()方法内部调用逻辑中使用了current_app变量,而这个变量只在激活的程序上下文中才存在,这里在后台线程调用
发信函数,可是后台线程并无程序上下文存在。为了正常实现发信功能,咱们传入程序实例app做为参数,并调用app.app_context()手动激活程序上下文 。
再次调用接口发现,响应时间从原来的20s变为了0.7s