为使用Flask发送的电子邮件创建安全的取消订阅链接

时间:2016-07-20 16:19:41

标签: python email flask

我想生成取消订阅链接,用户在收到取消订阅该地址的电子邮件时可以点击该链接。我不想在链接中包含电子邮件,因为用户可以编辑链接以取消订阅其他人。我看到的大多数电子邮件会生成某种令牌,网站知道如何将令牌与用户匹配。如何使用Flask生成这样的令牌?

for email in email_lst:
      body = 'unsubscribe link with token'
      msg.attach(MIMEText(body, 'html'))
      more code to send email

1 个答案:

答案 0 :(得分:3)

Flask包含库itsdangerous,用于通过安全地对序列化数据进行签名来生成令牌。

对于每封电子邮件,请生成包含要取消订阅的电子邮件的令牌,并创建一个unsubscribe路由,接受并解码该令牌以确定取消订阅的人。

from itsdangerous import URLSafeSerializer, BadData

@app.route('/unsubscribe/<token>')
def unsubscribe(token):
    s = URLSafeSerializer(app.secret_key, salt='unsubscribe')

    try:
        email = s.loads(token)
    except BadData:
        # show an error
        ...

    # unsubscribe
    ...

def send_email():
    s = URLSafeSerializer(app.secret_key, salt='unsubscribe')
    token = s.dumps(user.email)
    url = url_for('unsubscribe', token=token)

    # add the url to your message
    ...

由于令牌已签名,因此用户可以查看数据,但无法在不使令牌失效的情况下更改数据。