如何解决Django Rest Framework - 帐户验证电子邮件:send_mail() 在控制台中工作但不使用 SMTP
我环顾了 StackOverflow 和其他地方,但找不到解决我的问题的方法。我正在使用 Django Rest Framework 和 Django Knox 进行用户身份验证,我想向新注册的用户发送帐户验证电子邮件。我正在使用 Gmail。
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"
时,服务器显示以下内容:
它在 send_mail()
之后不执行任何代码。我也没有得到返回响应。我有时会收到电子邮件,但不是每次都收到。
但是如果我使用 'django.core.mail.backends.console.EmailBackend'
。我得到以下内容。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。