使用Python3通过Flask-Mail模块实现异步邮件发送及验证激活

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:54   943   0

邮箱基础知识

Flask-Mail官方文档

如何判断用户输入的邮箱格式是否正确?

通过正则表达式判断邮箱格式是否正确,转义字符,用户名@服务器域名,用户名只能以数字或字母开头和结尾。

regexp = '^[a-zA-Z0-9][a-zA-Z0-9_-]*[a-zA-Z0-9]@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]{2,4}){1,}$'
pat = re.compile(regexp)
isok = pat.match(reg_mail)

Python里正则表达式需转换为模式对象,使用re模块的compile()方法。


邮件发送实现

使用Flask-Mail发送邮件

Python学习之Flask-Mail异步邮件发送

主要有邮箱的配置(包括服务器、端口、使用的TLS或SSL加密、用户名、授权码等),异步函数里的app.app_context()获取当前应用的上下文,邮件发送函数send()的实现,多线程的使用。

# 异步发送邮件
def send_async_email(app, msg):
    with app.app_context():
        mail.send(msg)


# 视图函数名称不能设置为mail,否则会报错
def send_mail(to, subject, template, **kwargs):
    # 创建信息实例,recipients是个列表,包含所有收件人,Hello是邮箱的主题
    msg = Message(subject, recipients=[to])

    # 邮件发送给目标,可以有文本,两种方式呈现,你能看见怎样的取决于你的客户端
    # 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 thr

验证激活实现

使用Flask实现邮箱验证激活和用户管理功能

flask注册之后邮箱确认功能的实现

1、添加用户类的相关字;

2、用户类里添加生成账户激活的token(标识)和验证账户激活的token两个方法;

    def generate_activate_token(self, expiration=3600):
        # 这个函数需要两个参数,一个密匙,从配置文件获取,一个时间,这里1小时
        s = Serializer(current_app.config['SECRET_KEY'], expiration)
        # 为ID生成一个加密签名,然后再对数据和签名进行序列化,生成令牌版字符串(就是一长串乱七八糟的东西),然后返回
        return s.dumps({'id': self.id})

    # 账户激活(静态方法),所有用户共用此方法?
    @staticmethod
    def check_activate_token(token):
        # 传入和刚才一样的密匙,解码要用
        s = Serializer(current_app.config['SECRET_KEY'])
        try:
            data = s.loads(token)   # 解码
        except:
            return False
        u = User.query.get(data['id'])
        if not u:
            # 用户已被删除
            return False
        if not u.status:
            u.status = True
            db.session.add(u)
            db.session.commit()
        return True

3、视图模块里注册函数调用token生成函数以及发送邮件;

4、视图模块里调用token验证函数实现激活判断函数,通过装饰器链接url并由email.html文件调用。

@app.route('/activate/<token>/')
def activate(token):
    if User.check_activate_token(token):
        flash('激活成功')
        return redirect('/regloginpage/')
    else:
        flash('激活失败')
        return redirect('/')
 <p>请点击右边的激活按钮激活你的账号:<a href="{{ url_for('activate', token=token, _external=True) }}">激活</a></p>

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP