Exemplo n.º 1
0
def reset_password():
    form = RecoverPasswordForm()

    if form.validate_on_submit():
        user = User.query.filter_by(email=form.email.data).first()

        if user:
            flash('Please see your email for instructions on '
                  'how to access your account', 'success')

            user.recover_password()

            url = url_for('frontend.change_password', email=user.email,
                activation_key=user.activation_key, _external=True)
            html = render_template('macros/_reset_password.html',
                project=current_app.config['PROJECT'], username=user.name, url=url)
            message = Message(subject='Reset your password in ' + current_app.config['PROJECT'],
                html=html, recipients=[user.email])
            mail.send(message)

            return render_template('frontend/reset_password.html', form=form)
        else:
            flash(_('Sorry, no user found for that email address'), 'error')

    return render_template('frontend/reset_password.html', form=form)
Exemplo n.º 2
0
def reset_password():
    form = RecoverPasswordForm()

    if form.validate_on_submit():
        user = User.query.filter_by(email=form.email.data).first()

        if user:
            flash(
                _('Please see your email for instructions on '
                  'how to access your account'), 'success')

            user.activation_key = str(uuid4())
            db.session.add(user)
            db.session.commit()

            body = render_template('emails/reset_password.html', user=user)
            message = Message(subject=_('Recover your password'),
                              body=body,
                              recipients=[user.email])
            mail.send(message)

            return redirect(url_for('frontend.index'))
        else:
            flash(_('Sorry, no user found for that email address'), 'error')

    return render_template('reset_password.html', form=form)
Exemplo n.º 3
0
def send_email(subject, body=None, html=None, recipients=None, throttle=None):
    """
    Send an email. Optionally throttle the amount an identical email goes out.

    If the throttle argument is set, an md5 checksum derived from the subject, body, html, and
    recipients is stored in Redis with a lock timeout. On the first email sent, the email goes out
    like normal. But when other emails with the same subject, body, html, and recipients is supposed
    to go out, and the lock hasn't expired yet, the email will be
    dropped and never sent.

    Positional arguments:
    subject -- the subject line of the email.

    Keyword arguments.
    body -- the body of the email (no HTML).
    html -- the body of the email, can be HTML (overrides body).
    recipients -- list or set (not string) of email addresses to send the email to. Defaults to the
    ADMINS list in the Flask config.
    throttle -- time in seconds or datetime.timedelta object between sending identical emails.
    """
    recipients = recipients or current_app.config['ADMINS']
    if throttle is not None:
        md5 = hashlib.md5('{}{}{}{}'.format(subject, body, html, recipients)).hexdigest()
        seconds = throttle.total_seconds() if hasattr(throttle, 'total_seconds') else throttle
        lock = redis.lock(EMAIL_THROTTLE.format(md5=md5), timeout=int(seconds))
        have_lock = lock.acquire(blocking=False)
        if not have_lock:
            LOG.debug('Suppressing email: {}'.format(subject))
            return
    msg = Message(subject=subject, recipients=recipients, body=body, html=html)
    mail.send(msg)
Exemplo n.º 4
0
def send_exception(subject):
    """
    Send Python exception tracebacks via email to the ADMINS list.
    Use the same HTML styling as Flask tracebacks in debug web servers.

    This function must be called while the exception is happening. It picks up the raised exception
    with sys.exc_info().

    Positional arguments:
    subject -- subject line of the email (to be prepended by 'Application Error: ').
    """
    # Generate and modify html.
    tb = tbtools.get_current_traceback()  # Get exception information.
    with _override_html():
        html = tb.render_full().encode('utf-8', 'replace')
    html = html.replace('<blockquote>', '<blockquote style="margin: 1em 0 0; padding: 0;">')
    subject = 'Application Error: {}'.format(subject)

    # Apply throttle.
    if current_app.config['REDIS']:
        md5 = hashlib.md5('{}{}'.format(subject, html)).hexdigest()
        seconds = int(current_app.config['MAIL_EXCEPTION_THROTTLE'])
        lock = redis.lock(EMAIL_THROTTLE.format(md5=md5), timeout=seconds)
        have_lock = lock.acquire(blocking=False)
        if not have_lock:
            LOG.debug('Suppressing email: {}'.format(subject))
            return

    # Send email.
    msg = Message(subject=subject, recipients=current_app.config['ADMINS'], html=html)
    mail.send(msg)
Exemplo n.º 5
0
def reset_password():
    form = RecoverPasswordForm()

    if form.validate_on_submit():
        user = User.query.filter_by(email=form.email.data).first()

        if user:
            flash("Please see your email for instructions on " "how to access your account", "success")

            user.activation_key = str(uuid4())
            db.session.add(user)
            db.session.commit()

            url = url_for(
                "frontend.change_password", email=user.email, activation_key=user.activation_key, _external=True
            )
            html = render_template(
                "emails/reset_password.html", project=current_app.config["PROJECT"], username=user.name, url=url
            )
            message = Message(
                subject=_("Reset your password in " + current_app.config["PROJECT"]), html=html, recipients=[user.email]
            )
            mail.send(message)

            return render_template("reset_password.html", form=form)
        else:
            flash(_("Sorry, no user found for that email address"), "error")

    return render_template("reset_password.html", form=form)
Exemplo n.º 6
0
def reset_password():
    form = RecoverPasswordForm()

    if form.validate_on_submit():
        user = User.query.filter_by(email=form.email.data).first()

        if user:
            flash(_('Please see your email for instructions on '
                  'how to access your account'), 'success')

            user.activation_key = str(uuid4())
            db.session.add(user)
            db.session.commit()

            body = render_template('emails/reset_password.html', user=user)
            message = Message(subject=_('Recover your password'), body=body,
                              recipients=[user.email])
            mail.send(message)

            return redirect(url_for('frontend.index'))
        else:
            flash(_('Sorry, no user found for that email address'), 'error')

    return render_template('reset_password.html', form=form)