使用DjangoVerifyEmail在Django中重新发送验证电子邮件

2024-05-15 10:46:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Django Verify Email 1.0.6来验证我的电子邮件地址

我使用此功能验证了我的电子邮件: send_verification_email(request, form)

如果用户验证其电子邮件,则可以。当电子邮件链接过期并且用户需要通过重新发送电子邮件来验证电子邮件时,就会出现问题

此包包含函数resend_verification_email(request, encoded_email, encoded_token)

函数的描述表示传递先前生成的编码的\u电子邮件编码的\u令牌

我不认为我们的系统是否有编码的令牌和编码的电子邮件保存在数据库中。有人能帮我解决这个问题吗


Tags: django函数用户功能formsend编码电子邮件
1条回答
网友
1楼 · 发布于 2024-05-15 10:46:04

我想这是我第一次回答堆栈溢出的问题

找到这篇文章后,我继续努力寻找解决方案,并在这里找到:https://github.com/foo290/Django-Verify-Email/issues/6#issuecomment-782689288

虽然这篇文章确实很有启发性,但简单地复制粘贴代码是行不通的。下面是我所做的详细说明

首先,您需要扩展该类:

from django.template.loader import render_to_string
from django.core.mail import send_mail
from django.core.mail import BadHeaderError
from smtplib import SMTPException
from django.utils.html import strip_tags


class VerifyEmail(_VerifyEmail):
    def send_verification_link(self, request, user):
        try:
            useremail = user.email
            verification_url = self.token_manager.generate_link(request, user, useremail)

            subject = self.settings.get("subject")
            msg = render_to_string(
                self.settings.get("html_message_template", raise_exception=True),
                {"link": verification_url},
            )

            try:
                send_mail(
                    subject,
                    strip_tags(msg),
                    from_email=self.settings.get("from_alias"),
                    recipient_list=[useremail],
                    html_message=msg,
                )
                return user
            except (BadHeaderError, SMTPException):
                # user.delete()
                return False

        except Exception as error:
            # user.delete()
            if self.settings.get("debug_settings"):
                raise Exception(error)

如您所见,该方法需要一个请求对象。这实际上很重要,因为它用于生成链接。最快的方法就是创建一个视图。下面的示例或多或少是我需要的页面-我必须找到一种方法来验证和激活所有尚未激活的用户(在此之前我们根本没有激活他们),因此脚本所做的是遍历所有标记为非活动的用户对象并发送验证电子邮件:

from django.views import View
from VerifyEmail import VerifyEmail
from django.http import HttpResponse, HttpResponseForbidden

class VerifyInactiveUsersSender(View):

    def get(self, request):
        if(request.user.is_staff or request.user.is_superuser):
            inactive_users = User.objects.filter(is_active=False)
            for u in inactive_users:
                inactive_user = VerifyEmail().send_verification_link(request, u)

            return HttpResponse("Go check")
        else:
            return HttpResponseForbidden()

鉴于此代码向所有非活动帐户发送电子邮件,我需要添加安全检查,if(request.user.is_staff or request.user.is_superuser):,但创建一个用户可以获得第二封电子邮件的表单根本不需要这样做。希望这对任何人都有帮助

相关问题 更多 >