Flask Web 开发 集成邮件功能

49 篇文章 2 订阅
41 篇文章 3 订阅
本文介绍了如何在Flask应用中实现邮件功能,包括定义send_email函数,使用Jinja2模板渲染邮件正文,配置邮件发送者、接收者等。通过示例展示了在用户注册后自动发送邮件给管理员的过程,强调了sender与MAIL_USERNAME的一致性,并解释了render_template中模板路径的含义。最后,提供了环境变量设置和测试邮件发送的步骤。
摘要由CSDN通过智能技术生成
在程序中集成发送电子邮件功能

为了避免每次都手动编写电子邮件消息,我们最好把程序发送电子邮件的通用部分抽象出来,定义成一个函数。这么做还有个好处,即该函数可以使用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)



2016.10.1后续更新,在做到后面部分的时候,发现了一个问题,我在环境变量里面设置了MAIL_USERNAME了,那这里为何还要设置一个FLASKY_MAIL_SENDER???

尝试把代码里面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

而在对应的数据库里面,新用户也已经被添加进去了。










评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值