为了避免每次都手动编写电子邮件消息,我们最好把程序发送电子邮件的通用部分抽象出来,定义成一个函数。这么做还有个好处,即该函数可以使用Jinja2 模板渲染邮件正文,灵活性极高.
其实课程里说的内容就是自动发送邮件,比如,像你平时论坛里刚注册好账号,他总会给你一个邮件认证什么的,这里的集成功能是类似的。
只是他这里的含义是:有人提交表单以后,他自动发一个邮件给管理员,而管理员的邮箱是你自己设定的
在hello.py里面,添加如下代码
from flask.ext.mail import Message
app.config['FLASKY_MAIL_SUBJECT_PREFIX'] = '[Flasky]' #这个类似于主题概要的意思,但不是主题,只是在主题前面加个修饰前缀,具体看后面截图
app.config['FLASKY_MAIL_SENDER'] = 'Flasky Admin <flasky@example.com>' #这个是发件人,而<>前面的内容,实际上就相当于昵称的作用
def send_email(to, subject, template, **kwargs): #send_email()的参数,to是发给谁,subject邮件主题,template调用哪个模板,还有其他关键字参数
msg = Message(app.config['FLASKY_MAIL_SUBJECT_PREFIX'] + subject,
sender=app.config['FLASKY_MAIL_SENDER'], recipients=[to]) #这里第一个参数就是主题内容,他由PREFIX和subject组成,然后定义发件人是谁,收件人是谁
msg.body = render_template(template + '.txt', **kwargs) #这个body我一直没搞明白是起到什么作用,在哪里显示,回头搜索了再说吧
msg.html = render_template(template + '.html', **kwargs) #这里用jinja2模板来进行调用,告诉他去找模板文件夹下的这个指定模板
mail.send(msg)
尝试把代码里面sender=app.config['FLASKY_MAIL_SENDER'] 删除掉,他会报错,需要一个sender
然后尝试把FLASKY_MAIL_SENDER这个在config里面的变量设置成和MAIL_USERNAME不一样,他也会报错,需要sender和MAIL_USERNAME一致
所以,设置的时候务必保持一致。
这里讲一下,因为定义模板的时候,不能带后缀,所以在定义render_template的第一个参数的时候,用了组合的方式
然后我们再来进行index()路由的修改
首先在之前要添加
app.config['FLASKY_ADMIN'] = os.environ.get('FLASKY_ADMIN') #这里意思是指管理员是谁,其实这个FLASKY_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)
session['known'] = False
if app.config['FLASKY_ADMIN']: #在有定义过管理员邮箱的情况下
send_email(app.config['FLASKY_ADMIN'], 'New User', #发送邮件给管理员
'mail/new_user', user=user) #这里要特别注意,mail/new_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.get('known', False))
上面标红色mail/new_user,实际上是render_template在静态文件夹下面寻找对应模板的定义路径,因为我们知道,render_template默认的路径是templates
而这里mail/new_user的意思,在templates下面子文件夹mail里面,调用名字为new_user的txt和html文件
而我们再new_user.html这个文件里面,就可以自己填写我们想要看到的信息,并且,我们可以把变量user添加到里面,这样可以看到每次注册的是哪个新用户
比如:我把语句写成 <h>New {{user}} is coming </h1>
这样,我收到的邮件就会告诉我,哪个新用户来了
当然,最后在发送之前,还是需要在环境变量里面设置3个信息
(venv) $env: FLASKY_ADMIN='你的接受邮件的邮箱'
(venv) $env: MAIL_USERNAME='你发送这个邮件所用的邮箱'
(venv) $env: MAIL_PASSWORD='邮箱密码'
我们来测试一下
通过下面的图,我们可以看到,当我填写新的用户名字Sunday的时候,点击submit,他自动发送了一封邮件到我的目标邮箱里面
而被渲染的内容则是告诉我New user xxx is coming
而在对应的数据库里面,新用户也已经被添加进去了。