微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django Rest Framework - 帐户验证电子邮件:send_mail() 在控制台中工作但不使用 SMTP

如何解决Django Rest Framework - 帐户验证电子邮件:send_mail() 在控制台中工作但不使用 SMTP

我环顾了 StackOverflow 和其他地方,但找不到解决我的问题的方法。我正在使用 Django Rest Framework 和 Django Knox 进行用户身份验证,我想向新注册用户发送帐户验证电子邮件。我正在使用 Gmail。

我的 settings.py 文件中的电子邮件设置如下:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
# EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' #Using this for testing
EMAIL_USE_TLS = True
EMAIL_HOST = os.getenv('EMAIL_HOST')
EMAIL_PORT = os.getenv('EMAIL_HOST_PORT')
EMAIL_HOST_USER = os.getenv('EMAIL_HOST_USER')
EMAIL_HOST_PASSWORD = os.getenv('EMAIL_HOST_PASSWORD')
DEFAULT_FROM_EMAIL = os.getenv('EMAIL_HOST_USER')

当我使用 EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' 时,我能够看到服务器上打印的电子邮件。但是,当我使用 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' 时,并不是每次都收到电子邮件我必须尝试多次发送电子邮件才能收到 1 封电子邮件因为我收到了几次电子邮件,所以我认为我的凭据是正确的。我也没有看到服务器上打印任何错误。考虑到我有时会收到电子邮件,这是 Gmail 问题吗?

我在处理此问题时注意到的另一件事是,之后 send_mail 的任何代码都不会在我的 API 视图中执行。我使用的是自定义用户模型,下面是我的注册 API 视图。

class RegisteraPI(generics.GenericAPIView):
    serializer_class = RegisterSerializer

    def post(self,request,*args,**kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        employee = serializer.save()

        uidb64=urlsafe_base64_encode(smart_bytes(employee.id))
        token=default_token_generator.make_token(user=employee)
        email_body='Click on the link below to activate your account\nhttp://127.0.0.1:8000/'+uidb64+'/'+token

        send_mail('Activate your EmployeeDev Account',email_body,settings.EMAIL_HOST_USER,[employee.email],fail_silently=False)

        return Response({
            "employee": EmployeeSerializer(employee,context=self.get_serializer_context()).data,"token": AuthToken.objects.create(employee)[1]
        })

如果我在我的注册 API 中注释掉 send_mail 行,我就可以注册一个新用户。我还收到了带有员工信息和令牌的 200 响应。使用 send_mail 行,我没有得到任何响应,并且在 send_mail 之后似乎没有执行任何代码(在本例中为 return Response 语句)。我还尝试为 send_mail 创建一个单独的函数,但没有任何区别。

一旦调用 send_mail,服务器就会打印“db.sqlite3 changed,reloading”而不返回 Response

我的注册序列化程序如下。

class RegisterSerializer(serializers.ModelSerializer):
    class Meta:
        model = Employee
        fields = ('id','email','password','employee_number','first_name','last_name','department_name')
        extra_kwargs = {'password': {'write_only': True}}

    def create(self,validated_data):
        employee = Employee.objects.create_user(
            validated_data['email'],validated_data['password'],validated_data['first_name'],validated_data['last_name'],validated_data['employee_number'],validated_data['department_name']
        )
        return employee

编辑 我向我的 post 函数添加'before''after' 打印语句,如下所示。

class RegisteraPI(generics.GenericAPIView):
    serializer_class = RegisterSerializer

    def post(self,**kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        employee = serializer.save()

        employee_data=serializer.data
        uidb64=urlsafe_base64_encode(smart_bytes(employee_data['id']))
        token=default_token_generator.make_token(user=employee)
        email_subject="Activate your EmployeeDev Account"
        email_body='http://127.0.0.1:8080/?uidb='+uidb64+'&token='+token

        print('\n\nbefore\n\n')
        send_mail(email_subject,[employee_data['email'],])
        print('\n\nafter\n\n')
            
        return Response({
            "employee": EmployeeSerializer(employee,"token": AuthToken.objects.create(employee)[1]
        })

当我使用 "django.core.mail.backends.smtp.EmailBackend" 时,服务器显示以下内容

Django SMTP Email Server log

它在 send_mail() 之后不执行任何代码。我也没有得到返回响应。我有时会收到电子邮件,但不是每次都收到。

Django SMTP Email - Postman no response

但是如果我使用 'django.core.mail.backends.console.EmailBackend'。我得到以下内容

enter image description here

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。