2016-07-20 9 views
1

そのアドレスを購読解除する電子メールを受け取ったときにユーザーがクリックできる、購読解除リンクを生成したい。ユーザーがリンクを編集して他のユーザーを退会させる可能性があるため、電子メールをリンクに含めるだけではありません。私が見るほとんどの電子メールは何らかの種類のトークンを生成し、そのサイトはトークンをユーザーに合わせる方法を知っています。どのようにしてFlaskでそのようなトークンを生成できますか?Flaskで送信された電子メールの保護されていない購読リンクを作成する

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

答えて

3

フラスコを安全にシリアル化されたデータに署名することによってトークンを生成するために使用されるライブラリ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 
    ... 

トークンは署名されているため、データを見ることはできますが、トークンを無効にしないと変更することはできません。

+0

コード内のuser.emailのタイプは何ですか?私はuser.emailを電子メール文字列に変更しましたが、このような型エラーが発生しました。 "TypeError: 'str'と 'NoneType'オブジェクトを連結できません" –

+0

@leaving_tracesエラーを再現できません。私はs.dumpsに文字列を渡し、うまくいきました。 – davidism

+0

私の場合、def send_email()は電子メールの送信を含む別のファイルにあります。これは問題だろうか? –

関連する問題