系统环境: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电子邮件的更多相关文章

  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. 前端自动化构建工具gulp

    1.gulp的安装 首先确保你已经正确安装了nodejs环境.然后以全局方式安装gulp: npm install -g gulp 全局安装gulp后,还需要在每个要使用gulp的项目中都单独安装一次 ...

  2. js里的null 与undefined

    null 表示一个值被定义了,定义为'空值': undefined 表示没有定义. 转换为数字时 Number(undefined) === NaN Number(null) === 0 在es6使用 ...

  3. 详解 Filter 过滤器

    1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 ...

  4. Inheritance Learning Note

    好几天没来学习了,昨晚把继承的又整理了一下.想把整理后的东西发到hexo博客上来,却发现命令行又失效了.前几天明明是好的,这几天又没有进行任何操作,网上搜了一下也没有招到合适的解决办法,无奈只能重装了 ...

  5. windows dnsrecon

    缺了两个模块 第一个:https://pypi.python.org/pypi/netaddr 第二个:dnspython 找到下载后setup.py install就OK了,话说GFW真***了,用 ...

  6. SurfaceView和TextureView的区别

    SurfaceView和TextureView均继承于android.view.View,与其它View不同的是,两者都能在独立的线程中绘制和渲染,在专用的GPU线程中大大提高渲染的性能.Surfac ...

  7. 利用python代码操作git

    python操作git 安装模块 pip3 install gitpython 基本使用 import os from git.repo import Repo # 创建本地路径用来存放远程仓库下载的 ...

  8. Leetcode 142题 环形链表 II(Linked List Cycle II) Java语言求解

    题目描述: 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 p ...

  9. C++扬帆远航——2

    /* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:test.cpp * 作者:常轩 * 完成日期:2016年3月6 ...

  10. C++中如何对单向链表操作

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...