【问题标题】:Resend verification email in Django using Django-Verify-Email使用 Django-Verify-Email 在 Django 中重新发送验证电子邮件
【发布时间】:2021-07-10 23:24:22
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: python django email-verification


    【解决方案1】:

    好吧,我想这是我在 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): 的所有非活动帐户发送一封电子邮件,但这对于简单地创建一个用户可以获得第二封电子邮件的表单来说根本不需要。希望这对任何人都有帮助。

    【讨论】:

      猜你喜欢
      • 2021-05-24
      • 1970-01-01
      • 2015-10-22
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 2017-09-09
      • 1970-01-01
      • 2013-03-07
      相关资源
      最近更新 更多