如果电子邮件未经确认,如何重新发送信件,FLASK?

时间:2016-08-23 02:41:48

标签: flask

我试图将电子邮件重新发送给尚未确认其帐户的任何人。

models.py

class Subscribers(Base):

    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(50))
    confirmed = db.Column(db.Boolean(), default=False)

    def confirm(self, token):
        s = Serializer(app.config['SECRET_KEY'])
        try:
            data = s.loads(token)
        except:
            return False
        if data.get('confirm') != self.id:
            return False
        self.confirmed = True
        db.session.add(self)
        return True

    def generate_confirmation_token(self, expiration=3600):
        s = Serializer(app.config['SECRET_KEY'], expiration)
        return s.dumps({'confirm': self.id})

    def get_token(self, expiration=1800):
        s = Serializer(app.config['SECRET_KEY'], expiration)
        return s.dumps({'email': self.id}).decode('utf-8')

    @staticmethod
    def verify_token(token):
        s = Serializer(app.config['SECRET_KEY'])
        try:
            data = s.loads(token)
        except:
            return None
        id = data.get('email')
        if id:
            return User.query.get(id)
        return None

这是确认过程处理的功能:

@app.route('/send-confirmation/<email>/<token>')
def confirm(token,email):
    subre = Subscribers.query.filter_by(email=email).first()
    if subre.confirmed:
        flash('Э.почта уже подтверждена.')
        return redirect(url_for('index'))
    if subre.confirm(token):
        subre.confirmed = True
        db.session.add(subre)
        db.session.commit()
        send_email(subre.email, 'Благодарим Вас за подписку на наш сайт', 'auth/subscribe/thanks', subre=subre, token=token)
        flash('Вы подтвердили свою электронную почту, спасибо!')
    else:
        flash('Ссылка для подтверждения является недействительным или истек.')
    return redirect(url_for('index'))

告诉我现在一切正常,我试图通过向他们发送另一封要求他们确认帐户的消息来获取尚未确认的每个帐户,这是功能:

@app.before_request
def resend_confirmation():
    subscribers = Subscribers.query.filter_by(confirmed=False)
    for sub in subscribers:
        email = sub.email
        token = email.generate_confirmation_token()
        send_email(email, 'Подтверждение по электронной почте было отправлено Вам по электронной почте.',
                'auth/email/resend', email=email, token=token)

这里收到错误说:

AttributeError: 'unicode' object has no attribute 'generate_confirmation_token'

我试图在模型中添加__unicode__功能,但没有用。

请任何帮助。

1 个答案:

答案 0 :(得分:1)

您正尝试在电子邮件上调用generate_confirmation_token方法,但您应该使用Subscribers实例:

@app.before_request
def resend_confirmation():
    subscribers = Subscribers.query.filter_by(confirmed=False)
    for sub in subscribers:
        token = sub.generate_confirmation_token()
        send_email(sub.email, 'Подтверждение по электронной почте было отправлено Вам по электронной почте.',
            'auth/email/resend', email=email, token=token)