简说Python WEBflask-mail电子邮件

Posted 东瑜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简说Python WEBflask-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任务队列中,以后可以继续书写。

以上是关于简说Python WEBflask-mail电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

python简说操作文件

python简说(二十九)线程,进程

python简说(二十三)发邮件

python简说(二十四)发送网络请求

python简说(二十七)sys.argv

python简说(十六)第三方模块安装