代码来自<Flask Web开发 基于Python的Web应用开发实战>书上的第六章中的示例,github版本是6b,代码获取方式如下:

终端输入:

git clone https://github.com/miguelgrinberg/flasky.git

git checkout 6b

测试场景:

发送方是163邮箱

接收方是qq邮箱

为了方便运行,hello.py修改如下:

#-*- encoding:utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import os
from threading import Thread
from flask import Flask, render_template, session, redirect, url_for
from flask_bootstrap import Bootstrap
from flask_moment import Moment
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_mail import Mail, Message
from flask_script import Manager
basedir = os.path.abspath(os.path.dirname(__file__))app = Flask(__name__)
app.config['SECRET_KEY'] = 'hard to guess string'
app.config['SQLALCHEMY_DATABASE_URI'] ='sqlite:///' + os.path.join(basedir, 'data.sqlite')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['MAIL_SERVER'] = 'smtp.163.com'
app.config['MAIL_PORT'] = 25
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME')#整的意思就是从.bashrc中获取变量的具体赋值
app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD')
app.config['FLASKY_MAIL_SUBJECT_PREFIX'] = '[Flasky]'
app.config['FLASKY_MAIL_SENDER'] = os.environ.get('FLASKY_MAIL_SENDER')
app.config['FLASKY_ADMIN'] = os.environ.get('FLASKY_ADMIN')
app.config['DEBUG'] = Truebootstrap = Bootstrap(app)
moment = Moment(app)
db = SQLAlchemy(app)
migrate = Migrate(app, db)
mail = Mail(app)manager = Manager(app)
class Role(db.Model):__tablename__ = 'roles'id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(64), unique=True)users = db.relationship('User', backref='role', lazy='dynamic')def __repr__(self):return '<Role %r>' % self.nameclass User(db.Model):__tablename__ = 'users'id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(64), unique=True, index=True)role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))def __repr__(self):return '<User %r>' % self.usernamedef send_async_email(app, msg):with app.app_context():mail.send(msg)def send_email(to, subject, template, **kwargs):msg = Message(app.config['FLASKY_MAIL_SUBJECT_PREFIX'] + ' ' + subject,sender=app.config['FLASKY_MAIL_SENDER'], recipients=['XXXXXXX@qq.com'])msg.body = render_template(template + '.txt', **kwargs)msg.html = render_template(template + '.html', **kwargs)thr = Thread(target=send_async_email, args=[app, msg])thr.start()return thrclass NameForm(FlaskForm):name = StringField('What is your name?', validators=[DataRequired()])submit = SubmitField('Submit')@app.shell_context_processor
def make_shell_context():return dict(db=db, User=User, Role=Role)@app.errorhandler(404)
def page_not_found(e):return render_template('404.html'), 404@app.errorhandler(500)
def internal_server_error(e):return render_template('500.html'), 500@app.route('/', methods=['GET', 'POST'])
def index():form = NameForm()if form.validate_on_submit():user = User.query.filter_by(username=form.name.data).first()print "user=",userif user is None:user = User(username=form.name.data)db.session.add(user)db.session.commit()session['known'] = Falseprint"app.config['FLASKY_ADMIN']",app.config['FLASKY_ADMIN']if app.config['FLASKY_ADMIN']:send_email(app.config['FLASKY_ADMIN'], 'New User','mail/new_user', user=user)else:session['known'] = Truesession['name'] = form.name.datareturn redirect(url_for('index'))return render_template('index.html', form=form, name=session.get('name'),known=session.get('known', False))
def killport(port):command='''kill -9 $(netstat -nlp | grep :'''+str(port)+''' | awk '{print $7}' | awk -F"/" '{ print $1 }')'''os.system(command)
if __name__ == '__main__':killport(5000)db.create_all()manager.run()#运行配置如下:#设置.bashrc如下:# export MAIL_USERNAME=appleyuchi@163.com# export MAIL_PASSWORD=XXXXXXX# export FLASKY_MAIL_SENDER='Flasky Admin <appleyuchi@163.com>'# export FLASKY_ADMIN=appleyuchi@163.com#163邮箱开启SMTP#qq邮箱开启pop#删除sqlite3文件,否则代码逻辑走不到发送邮件那里的#app.config['MAIL_PORT']=25#app.config['MAIL_SERVER'] = 'smtp.163.com'修改此处#app.config['MAIL_USE_TLS'] = True#app.config['DEBUG'] = True# from flask_script import Manager# manager = Manager(app)

以上的注释中标注了所有需要修改,以及相对于github上面的代码而言,需要增加的部分

kilport函数是根据上次运行代码时的端口关闭进程,这样运行代码时就不用手动在终端关闭进程来释放端口了,方便调试使用。

注意必须是view plain中才能复制以上代码,因为博客显示中会把三个引号'''显示成5个引号'''''

请记得.bashrc中增加上面注释中提到的四行,然后运行方法是(注意上面的flask_script相关的不能删除,否则下面的shell上下文环境就没有了):

运行方法如下:

python hello.py shell

