Smtplib.SMTPConnectError: (421, b'Service not available') событие после двухэтапной проверки и использования сгенерированного пароля приложения в качестве HOST_USER_PASSWORD
Я пытаюсь включить подтверждение электронной почты при регистрации пользователя в свой проект. Предполагается, что пользователь должен получить ссылку подтверждения в своем электронном письме до успешной регистрации. Для этого я использовал django.core.mail.backends.smtp.EmailBackend в качестве почтового бэкенда, но получил ошибку ниже:
Внутренняя ошибка сервера: /account/register/
Traceback (последний последний вызов):
File "C:\Users\lenovo.virtualenvs\ecommerce4-MU6fbcf2\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
.
response = get_response(request)
Файл "C:\Users\lenovo.virtualenvs\ecommerce4-MU6fbcf2\lib\site-packages\django\core\handlers\base.py", строка 197, in get_response response = wrapped_callback(request, *callback_args, **callback_kwargs)
Файл "C:\Users\lenovo\Desktop\ecommerce4\account\views.py", строка 88, in account_register
user.email_user(subject=subject, message=message)
Файл "C:\Users\lenovo\Desktop\ecommerce4\account\models.py", строка 59, in email_user
send_mail(
File "C:\Users\lenovo.virtualenvs\ecommerce4-MU6fbcf2\lib\site-packages\django\core\mail_init.py", line 87, in send_mail
return mail.send()
Файл "C:\Users\lenovo.virtualenvs\ecommerce4-MU6fbcf2\lib\site-packages\django\core\mail\message.py", строка 298, in send
return self.get_connection(fail_silently).send_messages([self])
File "C:\Users\lenovo.virtualenvs\ecommerce4-MU6fbcf2\lib\site-packages\django\core\mail\backends\smtp.py", line 124, in send_messages
new_conn_created = self.open()
Файл "C:\Users\lenovo.virtualenvs\ecommerce4-MU6fbcf2\lib\site-packages\django\core\mail\backends\smtp.py", строка 80, in open
self.connection = self.connection_class(
File "C:\Users\lenovo\AppData\Local\Programs\Python\Python310\lib\smtplib.py", line 258, in init
raise SMTPConnectError(code, msg)
smtplib.SMTPConnectError: (421, b'Service not available')
Я разрешил двухэтапную аутентификацию для своей учетной записи gmail, а затем создал пароль приложения. Я использовал пароль приложения, созданный для моего аккаунта, в качестве HOST_USER_PASSWORD. Ниже представлен код, как я настроил setings.py
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST='smtp.gmail.com'
EMAIL_HOST_USER='my gmail'
EMAIL_HOST_PASSWORD='the generated app password'
EMAIL_PORT=587
EMAIL_USE_TLS=True
Ниже приведен model.py для пользователя
import uuid
from django.conf import settings
from django.contrib.auth.models import (AbstractBaseUser, BaseUserManager,
PermissionsMixin)
from django.core.mail import send_mail
from django.db import models
from django.utils.translation import gettext_lazy as _
class Customer(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(_('email address'), unique=True)
name = models.CharField(max_length=150)
mobile = models.CharField(max_length=20, blank=True)
is_active = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
objects = CustomAccountManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['name']
class Meta:
verbose_name = "Accounts"
verbose_name_plural = "Accounts"
def email_user(self, subject, message):
send_mail(
subject,
message,
settings.EMAIL_HOST_USER,
[self.email],
fail_silently=False,
)
def __str__(self):
return self.name:
Представление для регистрации пользователя
from django.contrib import messages
from django.contrib.auth import login, logout
from django.contrib.auth.decorators import login_required
from django.contrib.sites.shortcuts import get_current_site
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404, redirect, render
from django.template.loader import render_to_string
from django.urls import reverse
from django.utils.encoding import force_bytes, force_str
from django.utils.http import urlsafe_base64_decode, urlsafe_base64_encode
from orders.models import Order
from orders.views import user_orders
from store.models import Product
from .forms import RegistrationForm, UserAddressForm, UserEditForm
from .models import Address, Customer
from .tokens import account_activation_token
def account_register(request):
if request.user.is_authenticated:
return redirect("account:dashboard")
if request.method == "POST":
registerForm = RegistrationForm(request.POST)
if registerForm.is_valid():
user = registerForm.save(commit=False)
user.email = registerForm.cleaned_data["email"]
user.set_password(registerForm.cleaned_data["password"])
current_site = get_current_site(request)
subject = "Activate your Account"
message = render_to_string(
"account/registration/account_activation_email.html",
{
"user": user,
"domain": current_site.domain,
"uid": urlsafe_base64_encode(force_bytes(user.pk)),
"token": account_activation_token.make_token(user),
},
)
user.email_user(subject=subject, message=message)
user.is_active = False
user.save()
return render(request, "account/registration/register_email_confirm.html", {"form": registerForm})
else:
registerForm = RegistrationForm()
return render(request, "account/registration/register.html", {"form": registerForm})