flask_mail用法实例
代码来自<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用法实例相关推荐
- python命令行参数解析OptionParser类用法实例
python命令行参数解析OptionParser类用法实例 本文实例讲述了python命令行参数解析OptionParser类的用法,分享给大家供大家参考. 具体代码如下: from opt ...
- php中 datalist,html5 datalist标签的用法是什么?这里有datalist标签的用法实例
本篇文章主要为大家讲述了关于html5 datalist标签的用法及html5 datalist标签的用法实例.本文说了两个常用的选项框的实例供大家选择观看,下面就让我们一起来看这篇文章吧 我们先来看 ...
- python的for语句用法_python中list循环语句用法实例
本文实例讲述了python中list循环语句用法.分享给大家供大家参考.具体用法分析如下: Python 的强大特性之一就是其对 list 的解析,它提供一种紧凑的方法,可以通过对 list 中的每个 ...
- CStopWatch计时器的用法实例
CStopWatch计时器的用法实例 创建CStopWatch对象: CStopWatch m_runningtimeWatch; //定义一个计时器 定义一个装返回值的变量: double m_ru ...
- Go语言MD5加密用法实例
Go语言MD5加密用法实例 本文实例讲述了Go语言MD5加密用法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: import ( "crypto/md5" ...
- python mysqldb cursor_python中MySQLdb模块用法实例
转载自:http://www.jb51.net/article/57290.htm 姓名:梅金波 学号:16010110036 [嵌牛导读]MySQLdb ...
- input type=range标签用法实例代码
在HTML5中,又新增许多新<input>控件类型,比较实用的一个就是<input type="range">,以滑竿的方式来调整value值,在这以前需要 ...
- Union all的用法实例sql
---Union all的用法实例sql SELECT TOP (100) PERCENT ID, bid_user_id, UserName, amount, createtime, borrowT ...
- cube、rollup及exec的用法实例
为什么80%的码农都做不了架构师?>>> cube.rollup及exec的用法实例 select sdept 系部,sno 学号,max(sage) 最大年龄, grou ...
最新文章
- ATS插件开发中内存泄露问题的解决方法探讨
- Ackerman 函数的解法
- 删除 索引 外键 mysql_MySQL无法删除外键约束中所需的索引
- Camel:构建基于消息的应用程序
- Java “\”与\\的替换
- WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化
- java常见排序算法有哪些_Java中常用的6种排序算法详细分解
- DB2存储过程中的ATOMIC关键字
- 使用printf函数输出其ascii。_输入一个N*N的矩阵,将其转置后输出。要求:不得使用任何数组(就地逆置)。...
- azure web应用部署_使用Visual Studio Code将Python应用程序部署到Azure Functions
- 微信公众平台开发(一) 配置接口
- n3k配置vpc是否还需要配置hsrp_HSRP
- linux下telnet工具下载,telnet.exe下载
- sony android 计算器,NeoCal 全能计算器 V2.0.2
- iOS开发-使用dSYM文件符号化Crash日志
- C64+DSP资源手册笔记
- 故宫,中国古代建筑艺术的奇葩
- 关于小米手机用微信会重启的问题
- 硬盘异响(嗑啦嗑啦)的可能原因
- FreeNOS--项目的README