zoukankan      html  css  js  c++  java
  • 【flask-Email】邮件发送

    使用依赖:

    flask_mail

    安装方式: 

    pip3 install flask-mail

     代码示例: 

    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:

    运行demo.py时报错:

    RuntimeError: Working outside of application context

    查询了一番,只知道这个错的意思是没有激活上下文,但是不清楚,没有激活上下文又代表什么意思。

    最后才发现,原来就是我在demo.py中

     

    加了视图函数subscribe(),并在其中调用 send_email,就可以正常发送邮件了。

     

    参考文档:

    Flask抛出RuntimeError: Working outside of application context.错误

    遇到的问题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

  • 相关阅读:
    北京六环附近及往内的可驾驶道路网络(路网graph为连通图)
    OSM数据处理-python工具包
    小程序踩坑
    小程序基本配置
    JavaScript 基础(四):Array
    MYSQL--慎用group_concat()
    真正高效的SQLSERVER分页查询
    PhpStorm Git 操作
    linux 查看当前目录文件的大小
    @PostConstruct和@PreDestroy的使用说明
  • 原文地址:https://www.cnblogs.com/kaerxifa/p/11753461.html
Copyright © 2011-2022 走看看