Как исправить ошибку кодировки в Django при попытке отправить электронное письмо

Я пытаюсь отправить письмо с подтверждением на новый зарегистрированный аккаунт в Django, но получаю ошибку кодировки, которую не знаю как исправить, пожалуйста, помогите мне исправить ее, чтобы я смог успешно проверить аккаунт

aaaaaaaaaaaaaaaa

if DEBUG:
        EMAIL_HOST = 'smtp.gmail.com'
        EMAIL_PORT = 587
        EMAIL_USE_TLS = True
        EMAIL_HOST_USER = 'jamelaumn@gmail.com'
        EMAIL_HOST_PASSWORD = xxxxx  # important
    else:
        EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

my urls.py:

path('register/', views.account_register, name='register'),

my views.py:

from django.template.loader import render_to_string
from django.utils.encoding import force_bytes
from django.utils.http import urlsafe_base64_decode, urlsafe_base64_encode
from django.core.mail import EmailMessage
from django.conf import settings
from django.template.loader import render_to_string

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'])
            user.is_active = False
            email_to = user.email
            user.save()
            email_subject = 'Ative sua conta'
            current_site = get_current_site(request)
            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),
            })

            email_body = message

            email = EmailMessage(
                email_subject,
                email_body,
                settings.EMAIL_HOST_USER, [email_to])
            email.send()
            return HttpResponse('registered succesfully and activation sent')
    else:
        registerForm = RegistrationForm()
    return render(request, 'account/registration/register.html', {'form': registerForm})


def account_activate(request, uidb64, token):
    try:
        uid = urlsafe_base64_decode(uidb64)
        user = UserBase.objects.get(pk=uid)
    except(TypeError, ValueError, OverflowError, user.DoesNotExist):
        user = None
    if user is not None and account_activation_token.check_token(user, token):
        user.is_active = True
        user.save()
        login(request, user)
        return redirect('account:dashboard')
    else:
        return render(request, 'account/registration/activation_invalid.html')

Ошибка в консоли

C:\Users\kayna\AppData\Local\Programs\Python\Python310\lib\smtplib.py", line 652, in auth authobject(challenge).encode('ascii'), eol='') AttributeError: 'int' object has no attribute 'encode' [25/May/2022 16:49:50] "POST /django-store-account/register/ HTTP/1.1" 500 92726

Поскольку ошибку выдает встроенная библиотека smtp python, это означает, что вы передаете неправильную кодировку. Согласно документации и сообщению об ошибке, она ожидает двоичную кодировку, но попытается преобразовать ее в ASCII, если получит строку.

Похоже, что где-то вы передаете int, но вместо того, чтобы искать кодировки, поскольку вы не используете никаких расширенных возможностей EmailMessage, вы должны быть в состоянии просто использовать метод, предоставляемый Django send_email

Итак, это должно сделать это

    mail.send_mail(subject = email_subject, message = message, 
                   from_email = settings.EMAIL_HOST_USER, [email_to], 
                   html_message=html_message)

В кодировке нет необходимости, вы можете просто использовать значения контекста в вашем шаблоне, как обычно, затем генерировать сообщение text/plain путем разделения HTML с помощью strip_tags, т.е. message = strip_tags(html_message)

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