zoukankan      html  css  js  c++  java
  • 【简说Python WEB】flask-mail电子邮件

    系统环境:Ubuntu 18.04.1 LTS

    Python使用的是虚拟环境:virutalenv

    Python的版本:Python 3.6.9

    flask-mail

    1.安装flask-mail

    pip install flask-mail
    

    2.配置flask-mail使用qq邮箱

    flask-mail STMP服务器的配置

    配置 默认值 说明
    MAIL_SERVER localhost smtp电子邮件服务器的主机名或IP地址
    MAIL_PORT 25 电子邮件服务器的端口
    MAIL_USE_TLS False 是否启用传输层(TLS,transport layer security)安全协议
    MAIL_USE_SSL False 是否启用安全套接字层(SSL,secure sockets Layer)安全协议
    MAIL_USERNAME None 邮件的用户名
    MAIL_PASSWORD None 邮件的密码

    app.py代码添加如下 :

    import os
    
    app.config['MAIL_SERVER'] = 'smtp.qq.com'
    app.config['MAIL_PORT'] = 587
    app.config['MAIL_USE_TLS'] = True
    app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME')
    app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD')
    
    

    3.初始化flask-mail

    from flask_mail import Mail, Message
    
    
    mail = Mail(app)
    

    因为用户名和密码都是非常敏感的信息,可以通过设置环境变量。

    如下;

    export MAIL_USERNAME=<qqmail username>
    export MAIL_PASSWORD=<qqmail password>
    

    flask shell发送邮件

    (zsdpy1) zsd@zsd-virtual-machine:~/Zflask/app$ flask shell
    Python 3.6.9 (default, Nov  7 2019, 10:44:02) 
    [GCC 8.3.0] on linux
    App: app [production]
    Instance: /home/zsd/Zflask/app/instance
    >>> from flask_mail import Message
    >>> from hello import mail
    >>> from app import mail     
    >>> msg = Message('测试邮件',sender='543421410@qq.com',recipients=['543421410@qq.com'])
    >>> msg.body='这是第一封flask-mail的测试邮件'
    >>> with app.app_context():
    ...     mail.send(msg)
    ... 
    
    

    可以看到发送方和接收方是同一个人。

    发送的效果如下:

    应用中集成电子邮件发送功能

    为了避免每次发送邮件要编写,标题,主体,发送方等等。可以把通用部分抽象出来,定义一个函数,避免重复。

    app.py再次修改如下:

    app.config['ZSD_MAIL_SUBJECT_PREFIX'] = '[ZSD博客]'
    app.config['ZSD_MAIL_SENDER'] = 'ZSD博客 管理员 <543421410@qq.com>'
    app.config['ZSD_ADMIN'] = os.environ.get('ZSD_ADMIN')
    
    def send_email(to, subject, template, **kwargs):
        msg = Message(app.config['ZSD_MAIL_SUBJECT_PREFIX'] + ' ' + subject,
                      sender=app.config['ZSD_MAIL_SENDER'], recipients=[to])
        msg.body = render_template(template + '.txt', **kwargs)
        msg.html = render_template(template + '.html', **kwargs)
        mail.send(msg)
    

    send_email(to, subject, template, **kwargs)定义了,收件人地址,主体,邮件正文的模板参数吗和关键字参数列表等。

    在index()视图函数中,定义功能:每当form表单提交新的名字,数据库会插入一条数据,管理员会受到一封邮件。如下 :

    #...
    app.config['ZSD_ADMIN'] = os.environ.get('ZSD_ADMIN')
    #...
    @app.route('/', methods=['GET', 'POST'])
    def index():
        form = NameForm()
        if form.validate_on_submit():
            user = User.query.filter_by(username=form.name.data).first()
            if user is None:
                user = User(username=form.name.data)
                db.session.add(user)
                db.session.commit()
                session['known'] = False
                if app.config['ZSD_ADMIN']:
                    send_email(app.config['ZSD_ADMIN'],'新用户来了','mail/new_user',user=user)
            else :
                session['known'] = True
            session['name'] = form.name.data
            form.name.data = ''
            return redirect(url_for('index'))
        return render_template('index.html', form=form, name=session.get('name'),known =session.ge
    t('known',False))
    

    这里就添加了两行代码:

                if app.config['ZSD_ADMIN']:
                    send_email(app.config['ZSD_ADMIN'],'新用户来了','mail/new_user',user=user)
    

    如上用户邮件发送,获得ZSD_ADMIN的环境变量,可以在环境变量里面配置,配置方式如下:

    export ZSD_ADMIN =543421410@qq.com
    

    还需要添加mail目录

    (zsdpy1) $ cd templates/
    (zsdpy1) $ mkdir mail
    (zsdpy1) $ ls
    404.html  500.html  base.html  index.html  mail
    

    添加两个文件如下:

    (zsdpy1) $ cat new_user.html 
    用户 <b>{{ user.username }}</b> 已经加入了.
    插入到MySQL数据库中
    (zsdpy1) $ cat new_user.txt 
    用户 {{ user.username }} 已经加入.
    插入至MySQL数据库中.
    

    应用演示:

    邮件发送演示:

    以上页面会停顿几秒钟,由于发送邮件和web应用是同步应用。可以把发送的邮件的改成异步发送。亦或者添加到Celery任务队列中,以后可以继续书写。

  • 相关阅读:
    IOC(inverse of Control)控制反转(依赖注入)思想
    学习Ajax技术总结
    设计差异引发WebServices 安全性问题
    XML与Webservices相关的安全问题概述
    XML与Webservices相关的安全问题概述
    设计差异引发WebServices 安全性问题
    Webservice测试方案(目录及下载链接)
    XML与Webservices相关的安全问题概述
    设计差异引发WebServices 安全性问题
    构建安全的 Web Services
  • 原文地址:https://www.cnblogs.com/zhangshengdong/p/12558068.html
Copyright © 2011-2022 走看看