Django не отправляет электронную почту
Я столкнулся с проблемой, когда Django не отправляет письма на указанный адрес электронной почты. Буду очень признателен за помощь.
views.py
def register(request):
form = CreateUserForm()
if request.method == 'POST':
form = CreateUserForm(request.POST)
if form.is_valid():
user = form.save()
user.is_active = False
user.save()
current_site = get_current_site(request)
subject = 'Account verification email'
message = render_to_string('account/registration/email-verification.html', {
'user': user,
'domain': current_site.domain,
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'token': user_tokenizer_generate.make_token(user),
})
print(message)
user.email_user(subject=subject, message=message)
return redirect('email-verification-sent')
context = {'form':form}
return render(request, 'account/registration/register.html', context=context)
def email_verification(request, uidb64, token):
unique_id = force_str(urlsafe_base64_decode(uidb64))
user = User.objects.get(pk=unique_id)
if user and user_tokenizer_generate.check_token(user, token):
user.is_active = True
user.save()
return redirect('email-verification-success')
else:
return redirect('email-verification-failed')
token.py
from django.contrib.auth.tokens import PasswordResetTokenGenerator
class UserVerificationTokenGenerator(PasswordResetTokenGenerator):
def _make_hash_value(self, user, timestamp):
user_id = str(user.pk)
ts = str(timestamp)
is_active = str(user.is_active)
return f"{user_id}{ts}{is_active}"
user_tokenizer_generate = UserVerificationTokenGenerator()
settings.py
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = '587'
EMAIL_USE_TLS = 'True'
EMAIL_HOST_USER = 'XXX@gmail.com'
EMAIL_HOST_PASSWORD = 'XXX'
EMAIL_HOST_USER и EMAIL_HOST_PASSWORD верны. Я уже пробовал использовать SSL вместо TLS, отключить двухфакторную аутентификацию и удалить строку 'EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
В своих проектах я отправляю электронные письма следующим образом. Возможно, это будет полезно и для вас.
Шаг 1 :
Активировать аккаунт Gmail для отправителей электронной почты
Учетная запись электронной почты, используемая для отправки писем, должна иметь двухэтапную верификацию
Перейдите по следующему адресу, чтобы получить пароль для отправки электронной почты:
Аккаунт Gmail > Управление аккаунтом Google > Безопасность > Двухэтапная верификация > Пароли приложений
Создайте новое приложение
Получите свой 16-значный пароль
Шаг 2 :
settings.py
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_USE_TLS = True
EMAIL_PORT = 587
EMAIL_HOST_USER = '' # Sender's email
EMAIL_HOST_PASSWORD = '' # The password created for the sender's email
Шаг 3 :
# utils Package
# email_server.py
from django.core.mail import send_mail
from django.template.loader import render_to_string
from django.utils.html import strip_tags
from django.conf import settings
def send_email(subject, to, context, template_name):
html_message = render_to_string(template_name, context)
plain_message = strip_tags(html_message)
from_email = settings.EMAIL_HOST_USER
send_mail(subject, plain_message, from_email, [to], html_message=html_message)
Шаг 4 :
# views.py
send_email("Email Subject", 'Email recipient', {context}, "template_path")
Внимание
Обратите внимание, что в этом методе должен быть создан html-файл, и передайте этот файл как "путь_шаблона" этой функции.
Кроме того, я уже создал API для отправки писем. Вы можете протестировать его или использовать.
Адрес и способ отправки письма можно посмотреть здесь.