系统环境:Ubuntu 18.04.1 LTS

Python使用的是虚拟环境:virutalenv

Python的版本:Python 3.6.9

flask-mail

1.安装flask-mail

  1. 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代码添加如下 :

  1. import os
  2. app.config['MAIL_SERVER'] = 'smtp.qq.com'
  3. app.config['MAIL_PORT'] = 587
  4. app.config['MAIL_USE_TLS'] = True
  5. app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME')
  6. app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD')

3.初始化flask-mail

  1. from flask_mail import Mail, Message
  2. mail = Mail(app)

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

如下;

  1. export MAIL_USERNAME=<qqmail username>
  2. export MAIL_PASSWORD=<qqmail password>

flask shell发送邮件

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

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

发送的效果如下:

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

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

app.py再次修改如下:

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

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

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

  1. #...
  2. app.config['ZSD_ADMIN'] = os.environ.get('ZSD_ADMIN')
  3. #...
  4. @app.route('/', methods=['GET', 'POST'])
  5. def index():
  6. form = NameForm()
  7. if form.validate_on_submit():
  8. user = User.query.filter_by(username=form.name.data).first()
  9. if user is None:
  10. user = User(username=form.name.data)
  11. db.session.add(user)
  12. db.session.commit()
  13. session['known'] = False
  14. if app.config['ZSD_ADMIN']:
  15. send_email(app.config['ZSD_ADMIN'],'新用户来了','mail/new_user',user=user)
  16. else :
  17. session['known'] = True
  18. session['name'] = form.name.data
  19. form.name.data = ''
  20. return redirect(url_for('index'))
  21. return render_template('index.html', form=form, name=session.get('name'),known =session.ge
  22. t('known',False))

这里就添加了两行代码:

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

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

  1. export ZSD_ADMIN =543421410@qq.com

还需要添加mail目录

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

添加两个文件如下:

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

应用演示:

邮件发送演示:

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

【简说Python WEB】flask-mail电子邮件的更多相关文章

  1. 【简说Python WEB】flask-mail电子邮件异步Asynchronous

    系统环境:Ubuntu 18.04.1 LTS Python使用的是虚拟环境:virutalenv Python的版本:Python 3.6.9 flask-mail电子邮件异步Asynchronou ...

  2. 【简说Python WEB】Flask应用的文件结构

    目录 [简说Python WEB]Flask应用的文件结构 1.文件结构的目录 2.配置程序--config.py 3.app应用包 4.剥离出来的email.py 5.蓝本(BLueprint)的应 ...

  3. 【简说Python WEB】数据库

    目录 [简说Python WEB]数据库 数据库表 docker安装MySQL Flask-SQLAlchemy操纵MySQL数据库 初始化 定义模型 定义关系 数据库的CRUD操作 创建表 inse ...

  4. 【简说Python WEB】Flask-Moment

    目录 [简说Python WEB]Flask-Moment 系统环境:Ubuntu 18.04.1 LTS Python使用的是虚拟环境:virutalenv Python的版本:Python 3.6 ...

  5. 【简说Python WEB】视图函数操作数据库

    目录 [简说Python WEB]视图函数操作数据库 系统环境:Ubuntu 18.04.1 LTS Python使用的是虚拟环境:virutalenv Python的版本:Python 3.6.9 ...

  6. 【简说Python WEB】Web应用部署

    目录 [简说Python WEB]Web应用部署 应用层 缓存层 数据层 Gunicorn 的应用 1.安装Gunicorn 2.Gunicorn的启动 Nginx 的应用 1.docker方式部署安 ...

  7. 【简说Python WEB】pyechart在flask中的应用

    个人笔记总结,可读性不高.只为自己总结用.怕日后忘记. 这里用到了tushare,pandas等python组件. pyechart的案例 c = ( Bar() .add_xaxis([" ...

  8. python web -- flask

    Flask是一个简洁的 Python_web 框架. 零. virtualenv 虚拟环境配置. $ easy_install pip $ pip install virtualenv $ virtu ...

  9. Python Web Flask源码解读(一)——启动流程

    关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...

随机推荐

  1. 通过银行卡的Bin号来获取银行名称

    /** * 通过银行的Bin号 来获取 银行名称 * @author 一介草民 * */ public class BankUtil { public static void main(String[ ...

  2. 将本地的一个项目托管到自己的GitHub仓库

    GitHub作为全球最大的代码托管平台,功能十分强大.我们可以在上面建立一个仓库来托管我们的代码图片等资源.因为使用markdown语法来写博客所以在插入图片时需要一个图片外链地址,起初去网上找了一个 ...

  3. js javascript 获取url,获得当前页面的url,静态html文件js读取url参数

    获得当前页面的url window.location.href 静态html文件js读取url参数 location.search; //获取url中"?"符后的字串 下边为转载的 ...

  4. 周鸿祎身价超过刘强东,A股上市的360能让周鸿祎成为中国首富吗?

    不得不说,互联网大佬们的财富波动实在是太大了.股价的上涨或下跌,分分钟就是几亿.几十亿的差别--普通人十辈子都挣不到的钱! 在1月3日,持股比例为23.41%的周鸿手中的股票已经价值880.9亿元,超 ...

  5. 算法小练#1 - Dany Yang

    开始记录每周做过的算法题,这是第一周,新的开始 1021. 删除最外层的括号 题目要求如下: 有效括号字符串为空 ("")."(" + A + ")& ...

  6. 直播内容大面积偏轨:都是high点的错?

    当下的直播行业看似火爆,却是外强中干.直播平台数量的暴增.主播人数的飙升.直播内容同质化严重等问题,都在成为新的行业症结.而面对复杂的情况,不仅刚入行的小主播,就连爆红的大主播都感到寒冬的难熬.为了能 ...

  7. Grafana+Prometheus监控mysql性能

    #cmd /usr/local 今天讲一下如何监控服务器中的mysql数据库的性能 一.数据库操作 1.mysql启动 #service mysqld start #启动数据库 #service my ...

  8. TCP/IP协议族的四个层次

    OSI7层模型的小结 : 在7层模型中,每一层都提供一个特殊的网络功能.从网络功能的角度看:下面4层(物理层.数据链路层.网络层和传输层)主要提供数据传输和交换功能,即以节点到节点之间的通信为主:第4 ...

  9. nodejs通过响应回写的方式渲染页面资源

    我们一般通过node框架提供的api操作页面渲染,如何利用原始回写的方式来实现同样的功能呢下面是通过node 提供的异步地读取一个文件的全部内容api readFile进行操作,代码如下: html ...

  10. python框架Django实战商城项目之工程搭建

    项目说明 该电商项目类似于京东商城,主要模块有验证.用户.第三方登录.首页广告.商品.购物车.订单.支付以及后台管理系统. 项目开发模式采用前后端不分离的模式,为了提高搜索引擎排名,页面整体刷新采用j ...