使用 Django-Verify-Email

问题描述

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

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

如果用户验证了它的电子邮件,那就没问题。当电子邮件链接过期并且用户需要通过重新发送电子邮件来验证电子邮件时,就会出现问题。

这个包包含一个函数resend_verification_email(request,encoded_email,encoded_token)

函数的描述说要传递之前生成encoded_emailencoded_token

我不认为我们的系统是否在 DB 中保存了已编码的令牌和已编码的电子邮件。谁能帮我解决这个问题?

解决方法

好吧,我想这是我在 Stack Overflow 上的第一个答案。

找到这篇文章后,我继续尝试寻找解决方案,并在此处找到: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):,但这根本不需要创建一个表单,用户可以在其中收到第二封电子邮件。希望这对任何人都有帮助。