您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页【简说PythonWEB】flask-mail电子邮件

【简说PythonWEB】flask-mail电子邮件

来源:意榕旅游网
【简说PythonWEB】flask-mail电⼦邮件

⽬录

系统环境:Ubuntu 18.04.1 LTS

Python使⽤的是虚拟环境:virutalenvPython的版本:Python 3.6.9

flask-mail1.安装flask-mail

pip install flask-mail

2.配置flask-mail使⽤qq邮箱flask-mail STMP服务器的配置

配置

MAIL_SERVERMAIL_PORTMAIL_USE_TLSMAIL_USE_SSL

默认值25FalseFalse

电⼦邮件服务器的端⼝

是否启⽤传输层(TLS,transport layer security)安全协议是否启⽤安全套接字层(SSL,secure sockets Layer)安全协议邮件的⽤户名邮件的密码

说明

localhostsmtp电⼦邮件服务器的主机名或IP地址

MAIL_USERNAMENoneMAIL_PASSWORDNone

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=export MAIL_PASSWORD=

flask shell发送邮件(zsdpy1) zsd@zsd-virtual-machine:~/Zflask/app$ flask shellPython 3.6.9 (default, Nov 7 2019, 10:44:02) [GCC 8.3.0] on linuxApp: app [production]

Instance: /home/zsd/Zflask/app/instance>>> from flask_mail import Message>>> from hello import mail>>> from app import mail

>>> msg = Message('测试邮件',sender='3421410@qq.com',recipients=['3421410@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博客 管理员 <3421410@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.get('known',False))

这⾥就添加了两⾏代码:

if app.config['ZSD_ADMIN']:

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

如上⽤户邮件发送,获得ZSD_ADMIN的环境变量,可以在环境变量⾥⾯配置,配置⽅式如下:

export ZSD_ADMIN =3421410@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

⽤户 {{ user.username }} 已经加⼊了.插⼊到MySQL数据库中

(zsdpy1) $ cat new_user.txt

⽤户 {{ user.username }} 已经加⼊.插⼊⾄MySQL数据库中.

应⽤演⽰:

邮件发送演⽰:

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

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrf.cn 版权所有 赣ICP备2024042794号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务