Flask Web 开发集成邮件功能

    xiaoxiao2025-04-01  16

    在程序中集成发送电子邮件功能

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

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

    转载请注明原文地址: https://ju.6miu.com/read-1297607.html
    最新回复(0)