zoukankan      html  css  js  c++  java
  • Flask入门邮件同步与异步发送(九)

    ​ 应用场景: 用户在注册或者密码丢失等过程中,账号绑定邮箱,用户在进行身份认证的过程中,电子邮箱确实是一种很常用的方式,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"] = "xxxxx@163.com"
    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','xialigang@1000phone.com')
    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 = ["xxx@qq.com"]
    msg.add_recipient("xxxx@qq.com")
    
    msg.body = "testing"
    msg.html = "<b>testing</b>"
    
    5 实例化Message 传参如下
    msg = Message(subject="Hello World!",
                  sender="from@qq.com",
                  recipients=["to@example.com"])
    

    但是这样明显发现有个问题,因为是同步单线程的邮件发送,一旦用户多进入消息队列,这样响应时间会较长影响用户体验,因此我们改进下采用异步多线程的形式发送.

    异步多线程发送邮件

    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>
    

    以上就是开启的多线程异步发送邮件,可以处理大量的邮件请求,减少用户的等待时间.

  • 相关阅读:
    Ubuntu-12.04.5 安装 oracle 12.2.0.1 数据库database软件
    Ubuntu-12.04.5 再再再次安装 oracle 11.2.0.4 数据库database软件(又不一样了!)
    Ubuntu-4.10 安装 oracle 11.2.0.4 数据库database软件(最古老的ubuntu)
    PATH add
    可望不可即 可望不可及
    天干地支
    24节气
    二进制、十进制和十六进制转换器
    信用卡三磁道
    ISO8583
  • 原文地址:https://www.cnblogs.com/why957/p/9135745.html
Copyright © 2011-2022 走看看