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 для отправки писем. Вы можете протестировать его или использовать.

Адрес и способ отправки письма можно посмотреть здесь.

Вернуться на верх