>>> from flask.ext.mail import Message
>>> msg = Message('test subject', sender='appleyuchi@163.com', recipients=['XXXXXXx@qq.com'])
>>> msg.body = 'text body'
>>> msg.html = '<b>HTML</b>'
>>> with app.app_context():
...     mail.send(msg)

文件结构是:

(python2.7) appleyuchi@ubuntu16:~/桌面/flask_learn/书本的git/flasky$ tree
.
├── hello.py
├── hello.pyc
├── LICENSE
├── migrations
│   ├── alembic.ini
│   ├── env.py
│   ├── README
│   ├── script.py.mako
│   └── versions
│       └── 38c4e85512a9_initial_migration.py
├── README.md
├── static
│   └── favicon.ico
├── templates
│   ├── 404.html
│   ├── 500.html
│   ├── base.html
│   ├── index.html
│   └── mail
│       ├── new_user.html
│       └── new_user.txt

└── test.txt

总结:如果使用的发送和接收邮箱类型不变的话,那么只要修改:

.bashrc中的三处163邮箱+一处qq邮箱+一处163邮箱密码+

开启发送端的SMTP+接收端邮箱的POP即可

最终实验成功的标志是在接收端的qq邮箱里面收到邮件.

flask_mail用法实例相关推荐

  1. python命令行参数解析OptionParser类用法实例

    python命令行参数解析OptionParser类用法实例 本文实例讲述了python命令行参数解析OptionParser类的用法,分享给大家供大家参考. 具体代码如下:     from opt ...

  2. php中 datalist,html5 datalist标签的用法是什么?这里有datalist标签的用法实例

    本篇文章主要为大家讲述了关于html5 datalist标签的用法及html5 datalist标签的用法实例.本文说了两个常用的选项框的实例供大家选择观看,下面就让我们一起来看这篇文章吧 我们先来看 ...

  3. python的for语句用法_python中list循环语句用法实例

    本文实例讲述了python中list循环语句用法.分享给大家供大家参考.具体用法分析如下: Python 的强大特性之一就是其对 list 的解析,它提供一种紧凑的方法,可以通过对 list 中的每个 ...

  4. CStopWatch计时器的用法实例

    CStopWatch计时器的用法实例 创建CStopWatch对象: CStopWatch m_runningtimeWatch; //定义一个计时器 定义一个装返回值的变量: double m_ru ...

  5. Go语言MD5加密用法实例

    Go语言MD5加密用法实例 本文实例讲述了Go语言MD5加密用法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: import (     "crypto/md5" ...

  6. python mysqldb cursor_python中MySQLdb模块用法实例

    转载自:http://www.jb51.net/article/57290.htm 姓名:梅金波                        学号:16010110036 [嵌牛导读]MySQLdb ...

  7. input type=range标签用法实例代码

    在HTML5中,又新增许多新<input>控件类型,比较实用的一个就是<input type="range">,以滑竿的方式来调整value值,在这以前需要 ...

  8. Union all的用法实例sql

    ---Union all的用法实例sql SELECT TOP (100) PERCENT ID, bid_user_id, UserName, amount, createtime, borrowT ...

  9. cube、rollup及exec的用法实例

    为什么80%的码农都做不了架构师?>>>    cube.rollup及exec的用法实例 select sdept 系部,sno 学号,max(sage) 最大年龄,   grou ...

最新文章

  1. ATS插件开发中内存泄露问题的解决方法探讨
  2. Ackerman 函数的解法
  3. 删除 索引 外键 mysql_MySQL无法删除外键约束中所需的索引
  4. Camel:构建基于消息的应用程序
  5. Java “\”与\\的替换
  6. WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化
  7. java常见排序算法有哪些_Java中常用的6种排序算法详细分解
  8. DB2存储过程中的ATOMIC关键字
  9. 使用printf函数输出其ascii。_输入一个N*N的矩阵,将其转置后输出。要求:不得使用任何数组(就地逆置)。...
  10. azure web应用部署_使用Visual Studio Code将Python应用程序部署到Azure Functions
  11. 微信公众平台开发(一) 配置接口
  12. n3k配置vpc是否还需要配置hsrp_HSRP
  13. linux下telnet工具下载,telnet.exe下载
  14. sony android 计算器,NeoCal 全能计算器 V2.0.2
  15. iOS开发-使用dSYM文件符号化Crash日志
  16. C64+DSP资源手册笔记
  17. 故宫,中国古代建筑艺术的奇葩
  18. 关于小米手机用微信会重启的问题
  19. 硬盘异响(嗑啦嗑啦)的可能原因
  20. FreeNOS--项目的README

热门文章

  1. Vue项目开发目录结构和引用调用关系
  2. Vue中的 ref 和 $refs
  3. 简单实现实时输入网页,参考vue底层实现
  4. MongoDB存储文件之GridFS
  5. Springboot-data-jpa
  6. 好程序员web前端分享CSS3边框
  7. Python学习笔记__5章 模块
  8. js if for 详解 获取元素方式 及一些js 基础知识
  9. TowlHub,它不是一个简单的纸巾架
  10. POJ3237 树的维护