特定事件发生时提请用户,常用的通信方式是电子邮件
smtplib包可在flask程序中发送电子邮件
flask-mail扩展,包装了smtplib包,更好的和flask进行集合
flask-mail提供电子邮件的支持
flask-mail连接到服务器(简单邮件传输协议),并将邮件交个这个服务器发送
进行配置
若不进行配置,flask-mail会连接localhost上的端口25,不需要验证,就可以发送电子邮件
设置smtp服务器的配置
连接都外部SMTP服务器
我使用的是网易邮箱
电子邮件的使用
1. 安装flask-mail
pip install flask-mail
2. 配置flask-mail使用网易
import os
...
app.config['MAIL_SERVER']='smtp.163.com'
app.config['MAIL_PORT']=25
app.config['MAIL_USE_TLS']=True
app.config['MAIL_USERNAME']='18856858578@163.com'
app.config['MAIL_PASSWORD']=`密码`
对于用户名和密码,在环境中定义
set MAIL_USERNAME = 18856858578@163.com
...
3. 初始化flask-mail
from flask.ext.mail import Mail
mail = Mail(app)
4. shell 中发送邮件
>>> from flask.ext.mail import Mail
>>> from hello import mail
>>> msg = Message('test subject',sender = 'you@example.com',recipients = ['you@example.com'])
>>> msg.body = 'test body
>>> msg.html = '<b>HTML</b> body
>>> with app.app_context(): #功能:激活程序上下文,获取程序的上下文
... mail.send(msg) # 在激活的程序上下文环境中执行
程序上下文使用的方法
app.app_context()
–>取当前应用程序的上下文,其中保存了,请求的信息,服务器信息,此时msg在其中等等
mail()函数使用current_app,因此要激活程序上下文中执行
5 . 程序中集成电子邮件功能
避免每次手写,jinja2模板渲染邮件文本
first
先写处电子邮件支持,发送邮件的函数
from flask.ext.mail import Message
app.config['WANG_MAIL_SUBJECT_PREFIX'] = '[WANG]'
app.config['WANG_MAIL_SENDER'] = 'you@example.com'
def send_email(to,suject,template,**kwargs):
msg = Message('app.config[WANG_MAIL_SUBJECT_PREFIX]' + subject,
sender = app.config['WANG_MAIL_SENDER'],recipients = [to] )
msg.body = render_template(template+'.txt',**kwargs )
msg.html = render_tmeplate(template+'.html',**kwargs)
mail.send(msg)
1) app.config['WANG_MAIL_SUBJECT_PREFIX'] = '[WANG]'
邮件主题前缀
app.config['WANG_MAIL_SENDER']
发信人地址
2) send_email()参数:1.收件人地址to,主题suject,模板template,渲染邮件正文的模板的参数列表**kwargs
3) 指定模板时需要分别渲染纯文本和富文本,并将关键字参数传递到render_template()中
指定模板时不适用扩展名
msg.body = render_template(template+'.txt',**kwargs )
msg.html = render_tmeplate(template+'.html',**kwargs)
second:
hello.py中集成
...
app.config['WANG_ADMIN']= os.environ.get('WANG_ADMIN')
...
@app.route('/',method = ['GOP','POST'])
def index():
from = NameForm()
if form.validate_on_sublim():
user = User.query.filter_by(username = form.name.data).first()
if user is None:
db.session.add['user']
session['known'] = False
if app.config['WANG_ADMIN']:
send_email(app.config['WANG_ADMIN'],'New User','mail/new_user',user = user)
else:
session['known'] = True
session['name'] = 'form.name.data'
form.name.data = ''
return redirect(url_for('index'))
return render_tmeplate('index.html',form =form,name = session.get('name'),known = session.get('known',False)
环境变量的使用
收件人保存在环境变量WANG_ADMIN中,程序启动过程中,环境变量加载到一个同名配置变量中
6. 创建两个模板,保存在mail/ner_user
用于渲染纯文本
用于渲染html的邮件正文
7. 异步发送邮件
from threading import Thread
#定义异步发送
def send_async_email(app,msg):
with app.app_context():
mail.send(msg)
def send_email(to,subject,template,**kwargs):
msg = Message(app.config[WANG_MAIL_SUBJECT_PREFIX]+subject,sender = app.config['WANG_MAIL_SENDER'],recipients =[to])
msg.doby = render_tmeplate(template,'.txt',**kwargs)
msg.html = render_tmeplate(template,'.html',**kwargs)
thr = threading.Thread(target = send_async_email,args = [app,msg])
thr.start()
return thr