Активация учетной записи HTML-почтой в Django
У меня есть Django App, который позволяет пользователям регистрироваться в системе. После того, как пользователь зарегистрировался через форму, он получает письмо с активационной ссылкой. Приложение работает очень хорошо, но я хочу отправлять пользователю HTML письмо, а не только обычный текст. Я использую шаблон для предоставления полей для заполнения. Проблема, с которой я столкнулся, заключается в том, как указать uuid и токен в HTML шаблоне в ссылке активации.
Я читал о функции send_mail(), но не понимаю, как использовать ее для моей цели.
Я использую Django 3.2.8.
Покажите мой код:
myApp/urls.py
path('registro/<str:usuario>', views.registro, name='registro'),
path('activate/<uidb64>/<token>/', views.activate, name='activate'),
path('esperaconfirmacionregistro/', views.esperaConfirmacionRegistro, name='esperaconfirmacionregistro'),
path('confirmacionregistro/<str:status>', views.confirmacionRegistro, name='confirmacionregistro'),
acc_active_email.html
{% autoescape off %}
Saludos, {{user.first_name}} {{user.last_name}}.
Por favor da click en el enlace para confirmar tu registro,
http://{{ domain }}{% url 'activate' uidb64=uid token=token %}
{% endautoescape %}
views.py
def registro(request,usuario):
if request.method == 'POST':
form = FormularioAutoRegistro(request.POST, initial={'usuario':usuario})
if form.is_valid():
user = form.save()
current_site_info = get_current_site(request)
mail_subject = 'Activar cuenta de usuario'
message = render_to_string('myApp/acc_active_email.html', {
'user': user,
'domain': current_site_info.domain,
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'token': account_activation_token.make_token(user),
})
to_email = form.cleaned_data.get('email')
email = EmailMessage(mail_subject, message, to=[to_email])
email.send()
form = FormularioAutoRegistro(initial={'usuario':''})
return redirect('esperaconfirmacionregistro')
else:
form = FormularioAutoRegistro(initial={'usuario':usuario})
return render(request, 'myApp/registro.html', {'form': form})
def activate(request, uidb64, token):
user = get_user_model()
try:
uid = force_text(urlsafe_base64_decode(uidb64))
user = customuser.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()
return redirect('confirmacionregistro', status='confirm')
else:
return redirect('confirmacionregistro', status='fail')
def confirmacionRegistro(request, status):
titulo = ''
mensaje = ''
if status=='confirm':
titulo = 'Cuenta confirmada'
mensaje = 'Gracias por confirmar tu email.'
elif status=='fail':
titulo = 'Link inválido'
mensaje = 'El link de activación es inválido.'
else:
raise Http404
return render (request,'myApp/confirmacionregistro.html', {'titulo':titulo, 'mensaje':mensaje})
def esperaConfirmacionRegistro(request):
mensaje = "Autorización pendiente"
return render(request, 'myApp/esperaconfirmacionregistro.html', {'mensaje': mensaje})
Попробуйте использовать EmailMultiAlternatives
вместо EmailMessage
. Это довольно похоже:
from django.core.mail import EmailMultiAlternatives
mail = EmailMultiAlternatives("title", "content", "email_from@test.pl", ["email_to@test.pl"])
Тогда вы можете присоединить html
"альтернативу":
from django.urls import reverse
url = reverse('activate', kwargs={'uidb64': your_uidb64, 'token': your_token})
html_content = f"Link: <a href='{url}'>{url}</a>"
mail.attach_alternative(html_content, "text/html")
И отправьте его:
mail.send()
Наконец-то я решил свою проблему. NixonSparrow Вы правы, у меня был ответ:
def registro(request,usuario):
if request.method == 'POST':
form = FormularioAutoRegistro(request.POST, initial={'usuario':usuario})
if form.is_valid():
user = form.save()
current_site_info = get_current_site(request)
mail_subject = 'Activar cuenta de usuario'
to_email = form.cleaned_data.get('email')
nombre = user.first_name
apellidos = user.last_name
domain = current_site_info.domain
uid = urlsafe_base64_encode(force_bytes(user.pk))
token = account_activation_token.make_token(user)
url = f"http://{domain}/activate/{uid}/{token}"
content = f"Hola {nombre} {apellidos} \n" \
f"Por favor da click en el enlace o copialo y pégalo en el navegador para confirmar tu registro en el sistema: {url} \n" \
f"Gracias."
email = EmailMultiAlternatives(mail_subject, content, "pepe.eloy@gmail.com", [to_email])
html_content = f"Hola <strong>{nombre} {apellidos}</strong>. <br> <br>" \
f"Por favor da click en el enlace para confirmar tu registro en el sistema: <a href='{url}'>{url}</a> <br> <br>" \
f"Gracias."
email.attach_alternative(html_content, "text/html")
email.send()
form = FormularioAutoRegistro(initial={'usuario':''})
return redirect('esperaconfirmacionregistro')
else:
form = FormularioAutoRegistro(initial={'usuario':usuario})
return render(request, 'myApp/registro.html', {'form': form})