【简说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任务队列中,以后可以继续书写。
【简说Python WEB】flask-mail电子邮件的更多相关文章
- 【简说Python WEB】flask-mail电子邮件异步Asynchronous
系统环境:Ubuntu 18.04.1 LTS Python使用的是虚拟环境:virutalenv Python的版本:Python 3.6.9 flask-mail电子邮件异步Asynchronou ...
- 【简说Python WEB】Flask应用的文件结构
目录 [简说Python WEB]Flask应用的文件结构 1.文件结构的目录 2.配置程序--config.py 3.app应用包 4.剥离出来的email.py 5.蓝本(BLueprint)的应 ...
- 【简说Python WEB】数据库
目录 [简说Python WEB]数据库 数据库表 docker安装MySQL Flask-SQLAlchemy操纵MySQL数据库 初始化 定义模型 定义关系 数据库的CRUD操作 创建表 inse ...
- 【简说Python WEB】Flask-Moment
目录 [简说Python WEB]Flask-Moment 系统环境:Ubuntu 18.04.1 LTS Python使用的是虚拟环境:virutalenv Python的版本:Python 3.6 ...
- 【简说Python WEB】视图函数操作数据库
目录 [简说Python WEB]视图函数操作数据库 系统环境:Ubuntu 18.04.1 LTS Python使用的是虚拟环境:virutalenv Python的版本:Python 3.6.9 ...
- 【简说Python WEB】Web应用部署
目录 [简说Python WEB]Web应用部署 应用层 缓存层 数据层 Gunicorn 的应用 1.安装Gunicorn 2.Gunicorn的启动 Nginx 的应用 1.docker方式部署安 ...
- 【简说Python WEB】pyechart在flask中的应用
个人笔记总结,可读性不高.只为自己总结用.怕日后忘记. 这里用到了tushare,pandas等python组件. pyechart的案例 c = ( Bar() .add_xaxis([" ...
- python web -- flask
Flask是一个简洁的 Python_web 框架. 零. virtualenv 虚拟环境配置. $ easy_install pip $ pip install virtualenv $ virtu ...
- Python Web Flask源码解读(一)——启动流程
关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...
随机推荐
- IPFS问题总结
1.安装包下载 ipfs安装版本下载:https://github.com/ipfs/go-ipfs/releases,这是IPFS的go语言实现版,目前实现的还有js版本. 2.安装与启动 linu ...
- java集合 list与Set、Map区别
1.List,Set都是继承自Collection接口,Map则不是. 2.List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉 ,(注意:元素虽 ...
- JDBC连接到数据库查询打印数据
通过一天的视频学习,认识了jdbc的连接原理前来小结: 游标读取数据库表的行一次读取一个,getXxx()方法读取表的列一个数据 next()方法可以让游标下移 可以把数据库的表看做是一个类,每条记录 ...
- 修改 MyEclipse 编辑区域背景颜色
- 支持向量机 SVM - Wenjing
概念 将向量映射到一个更高维的空间里,在这个空间里建立有一个最大间隔超平面.在分开数据的超平面的两边建有两个互相平行的超平面,分隔超平面使两个平行超平面的距离最大化.假定平行超平面间的距离或差距越大, ...
- 11. 无数人难办事? - 迪米特法则(LoD)
11.1 第一天上班 时间: 4月2日19点 地点: 小菜大鸟住所的客厅 任务: 小菜, 大鸟 "回来啦! 怎么样? 第一天上班感受多吧." 大鸟关关心的问道. ...
- 【转载】(String)、toString、String.valueOf的区别
用于个人参考,查看请前往原地址http://blog.csdn.net/springk/article/details/6414017 问题讨论http://bbs.csdn.net/topics/2 ...
- [红日安全]Web安全Day5 - 任意文件上传实战攻防
本文由红日安全成员: MisakiKata 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目 ...
- 统计 Django 项目的测试覆盖率
作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 我们完成了对 blog 应用和 comment 应用这两个核心 app 的测试.现在 ...
- BLAKE及BLAKE2算法详解
1 简介 哈希算法 (Hash Algorithm) 是将任意长度的数据映射为固定长度数据的算法,也称为消息摘要.一般情况下,哈希算法有两个特点: 原始数据的细微变化(比如一个位翻转)会导致结果产生巨 ...